如何更改UIDatePicker的线条颜色

7

我在一个ViewController中使用了UIDatePicker。如图所示,背景是黑色的。

我的UIDatePicker图片

我已经成功将文本颜色改为白色,但是我无法更改所选日期上下两条线的颜色,它们始终保持默认的深灰色。是否有任何代码片段可以实现对这些线条进行着色?


1
保持这样,看起来很性感 :) - Thomas
5个回答

11

huniser_suraj的答案是正确的,只需为将来的更改使用额外检查,以下是我在UIPickerView & UIDatePicker上使用的方式:

    for subview in self.picker.subviews {

        if subview.frame.height == 1 {

            subview.backgroundColor = UIColor.whiteColor()
        }
    }

    if let pickerView = self.datePicker.subviews.first {

        for subview in pickerView.subviews {

            if subview.frame.height == 1 {

                subview.backgroundColor = UIColor.whiteColor()
            }
        }
    }

iOS 10更新

从iOS 10开始,这个方法不再起作用,正如一些评论中所提到的那样。即找到子视图并访问它们是可以实现的,但设置背景颜色的方法不再有效。我使用了另一种“不太好”的解决办法,即设置带有边框颜色的边框来替代背景颜色。

    for subview in self.picker.subviews {

        if subview.frame.height <= 5 {

            subview.backgroundColor = UIColor.white
            subview.tintColor = UIColor.white
            subview.layer.borderColor = UIColor.white.cgColor
            subview.layer.borderWidth = 0.5            }
    }

    if let pickerView = self.datePicker.subviews.first {

        for subview in pickerView.subviews {

            if subview.frame.height <= 5 {

                subview.backgroundColor = UIColor.white
                subview.tintColor = UIColor.white
                subview.layer.borderColor = UIColor.white.cgColor
                subview.layer.borderWidth = 0.5
            }
        }
        self.datePicker.setValue(UIColor.white, forKey: "textColor")
    }

1
如果您删除较小的视图并添加自己的替代品,它也可以正常工作。 - odyth

1
首先,苹果文档关于“日期选择器”表示:“您无法自定义日期选择器的外观。”
话虽如此,以下代码正是您所需。我明白它不是最优雅的代码,但在这里它就是这样。
datePicker.subviews[0].subviews[1].backgroundColor = UIColor.redColor()
datePicker.subviews[0].subviews[2].backgroundColor = UIColor.redColor()

UIDatePicker有一个子视图UIDatePickerView,它有3个子视图,其中后两个是指示选择行的两行。

5
这是危险的代码。它对子视图结构作出了假设。如果那些假设改变了,这段代码就会崩溃。 - rmaddy
1
感谢您提供的解决方案。但是,有没有更好(不危险)的方法来着色这些行? - LeMark88
1
在 iOS 10 上进行测试,这个不起作用,你能确认一下吗? - Bartu
@Bartu 这基本上就是rmaddy在他/她的评论中所说的:如果更改了代码,上面的代码将无法正常工作。iOS 10 必须带来了一些破坏上述代码的变化。 - SrB
@Bartu看看我下面的解决方案。 - Kex
@Kex 感谢您的更新。作为一种解决方法,我在每个分隔符上方添加了一个具有精确大小和正确起点的 UIView,这看起来也很好 :) - Bartu

1

我不得不为datePicker更改高度约束,因此@kex代码对我无效。所以我进行了修改:(适用于我在swift 5和iOS 12上)

if let _pickerView = self.datePicker.subviews.first {
    for _subview in _pickerView.subviews {
        if (_subview.backgroundColor != nil) {
            _subview.backgroundColor = UIColor.white
            _subview.tintColor = UIColor.white
            _subview.layer.borderColor = UIColor.white.cgColor
            _subview.layer.borderWidth = 1
        }
    }
}

1

使用IB可以很简单地完成。只需用高度为1的2个UiView,宽度与UIDatePicker相等。然后在垂直和水平方向上将其与UIDatePicker居中对齐。对于上部线条,将垂直偏移设置为18,另一个则设置为-18。完成!


0

是的,这是一种不安全的方法。但作为一个选项,为什么不呢。

 if #available(iOS 13.0, *) {
    datePicker.setValue(UIColor.red, forKey: "magnifierLineColor")
    }

更安全的解决方案:
extension UIView {

 func findViews<T: UIView>(subclassOf: T.Type) -> [T] {
    return recursiveSubviews.compactMap { $0 as? T }
 }

 var recursiveSubviews: [UIView] {
    return subviews + subviews.flatMap { $0.recursiveSubviews }
 }

}

self.datePicker.findViews(subclassOf: UIView.self)
            .makeIterator()
            .lazy
            .filter({$0.bounds.height <= 1 && $0.bounds.width == self.datePicker.bounds.width})
            .prefix(2)
            .forEach({$0.backgroundColor = UIColor.red})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接