Причина, по которой выбранный вид является прозрачным, заключается в том, что подпредставление UIPickerView
, которое содержит весь контент, использует CAGradientLayer
в качестве маски для достижения эффекта глубины. По какой-то причине Apple решила сделать выбранный вид прозрачным. Мы не можем просто избавиться от этой маски, потому что мы потеряем этот причудливый эффект. Поэтому нам нужно больше узнать об этом градиенте.
Вот как выглядит этот градиент. Я добавил значения альфа-канала, чтобы вы могли видеть, как ведет себя этот градиент.
Как видите, у него 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]
}
}
}
Надеюсь, это поможет вам.