Теперь Interface Builder позволяет пользователю динамически изменять размер каждого контроллера представления в раскадровке, чтобы имитировать размер определенного устройства.
Перед этой функцией пользователь должен вручную установить размер каждого контроллера представления. Таким образом, контроллер представления был сохранен с определенным размером, который использовался initWithCoder
для установки начального кадра.
Теперь кажется, что initWithCoder
не используют размер, определенный в раскадровке, и определяют размер 1000x1000 пикселей для представления viewcontroller и всех его подвидов.
Это не проблема, потому что представления всегда должны использовать одно из этих решений компоновки:
autolayout, и все ограничения будут правильно отображать ваши представления
autoresizingMask, который будет размещать каждое представление, к которому не привязаны какие-либо ограничения ( обратите внимание, что ограничения автоматического раскладки и маржи теперь совместимы в одном и том же представлении \ o /! )
Но это является проблемой для всего макета вещи , связанные с видом слоя, как cornerRadius
, так как ни autolayout , ни автоматического изменения маски относится к свойствам слоя.
Чтобы решить эту проблему, обычно используется, viewDidLayoutSubviews
если вы находитесь в контроллере или layoutSubview
в представлении. На этом этапе (не забудьте вызвать их super
относительные методы) вы почти уверены, что все макеты выполнены!
Совершенно уверен? Хм ... не совсем, я заметил, и поэтому я задал этот вопрос, в некоторых случаях в этом методе представление все еще имеет размер 1000x1000. Думаю, на мой вопрос нет ответа. Чтобы дать о нем максимум информации:
1- бывает только при раскладке ячеек! В подклассах UITableViewCell
& не будет вызываться после правильного размещения вложенных представлений.UICollectionViewCell
layoutSubview
2- Как заметил @EugenDimboiu (пожалуйста, проголосуйте за его ответ, если он будет полезен для вас), вызов [myView layoutIfNeeded]
подпредставления без макета будет правильно размещать его как раз вовремя.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel);
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel);
}
3- На мой взгляд, это определенно ошибка. Я отправил его на радар (id 28562874).
PS: я не родной английский, поэтому не стесняйтесь редактировать мой пост, если моя грамматика должна быть исправлена;)
PS2: Если у вас есть лучшее решение, не стесняйтесь писать другой ответ. Я перенесу принятый ответ.