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
组件
适合我✌️
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
组件
适合我✌️