UIDatePicker 在 iOS9 RTL 上翻转

UIDatePicker Flips on iOS9 RTL

在 RTL 上显示 DatePicker - 时间模式时我遇到了一个奇怪的问题。

我正在以编程方式显示日期选择器。 分钟应该在右边,小时在左边,在下图中你可以看到它被翻转了:

它发生在 iOS 9 及以上。

我使用的代码:

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height+44, self.view.frame.size.width, 216)];
datePicker.tag = tag;
[datePicker setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
[datePicker setDatePickerMode:UIDatePickerModeTime];
[datePicker setBackgroundColor:[UIColor whiteColor]];
[datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:datePicker];

有什么建议吗?

我认为这是您设置 .ForceRightToLeftUIViewappearance 代理的副作用。

如果是这种情况,请注意这不是受支持的用例。您的应用只有在满足以下条件时才应处于 RTL 模式:

a) 本地化为 RTL 语言,并且

b) 设备的系统语言设置为该语言。

在这种情况下,它是导致问题的子视图之一。 在所有选择器子视图上强制从左到右将为您解决这个问题。

我通过在每个日期选择器子视图上强制 forceRightToLeft 解决了这个问题。

尝试以下操作,它应该有效:

override func viewDidLayoutSubviews() {
    for currentView in datePicker.subviews {
        currentView.semanticContentAttribute = .forceRightToLeft
    }
} 

您可以强制所有 UIDatePicker 类 来自 AppDelegate 的 RTL。

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
    [[UIView appearanceWhenContainedIn:[UIDatePicker class], nil] setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];
}

AppDelegate.swift中输入以下代码:

UIPickerView.appearance().semanticContentAttribute = .forceLeftToRight