Разве layoutSubviews не должен вызываться только один раз за кадр? - PullRequest
1 голос
/ 17 марта 2020

Я думал, что view.layoutSubviews() вызывается один раз за кадр, чтобы избежать слишком много вычислений макета. Вот и вся причина существования view.setNeedsLayout(). Так что вы можете вызывать view.setNeedsLayout() много раз, в том числе много раз за кадр, но он вычисляется только один раз. Вот почему у вас также есть второй метод, view.layoutIfNeeded(), который немедленно вычисляет макет.

Это не то, что здесь происходит:

class MyViewController: UIViewController {

var time = Date().timeIntervalSince1970

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


    Timer.scheduledTimer(withTimeInterval: 0.001, repeats: true) { (timer) in
        self.view.setNeedsLayout()
        print("hello")
    }

}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let newDate = Date().timeIntervalSince1970
    print("Layout called at time: \(newDate - time)")
    time = newDate
}

}

Что здесь происходит "Вызов, вызванный во время ...", вызывается с интервалами 0,001.

1 Ответ

2 голосов
/ 17 марта 2020

Это не один раз за кадр, это один раз за итерацию run-l oop. Поскольку ваше приложение на самом деле ничего не делает, это будет примерно так же быстро, как ваш интервал.

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