Тепер Interface Builder дозволяє користувачеві динамічно змінювати розмір кожного контролера перегляду в дошці розкадрування, щоб імітувати розмір певного пристрою.
Перед цим функціонуванням користувач повинен встановити вручну кожен розмір контролера перегляду. Таким чином, контролер перегляду був збережений з певним розміром, який використовувався initWithCoder
для встановлення початкового кадру.
Тепер, схоже, що initWithCoder
не використовуйте розмір, визначений у розгортці, а визначте розмір 1000x1000 пікселів для подання контролера перегляду та всіх його підпоглядів.
Це не є проблемою, оскільки представлення завжди повинні використовувати будь-яке з цих варіантів компонування:
автоматичне розміщення, і всі обмеження будуть правильно розташувати ваші погляди
autoresizingMask, який буде розміщувати кожен вид, до якого не додано жодних обмежень ( відзначимо, авторозмітка та обмеження поля тепер сумісні в тому ж представленні \ o /! )
Але це є проблемою для всього макета речі , пов'язані з видом шару, як cornerRadius
, так як ні autolayout , ні автоматичного зміни маски відноситься до властивостей шару.
Щоб відповісти на цю проблему, загальним способом є використання, viewDidLayoutSubviews
якщо ви перебуваєте в контролері або layoutSubview
якщо ви переглядаєте. На даний момент (не забудьте назвати їх super
відносні методи), ви майже впевнені, що всі матеріали з компонуванням зроблені!
Досить впевнений? Гум ... не зовсім, я зауважив, і саме тому я задав це питання, в деяких випадках представлення все ще має розмір 1000x1000 за цим методом. Я думаю, що відповіді на моє власне питання немає. Щоб надати максимум інформації про це:
1- це трапляється лише при розкладанні комірок! У UITableViewCell
& UICollectionViewCell
підкласи layoutSubview
не будуть викликані після того, як підпрограми будуть правильно розкладені.
2- Як зауважив @EugenDimboiu (будь-ласка, підкажіть його відповідь, якщо це корисно для вас), зателефонувавши [myView layoutIfNeeded]
на непрокладений підрозділ, він буде правильно розміщувати його вчасно.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- На мою думку, це, безумовно, помилка. Я подав його на радари (id 28562874).
PS: Я не рідна англійська мова, тому сміливо редагуйте свою публікацію, якщо мою граматику слід виправити;)
PS2: Якщо у вас є краще рішення, не пишіть іншої відповіді. Я перенесу прийняту відповідь.