Цвет фона UIVIew внутри UIPickerView установлен неправильно - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь реализовать UIPickerView с индивидуальным дизайном. Я взял UIVIew внутри UIPickerView и ярлык внутри UIVIew. Цвет моего фона выбора черный, и теперь я пытаюсь применить белый цвет фона к UIVIew и надписать его в представлении. Но цвет не то, что я хочу. Я хочу чистый белый цвет, но он возвращается серым. Может ли кто-нибудь помочь мне в этом?

Вот мой код и вывод:

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
}

enter image description here

Выход:

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Причина, по которой выбранный вид является прозрачным, заключается в том, что подпредставление UIPickerView, которое содержит весь контент, использует CAGradientLayer в качестве маски для достижения эффекта глубины. По какой-то причине Apple решила сделать выбранный вид прозрачным. Мы не можем просто избавиться от этой маски, потому что мы потеряем этот причудливый эффект. Поэтому нам нужно больше узнать об этом градиенте.

Вот как выглядит этот градиент. Я добавил значения альфа-канала, чтобы вы могли видеть, как ведет себя этот градиент.

UIPickerView gradient layer mask

Как видите, у него 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]
        }
    }

}

Надеюсь, это поможет вам.

0 голосов
/ 10 сентября 2018

Пожалуйста, добавьте свой вид в окне выбора нижеуказанным способом и проверьте его ... надеюсь, он будет работать ..

 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

}
...