Подтвердить что ты не робот

Неправильный размер кадра в viewDidLoad

Возможный дубликат:
Почему мне приходится вручную устанавливать рамки представления в viewDidLoad?

У меня есть универсальное приложение для iphone и ipad, две раскадровки, если я запускаю свое приложение на симуляторе iphone в viewDidLoad, каждый кадр каждого элемента в nib правилен. Но если я делаю это для ipad (симулятор) в кадре, то нуль, но экран выглядит правильно. Не могли бы вы посоветовать мне что-нибудь? Спасибо.

4b9b3361

Ответ 1

Это очень похожий вопрос на ios setContentOffset не работает на iPad... И мой ответ такой же, как и там:

"Вы не должны инициализировать объекты, связанные с геометрией пользовательского интерфейса, в viewDidLoad, потому что геометрия вашего представления не установлена ​​в этой точке, и результаты будут непредсказуемыми.

... viewWillAppear: - это правильное место для выполнения этих задач, на этом этапе геометрия задается так, что получение и установка свойств, связанных с геометрией, имеет смысл ".

Это также относится к свойствам, связанным с геометрией. Не отвлекайтесь на то, чтобы вести себя правильно в одном случае, а не в другом... Главное, что установка/получение свойств геометрии слишком рано приведет к непредсказуемым результатам.

Ваш экран выглядит правильно, потому что вы видите результаты после viewWillAppear:/viewDidAppear:.

update (ios6)

При использовании автозапуска в ios6 кадры не устанавливаются до тех пор, пока не будут выложены подсмотры. Правильное место для получения данных кадра в этих условиях находится в методе viewController viewDidLayoutSubviews.

Это называется после viewWillAppear:. Но будьте осторожны - их не всегда называют вместе. Например, viewDidLayoutSubviews вызывается после вращения, viewWillAppear: - нет. viewWillAppear: вызывается каждый раз, когда представление становится видимым видом *, viewDidLayoutSubviews не обязательно (только если просмотры должны быть ретранслированы).

(* если приложение не было основано и становится приоритетным приложением, тогда viewWillAppear: не вызывается)

Ответ 2

Я понял, почему это произошло. Я использовал AutoLayout. Когда я сниму его в раскадровке, тогда фреймы верны.