我在一个ViewController中使用了UIDatePicker。如图所示,背景是黑色的。
我已经成功将文本颜色改为白色,但是我无法更改所选日期上下两条线的颜色,它们始终保持默认的深灰色。是否有任何代码片段可以实现对这些线条进行着色?
我在一个ViewController中使用了UIDatePicker。如图所示,背景是黑色的。
我已经成功将文本颜色改为白色,但是我无法更改所选日期上下两条线的颜色,它们始终保持默认的深灰色。是否有任何代码片段可以实现对这些线条进行着色?
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")
}
datePicker.subviews[0].subviews[1].backgroundColor = UIColor.redColor()
datePicker.subviews[0].subviews[2].backgroundColor = UIColor.redColor()
我不得不为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
}
}
}
使用IB可以很简单地完成。只需用高度为1的2个UiView,宽度与UIDatePicker相等。然后在垂直和水平方向上将其与UIDatePicker居中对齐。对于上部线条,将垂直偏移设置为18,另一个则设置为-18。完成!
是的,这是一种不安全的方法。但作为一个选项,为什么不呢。
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})