UIPickerView 上奇怪的自定义背景颜色 Swift
Strange Custom Background Color on UIPickerView Swift
我在为 UIPickerViews 的背景指定自定义 UIColor 时出现奇怪的颜色。我为 textViews 和 pickerViews 创建了如下颜色:
let myTextViewBackgroundColor = UIColor(red: 192.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 0.35)
我将其分配为:
myTextView.backgroundColor = myTextViewBackgroundColor
keywordPicker.backgroundColor = myTextViewBackgroundColor
这是它的样子:
如您所见,textViews 的颜色和选择器的颜色不同。设备上的差异似乎比这张快照中的更明显,但自定义颜色看起来很浑浊,几乎就像是与默认的灰色背景混合在一起。
如果我注释掉上面的 pickerView 颜色项,我得到一个灰色背景:
如果我选择标准的 UIColor,它似乎可以正常工作。 UIColor.yellowColor 在这种情况下。如果我选择白色,那也很好看。
我在代码中创建了 pickerView 并将其分配给未分配背景颜色的 textField。
var keywordPicker : UIPickerView?
keywordPicker = UIPickerView()
keywordPicker?.delegate = self
keywordPicker?.dataSource = self
keywordsForItemTextField.inputView = keywordPicker
keywordPicker.backgroundColor = myTextViewBackgroundColor
为了它的价值,我有一个日期选择器,我将它创建为一个带有自己的视图控制器的模态屏幕。在这种情况下,选择器是在故事板上创建的。我仍然使用代码分配我的背景颜色,并且选择器显示正确的颜色。
我很确定这是因为 UIPickerView 始终在其上设置银灰色过滤器(请注意当您将其设置为白色时它是灰色的?)
此回复并未揭示问题的原因,但我已包含我的解决方案以防对其他人有所帮助。我为选定的行显示创建了一个标签,并设置了标签的背景颜色。此标签颜色符合自定义设置。
我点头制作 App Pie 和文章 https://makeapppie.com/2014/10/21/swift-swift-formatting-a-uipickerview/
这是灵感。将背景设置为白色:
keywordPicker?.backgroundColor = UIColor.whiteColor()
我还添加了边框,因此选择器看起来像我创建的 textView:
keywordPicker?.layer.borderColor = UIColor(colorLiteralRed: 212.0/255.0, green: 212.0/255.0, blue: 212.0/255.0, alpha: 1.0).CGColor
keywordPicker?.layer.borderWidth = 1.0
keywordPicker?.layer.cornerRadius = 7.0
keywordPicker?.layer.masksToBounds = true
设置标签:
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
let pickerLabel = UILabel()
var titleData : String = String()
if pickerView == keywordPicker {
titleData = crsuKeywordPickerList![row]
}
pickerLabel.text = titleData
pickerLabel.backgroundColor = myPickerBackgroundColor
pickerLabel.textAlignment = .Center
return pickerLabel
}//pickerView:viewForRow:...
The result:
As a second option as discussed above, if you instantiate the picker on the storyboard this problem does not appear.
在我们的例子中,我们有一个围绕 UIPickerView
的包装器来构建自定义日期选择器。将 UITextField
class 的外观代理设置为 inputView
使用暗模式后,如果第一个激活的 textField
是带有自定义选择器的,我们会遇到相同的故障如 inputView
,但如果用户之前使用 普通键盘 与 textField 交互,则不会出现 inputView
故障。
在我们的特殊情况下,将此 hack 添加到包装器视图可解决问题:
- (void)willMoveToWindow:(UIWindow *)newWindow
{
[super willMoveToWindow:newWindow];
if (newWindow) {
self.pickerView.backgroundColor = self.colorPalette.inputViewBackgroundColor;
}
}
我们也试过在 willMoveToSuperview:
方法中设置颜色,但那不起作用。
在里面写下你的背景颜色变化代码:-
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == self.tourtextfieldtextField {
//for background color of picker
datePickerView.backgroundColor = .red
//text color of picker
datePickerView.setValue( colorLiteral(red: 0, green: 0.5529411765, blue: 0.537254902, alpha: 1), forKeyPath: "textColor")
datePickerView.setValue(0.8, forKeyPath: "alpha")
}
}
tkanzakic 的回答终于让我改变了 UIDatePicker 的背景颜色。
这是 Swift 4 版本:
class CustomDatePicker: UIDatePicker {
var customBackgroundColor = UIColor.black
override func willMove(toWindow newWindow: UIWindow?) {
super.willMove(toWindow: newWindow)
if newWindow != nil {
inputView?.backgroundColor = customBackgroundColor
}
}
}
根据自己的喜好更改自定义背景颜色属性。
swift 4.2 / xcode 10:
需要在主线程中设置背景颜色:
DispatchQueue.main.async {
keywordPicker.backgroundColor = myTextViewBackgroundColor
}
我在为 UIPickerViews 的背景指定自定义 UIColor 时出现奇怪的颜色。我为 textViews 和 pickerViews 创建了如下颜色:
let myTextViewBackgroundColor = UIColor(red: 192.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 0.35)
我将其分配为:
myTextView.backgroundColor = myTextViewBackgroundColor
keywordPicker.backgroundColor = myTextViewBackgroundColor
这是它的样子:
如果我注释掉上面的 pickerView 颜色项,我得到一个灰色背景:
var keywordPicker : UIPickerView?
keywordPicker = UIPickerView()
keywordPicker?.delegate = self
keywordPicker?.dataSource = self
keywordsForItemTextField.inputView = keywordPicker
keywordPicker.backgroundColor = myTextViewBackgroundColor
为了它的价值,我有一个日期选择器,我将它创建为一个带有自己的视图控制器的模态屏幕。在这种情况下,选择器是在故事板上创建的。我仍然使用代码分配我的背景颜色,并且选择器显示正确的颜色。
我很确定这是因为 UIPickerView 始终在其上设置银灰色过滤器(请注意当您将其设置为白色时它是灰色的?)
此回复并未揭示问题的原因,但我已包含我的解决方案以防对其他人有所帮助。我为选定的行显示创建了一个标签,并设置了标签的背景颜色。此标签颜色符合自定义设置。
我点头制作 App Pie 和文章 https://makeapppie.com/2014/10/21/swift-swift-formatting-a-uipickerview/ 这是灵感。将背景设置为白色:
keywordPicker?.backgroundColor = UIColor.whiteColor()
我还添加了边框,因此选择器看起来像我创建的 textView:
keywordPicker?.layer.borderColor = UIColor(colorLiteralRed: 212.0/255.0, green: 212.0/255.0, blue: 212.0/255.0, alpha: 1.0).CGColor
keywordPicker?.layer.borderWidth = 1.0
keywordPicker?.layer.cornerRadius = 7.0
keywordPicker?.layer.masksToBounds = true
设置标签:
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
let pickerLabel = UILabel()
var titleData : String = String()
if pickerView == keywordPicker {
titleData = crsuKeywordPickerList![row]
}
pickerLabel.text = titleData
pickerLabel.backgroundColor = myPickerBackgroundColor
pickerLabel.textAlignment = .Center
return pickerLabel
}//pickerView:viewForRow:...
The result:
As a second option as discussed above, if you instantiate the picker on the storyboard this problem does not appear.
在我们的例子中,我们有一个围绕 UIPickerView
的包装器来构建自定义日期选择器。将 UITextField
class 的外观代理设置为 inputView
使用暗模式后,如果第一个激活的 textField
是带有自定义选择器的,我们会遇到相同的故障如 inputView
,但如果用户之前使用 普通键盘 与 textField 交互,则不会出现 inputView
故障。
在我们的特殊情况下,将此 hack 添加到包装器视图可解决问题:
- (void)willMoveToWindow:(UIWindow *)newWindow
{
[super willMoveToWindow:newWindow];
if (newWindow) {
self.pickerView.backgroundColor = self.colorPalette.inputViewBackgroundColor;
}
}
我们也试过在 willMoveToSuperview:
方法中设置颜色,但那不起作用。
在里面写下你的背景颜色变化代码:-
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == self.tourtextfieldtextField {
//for background color of picker
datePickerView.backgroundColor = .red
//text color of picker
datePickerView.setValue( colorLiteral(red: 0, green: 0.5529411765, blue: 0.537254902, alpha: 1), forKeyPath: "textColor")
datePickerView.setValue(0.8, forKeyPath: "alpha")
}
}
tkanzakic 的回答终于让我改变了 UIDatePicker 的背景颜色。
这是 Swift 4 版本:
class CustomDatePicker: UIDatePicker {
var customBackgroundColor = UIColor.black
override func willMove(toWindow newWindow: UIWindow?) {
super.willMove(toWindow: newWindow)
if newWindow != nil {
inputView?.backgroundColor = customBackgroundColor
}
}
}
根据自己的喜好更改自定义背景颜色属性。
swift 4.2 / xcode 10:
需要在主线程中设置背景颜色:
DispatchQueue.main.async {
keywordPicker.backgroundColor = myTextViewBackgroundColor
}