iOS — калибровочные выступающие границы при изменении ориентации

#ios #swift #storyboard #constraints #calayer

Вопрос:

У меня есть простое CustomView . У меня есть CAGradientLayer то, что я добавляю к этому layer .

 @IBDesignable
class CustomView: UIView {
    
    override init (frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        setupView()
    }
    
    private func setupView() {
        let gradient = CAGradientLayer()

        gradient.frame = bounds
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]

        layer.insertSublayer(gradient, at: 0)
    }
}
 

Ниже Storyboard приведена настройка

введите описание изображения здесь

Ниже приведен результат в портретном режиме на iPad, что вполне нормально.

введите описание изображения здесь

Когда ориентация устройства изменяется, слой CustomView выступает за его границы.

введите описание изображения здесь

Когда я проверил иерархию представлений в Xcode, рамка соответствующим CustomView образом настроена, но это выступающий слой. Чтобы перепроверить, я удалил все коды setupView и установил только цвет фона, при изменении ориентации CustomView , как и ожидалось. Но почему это происходит для слоев?

Ответ №1:

Вы вставляете новый слой каждый раз при layoutSubviews вызове метода. Это означает, что он показывает линию первого слоя.

Просто обновите кадр с layoutSubviews и вызовите метод настройки с awakeFromNib .

 class CustomView: UIView {
    private let gradient = CAGradientLayer()
    
    override init (frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        gradient.frame = bounds
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        setupView()
    }
    
    private func setupView() {
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
        
        layer.insertSublayer(gradient, at: 0)
    }
}

 

Комментарии:

1. Спасибо, что указали на это!!