我正在尝试使用自定义设计实现UIPickerView
。我在UIVIew
里面拿了一个UIPickerView
,在我的UIVIew
里面贴了一个标签。我的选择器背景的颜色是黑色的,现在我正在尝试将白色背景颜色应用于UIVIew
并在View中标记。但颜色并不是我想要的。我想要纯白色,但它会变灰。任何人都可以帮助我吗?
这是我的代码和输出:
if pickerView == pkr1 {
let myView = UIView(frame: CGRect(x: 5, y: 0, width: pickerView.bounds.width - 10, height: Utilities.isDeviceiPad() ? 80.0 : 60.0))
myView.backgroundColor = UIColor.white
myView.isOpaque = false
let myLabel = UILabel(frame: CGRect(x: 5, y: 0, width: myView.bounds.width - 10, height: myView.frame.height))
myLabel.text = arrTemp[row]
// myLabel.center.y = myView.center.y
myLabel.textAlignment = .center
myLabel.numberOfLines = 2
myLabel.backgroundColor = UIColor.white
myLabel.alpha = CGFloat(1)
myLabel.lineBreakMode = NSLineBreakMode.byTruncatingTail
myView.addSubview(myLabel)
return myView
}
输出:
请通过以下方法在选择器视图中添加您的视图并检查它...希望它能工作..
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
let myView = UIView(frame: CGRect(x: 5, y: 0, width: pickerView.bounds.width - 10, height: Utilities.isDeviceiPad() ? 80.0 : 60.0))
myView.backgroundColor = UIColor.white
myView.isOpaque = false
let myLabel = UILabel(frame: CGRect(x: 5, y: 0, width: myView.bounds.width - 10, height: myView.frame.height))
myLabel.text = arrTemp[row]
// myLabel.center.y = myView.center.y
myLabel.textAlignment = .center
myLabel.numberOfLines = 2
myLabel.backgroundColor = UIColor.white
myLabel.alpha = CGFloat(1)
myLabel.lineBreakMode = NSLineBreakMode.byTruncatingTail
myView.addSubview(myLabel)
return myView
}
所选视图透明的原因是,包含所有内容的UIPickerView
子视图使用CAGradientLayer
作为蒙版来实现深度效果。出于某种原因,Apple决定使选定的视图也透明。我们不能简单地摆脱那个面具,因为我们会失去那种奇特的效果。所以我们需要弄清楚有关该梯度的更多信息。
这是这个渐变的样子。我已添加了Alpha通道值,因此您可以看到此渐变的行为方式。
正如你所看到的,它有6种颜色,除了中间的两个值外,一切都很好。他们是0.8
而不是1.0
,这使你选择的视图透明。
这是一个非常糟糕的方法,我强烈建议不要这样做,但如果你需要使你选择的项目不透明,你可以简单地创建你UIPickerView
的子类并改变这样的渐变。
class MyPickerView: UIPickerView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
self.changeGradientLayer()
}
func changeGradientLayer() {
guard let sublayers = self.subviews.first?.layer.sublayers else { return }
for case let sublayer as CAGradientLayer in sublayers {
sublayer.colors = [UIColor.black.withAlphaComponent(0).cgColor,
UIColor.black.withAlphaComponent(0.71).cgColor,
UIColor.black.withAlphaComponent(1.0).cgColor,
UIColor.black.withAlphaComponent(1.0).cgColor,
UIColor.black.withAlphaComponent(0.71).cgColor,
UIColor.black.withAlphaComponent(0).cgColor]
}
}
}
希望它能帮到你。