2014-09-23 1 views
24

Я нахожусь в разгаре разработки приложения для iPhone и iPad. Он поддерживает iOS6 и iOS7, и он использует только автоматическую компоновку.Проблемы с автоопределением с iOS8 с кодом, который отлично работает на iOS7

На прошлой неделе, когда Apple объявила, что iOS8 готова к прайм-тайм, я обновил один из своих iPhone и iPad как на iOS8. Я также столкнулся с XCODE до версии 6. У меня есть второй iPhone, который я оставил в iOS7.

Я сгенерировал новые исполняемые файлы с Xcode 6, и я был огорчен, увидев, что их макеты экрана были испорчены при запуске на моих устройствах, работающих под управлением iOS8, но все еще в порядке на iOS7. Это верно как на физических устройствах, так и на эмуляторах Xcode.

Потребовалось много рытья, но теперь я ясно понимаю, что происходит, хотя я не знаю почему.

В частности, некоторые операции автоматической компоновки не работают для меня на iOS8, но они отлично подходят для iOS7.

Некоторые примеры с участием кнопки, которые я помещаю на основной взгляд, размер которого равен размеру экрана:

(1) Если я спрошу Автокомпоновка в положение горизонтального центра баттона (CX) равна к горизонтальному центру базового представления, результат состоит в том, что горизонтальный центр кнопки расположен на левом краю основного изображения.

(2) Если я попрошу автомасштабирование, чтобы ширина кнопки была равна 50% ширины основного вида, она не дает никакой ширины.

Я могу работать вокруг этих вопросов следующим образом:

(1) Я прошу Автокомпоновку расположить центр баттона равного левого края Базового зрения плюс 50% от ширины экрана.

(2) Я прошу автомасштабирование, чтобы ширина кнопки была равна 50% ширины экрана.

Я медленно пробиваю себе путь, с обходными решениями, подобными этим, обратно в автоматический макет кода, который работает для меня как на iOS7, так и на iOS8. Но мне действительно интересно, что здесь происходит.

Похоже, что автоматическая компоновка не может определить размер основного вида и, таким образом, автоматические вычисления компоновки, требующие, чтобы информация не срабатывала. Но он знает, где верхний и левый края представления, так что вычисления на основе этих данных будут успешными.

Это большое приложение, и я написал много сотен строк кода автоматического макета для iOS6 и iOS7, которые отлично работают для меня.

Я уже три дня настраивал и пробовал работу с iOS8, и я не был мудрее, чем был, когда начал.

У кого-нибудь есть предложения или мысли относительно того, что может быть проблемой здесь?

+0

Я нахожусь на одной лодке. Во всяком случае, похоже, что ширина вашего базового представления равна 0, чтобы начать ширину, поэтому, когда вы сказали центру X вашей кнопки, что это центр X основного представления, кнопка появляется на левом краю. – Zhang

+1

Да, и из того, что я вижу до сих пор, как только я начну размещать элементы управления в представлении, я могу использовать все различные варианты отношений автоматического компоновки между этими элементами управления. Например, горизонтальный центр одной кнопки может быть выровнен с другим без проблем. – Gallymon

+0

Я должен также упомянуть, что я не использую IB. Весь мой код макета авто выполняется путем непосредственного создания NSLayoutConstraint/s. Всегда делайте это так, и он отлично работает в iOS7. – Gallymon

ответ

3

Вы можете найти ответы на этот вопрос полезный: UICollectionView cell subviews do not resize

В большинстве случаев работа в iOS7, но не на IOS проблемах 8 Автокомпоновки, кажется, проистекает с точкой зрения корня не является размером правильно прошивка 8, в частности, когда мы устанавливаем translatesAutoresizingMaskIntoConstraints на NO. Для моих просмотров мне удалось установить фрейм корневого представления в layoutSubviews (или любой соответствующий инициализатор, который имеет правильные границы), и это решило проблему.

self.contentView.frame = CGRectInset(self.bounds, 0, 0); 

Как показано в ответе выше, вы можете также сделать

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 

, а затем повернуть translatesAutoresizingMaskIntoConstraints назад НЕТ, прежде чем устанавливать свои собственные ограничения в коде.

Определенно ненавижу, что так много нашего времени взято с этими раздражающими ошибками.

+0

Praneeth, спасибо за это. Я пробовал, но это не влияет на проблему, которую я испытываю. – Gallymon

+0

Хм, извините, что это не помогло. В моем случае у меня было сочетание ограничений IB, а затем корректировка кода во время выполнения, и это решило мою проблему. Удачи. –

11

@robmayoff имеет большой ответ на это: https://stackoverflow.com/a/26066992/1424669

По существу, в iOS8 вы больше не можете позвонить setNeedsUpdateConstraints и setNeedsLayout на вид и ожидать ограничений подобозрения обновить.

Эти методы необходимо вызвать в представлении, ограничение которого меняется. Это обратно совместимо с iOS7.

Пример:

Предположим, у вас есть ViewController с видом self.view корня и подвид называется containerView. containerView имеет прикрепленный к нему NSLayoutConstraint, который вы хотите изменить (в данном случае, верхнее пространство).

В iOS7 можно обновить все ограничения в ВК, запрашивая новый макет для вида корня:

self.containerView_TopSpace.constant = 0; 
[self.view setNeedsUpdateConstraints]; 
[self.view setNeedsLayout]; 

В iOS8 вам нужно запросить макеты на containerView:

self.containerView_TopSpace.constant = 0; 
[self.containerView setNeedsUpdateConstraints]; 
[self.containerView setNeedsLayout]; 
+0

BFar, это отличная новость и имеет смысл. Я не могу дождаться, чтобы попробовать и посмотреть, смогу ли я поставить эту проблему позади меня. – Gallymon

+0

@BFar Можете ли вы объединить простой примерный проект, демонстрирующий эту проблему (например, работает с 7 SDK, но не с 8 SDK), а затем файл радара и поделиться радаром #? – smileyborg

+0

BFar, я пробовал идеи robmayoff, но они, похоже, не связаны с моей проблемой. Теперь у меня есть законное решение, поэтому я настаиваю. Благодаря! – Gallymon

0

В мой случай, проблема, связанная с ограничениями, помеченными UIView-Encapsulated-Layout-Width и UIView-Encapsulated-Layout-Height. Когда я их удалял, все вел себя так, как будто мой взгляд был нулевого размера, и все было сосредоточено в верхнем левом углу экрана. Когда я их оставил, новые ограничения работали, как ожидалось. Я также сохранил ограничения, помеченные как _UILayoutSupportConstraint.

Смежные вопросы