KVO не работает для ключевого пути `UIView.bounds`, когда изменение размера представления происходит из-за` autoresizingmask` - PullRequest
1 голос
/ 28 апреля 2020

У меня есть следующий контроллер вида:

class ViewController: UIViewController {

  lazy var superView: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    view.backgroundColor = UIColor.white
    return view
  }()

  lazy var childView: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
    view.backgroundColor = UIColor.black
    return view
  }()

  var boundObservation: NSKeyValueObservation?

  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.orange

    self.view.addSubview(self.superView)
    self.superView.center = CGPoint(
      x: self.view.frame.width / 2.0,
      y: self.view.frame.height / 2.0
    )

    self.superView.addSubview(self.childView)
    self.childView.center = CGPoint(
      x: self.superView.frame.width / 2.0,
      y: self.superView.frame.height / 2.0
    )
    self.childView.autoresizingMask = .flexibleWidth

    let button = UIButton(type: .system)
    button.setTitle("Tap me!", for: .normal)
    button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
    self.view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    button.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -24).isActive = true

    self.boundObservation = self.childView.observe(
      \UIView.bounds,
      options: .new,
      changeHandler: { view, change in
        print(change.newValue ?? "nil")
    })
  }

  @objc func buttonTapped(_ sender: UIButton) {
    let view = self.superView
    let previousSize = view.bounds.size
    view.bounds.size = CGSize(width: previousSize.width + 50, height: previousSize.height + 20)
  }
}

Мой childView get автоматически изменяет размер из-за маски авторазмера при изменении размера superView. Но наблюдение КВО не вызывается. Почему КВО не работает в этом случае?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Моя проблема была решена путем наблюдения \.layer.bounds вместо \UIView.bounds, потому что я узнал, что слой является «источником правды» для макета представления, поэтому я подозревал, что маска авторазмера изменяла границы слоя напрямую, не проходя через UIView.bounds

0 голосов
/ 28 апреля 2020

Вы можете сделать это так

private var observer: NSKeyValueObservation?

override func viewDidLoad() {
    super.viewDidLoad()
    observer = view.observe(\.bounds) { object, _ in
        print(object.bounds)
    }
    // ...
}
override func viewWillDisappear(_ animated: Bool) {
    observer?.invalidate()
    //...
}
...