Фрейм вида вызывается дважды и вызывает ошибку отсечения - PullRequest
0 голосов
/ 28 марта 2019

У меня есть базовый UIView, у которого есть visualEffectView в качестве подпредставления. Я устанавливаю для visualEffectView view frame.height значение 80. При представлении ViewController я хочу сбросить его высоту до 120. В настоящее время, когда она отображается, высота изначально составляет 120, но затем быстро обрезается до 80. Не должен ли мой кадр мой ViewController переопределить набор кадров в UIView? Мой фрейм в ViewController вызывается первым, но позже он вызывается из UIView, вызывая ошибку отсечения.

class CardView: UIView {

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))

override init(frame: CGRect) {
    super.init(frame: frame)
    clipsToBounds = true
    addSubview(visualEffectView)
}

override func layoutSubviews() {
    super.layoutSubviews()

    visualEffectView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 80)

  }
}

class ViewController: ViewController {

let cardView: CardView = {
    let cv = CardView()
    cv.imageView.clipsToBounds = true
    cv.layer.cornerRadius = 18
    return cv
}()

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let superviewFrame = view.frame.height
    cardView.frame = CGRect(x: 10, y: superviewFrame / 8, width: view.frame.width - 20, height: superviewFrame - (superviewFrame / 5))
    cardView.visualEffectView.anchor(top: cardView.topAnchor, left: cardView.leftAnchor, bottom: nil, right: cardView.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 120)     
  }
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вам может понадобиться условие охраны, и если есть ограничение, просто пройдите.

    override func layoutSubviews() {
    super.layoutSubviews()

    guard visualEffectView.constraintsAffectingLayout(for: .vertical).count == 0 else  {return}. // Here

    visualEffectView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 80)
}
0 голосов
/ 28 марта 2019

попробуйте переместить этот код

visualEffectView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 80)

из override func layoutSubviews() { в override init(frame: CGRect) {

после super.init()

...