CAGradientLayer авторотация - PullRequest
0 голосов
/ 27 января 2019

Я использую CAGradientLayer для создания этого градиента тонкой линии.Проблема в том, что авторотация не гладкая.Поскольку UIViewController вращается, я устанавливаю кадр этого представления, содержащего этот слой, в viewDidLayoutSubviews и сбрасываю кадр этого слоя.Линия увеличивается в высоту по мере того, как я автоматически поворачиваюсь, и градиент в течение некоторого времени вращается сверху вниз.Как правильно сделать этот слой?

enter image description here

1 Ответ

0 голосов
/ 27 января 2019

Я бы предложил выйти из дела настройки подслоя в viewDidLayoutSubviews.Вместо этого я бы позволил авто макету сделать это за вас.

  • Сначала определите GradientView, который будет отображать CAGradientLayer:

    class GradientView: UIView {
        // specify that the base layer should be gradient layer
    
        override class var layerClass: AnyClass {
            return CAGradientLayer.self
        }
    
        // it can be convenient to have computed property that returns layer of the `layerClass`
    
        private var gradientLayer: CAGradientLayer {
            return layer as! CAGradientLayer
        }
    
        // when we update our array of colors, update the gradient layer accordingly
    
        var colors: [UIColor] = [] {
            didSet {
                gradientLayer.colors = colors.map { $0.cgColor }
            }
        }
    
        // initializers
    
        override init(frame: CGRect = .zero) {
            super.init(frame: frame)
            configure()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            configure()
        }
    
        // configure the view for horizontal gradient
    
        private func configure() {
            colors = [.red, .yellow, .green, .blue]
            gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
        }
    }
    

    УказавlayerClass этого подпредставления, вам не нужно беспокоиться об изменении размера вопросов.Измените размер представления по мере необходимости, и слой автоматически изменится соответствующим образом.

  • Затем просто добавьте ограничения для вашего нового вида и позвольте авторазметке позаботиться о конфигурации.Например,

    let gradientView = GradientView()
    gradientView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(gradientView)
    
    NSLayoutConstraint.activate([
        gradientView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10),
        gradientView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
        gradientView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
        gradientView.heightAnchor.constraint(equalToConstant: 3)
    ])
    

Теперь четко используйте любые ограничения, которые вам подходят, но, надеюсь, это иллюстрирует идею.Пусть auto layout сконфигурирует frame вида, и пусть, поскольку layerClass равен CAGradientLayer, он будет обновляться автоматически для вас.

...