UITextField 占位符文本在 iOS13 深色模式下不可读

UITextField placeholder text is unreadable in iOS13 dark mode

UITextField 有一个 .placeholder 文本 属性,用于在文本添加到字段之前显示信息,直到现在它始终清晰可见,但在 iOS13 黑暗中引入了模式,现在占位符文本在白色 UITextField 中几乎不可读(我通过 .backgroundColor = [UIColor whiteColor] 明确将其设为白色)。

我的问题是,在我的整个项目中有哪些实用的解决方案可以解决这个问题,我可以手动更改任何 UITextField 上的占位符颜色,只需设置一个 attributedPlaceholder 字符串,这可能需要一段时间,有没有办法专门针对 UITextFields 而不是针对其他元素禁用暗模式设置?

事实证明,Apple 提供了一种方法,可以在各种元素(甚至整个应用程序的 UIWindow)上使用以下方法覆盖它 (Objective-C):

if (@available(iOS 13.0, *)) {
    textField.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

我通过 swizzle 将它应用于所有 UITextFields,要在你的项目中的所有东西上关闭它,只需在你的 appDelegate didFinishLaunching 方法中使用它,但将 textField 替换为 _window

(重要编辑: 最新版本的 xCode _window 似乎已被删除,现在应用程序项目创建了一个名为 SceneDelegate 的东西,并且overrideUserInterfaceStyle 必须以某种方式应用于此,但我是场景代表的新手,不知道它们是如何工作的,所以我不能在那里提供太多帮助,以禁用 scenedelegate 和 return 到传统AppDelegate管理UIWindow,看这里:)

在swift 将以下代码粘贴到 appdelegate 文件

if #available(iOS 13.0, *) {
            window!.overrideUserInterfaceStyle = .light
        }

它将正常工作。

我会考虑不明确将文本字段背景设置为白色。

您可以使用此处描述的 UI 元素颜色更强大地​​支持深色和浅色模式:https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors

对于我的一个文本字段,我做了这样的事情:

if #available(iOS 13, *) {
    self.searchBarTextField.textColor = UIColor.label
    self.searchBarTextField.backgroundColor = UIColor.secondarySystemBackground
} else {
    self.searchBarTextField.backgroundColor = UIColor(white: 1.0, alpha: 1.0)
}

从上面的代码来看,现在当用户更改他们的明暗模式设置时,文本字段的背景将动态变化。并且文字颜色会随之改变。占位符文本颜色将由 OS 处理。如果需要,您可以覆盖:https://developer.apple.com/documentation/uikit/uicolor/3173134-placeholdertext

如果您不想强制整个应用程序进入轻量级模式,这是最简单的方法

您只需将 placeholderTextColor 添加到您的 TextInput 组件

适合我✌️