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
}