Один из экранов моего приложения полностью сломался при обновлении до SDK iOS 8. Проблема заключается в том, что верхняя направляющая макета смещается вместо того, чтобы быть "привязкой" для остальных видов.
Это то, что было похоже на iOS 7:
Это то, что похоже на iOS 8 (взято из отладчика Xcode 6 View Hierarchy):
Как вы можете видеть, вид отображается над панелью навигации. В верхней направляющей макета есть два ограничения: один для верхнего изображения и один для белого представления под ним. В нижнем макете ограничений нет ограничений, только ограничения высоты на представлениях.
По какой-то причине iOS 8 решает нажать верхнюю направляющую макета на {0 -255; 0 0}
после вызова [self.view layoutIfNeeded]
в первый раз.
Кроме того, границы просмотра иногда кажутся слишком большими для устройства (т.е. Отображаются точно так же, как в унифицированном раскадровке (600x600), вместо 320x480/320x568.
Что изменилось в iOS 8, которое может испортить макет?
[EDIT] Ниже приведен полный список ограничений для представления:
(lldb) po self.view.constraints
<__NSArrayM 0x786ac520>(
<NSLayoutConstraint:0x7c377bd0 V:[_UILayoutGuide:0x7c372f60]-(0)-[UIView:0x7c373120]>,
<NSLayoutConstraint:0x7c377c00 UIView:0x7c373120.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c377c30 UIView:0x7c3730b0.centerX == UIView:0x7c373120.centerX>,
<NSLayoutConstraint:0x7c377c60 H:|-(0)-[UIView:0x7c3716f0] (Names: '|':UIView:0x7c3730b0 )>,
<NSLayoutConstraint:0x7c377c90 UIView:0x7c3716f0.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c372f30 V:[_UILayoutGuide:0x7c372f60]-(129)-[UIView:0x7c3716f0]>
)