Ни один из приведенных выше ответов не работал у меня полностью, кроме viewDidLoad, но у него есть побочный эффект: не отображается то, что я хочу, до тех пор, пока представление не анимируется, что выглядит плохо.
viewDidLayoutSubviews должен быть правильным местом для запуска кода, который зависит от завершения автомакета, но, как указывали другие, он вызывается несколько раз в последних версиях iOS, и вы не можете знать, какой вызов является последним. .
Поэтому я решил это с помощью небольшого взлома. В моей раскадровке mySubview должно быть меньше, чем self.view. Но когда viewDidLayoutSubviews вызывается впервые, mySubview по-прежнему имеет ширину 600, в то время как self.view кажется установленным правильно (это проект для iPhone). Так что все, что мне нужно сделать, это отслеживать последующие вызовы и проверять относительную ширину. Когда mySubview меньше, чем self.view, я могу быть уверен, что он расположен правильно.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if self.mySubview.bounds.size.width < self.view.bounds.size.width {
// mySubview's width became less than the view's width, so it is
// safe to assume it is now laid out correctly...
}
}
Преимущество этого заключается в том, что он не зависит от жестко закодированных чисел, поэтому он может работать, например, на всех форм-факторах iPhone. Конечно, это не может быть панацеей во всех случаях и на всех устройствах, но, вероятно, есть много оригинальных способов сделать подобные проверки относительных размеров.
И нет, мы не должны этого делать, но пока Apple не предоставит нам несколько более надежных обратных вызовов, мы все застряли с этим.
person
Echelon
schedule
04.11.2015