Проблемы с компоновкой после обновления до Xcode 8

Вот до и после одного из моих экранов после того, как я обновился до Xcode 8.
Все, что я сделал, это открыть мою main.storyboard, а оттуда я построил и запустил приложение на своем телефоне.
В моем управлении версиями, я вижу, что Xcode делает много изменений в моей main.storyboard только от меня, открывая его.
Всякий раз, когда я удаляю эти изменения, я могу видеть, что я использую для просмотра в Xcode 7.3.1.
Но, как только я снова открою конструктор интерфейса с моей раскадрой, я вижу, что эти изменения возвращаются на свои места.

Я могу что-то здесь сделать?

До Xcode 8

введите описание изображения здесь

После обновления до Xcode 8

введите описание изображения здесь

Ответ 1

У меня была аналогичная проблема с изображениями таблицы, которые не появляются, когда я преобразовал файл раскадровки в совместимый с Xcode8. Это похоже на ошибку с Xcode8, поэтому до тех пор, пока не будет исправлено исправление ошибки, вот работа:

  • Откройте раскадровку в Xcode 8 и выберите начальное представление устройства. Внесите изменения, как обычно.
  • После того, как вы завершили свои изменения, выберите раскадровку → File Inspector → Opens in → Select 'Xcode 7.x'.

введите описание изображения здесь

  1. Выберите "Сохранить и закрыть" при появлении запроса
  2. Изменения в раскадровке будут сохранены, и ваш раскадровка будет работать так же, как и pre-Xcode8.

Если вам нужно внести другие изменения в файл раскадровки, выполните следующие действия.

Ответ 2

XIB или Storyboard устанавливаются по умолчанию как более ранняя версия 7.x и сохраняются и закрываются. Временное решение, но работает. Не открывайте снова, как только вы выполнили сохранение и закрытие. В противном случае вам снова нужно выполнить те же шаги. введите описание изображения здесь

Ответ 3

Eh та же проблема. Частично мне удалось исправить это следующим образом (для Xcode Version 8.1 (8B62))

В контуре документа раскадровки я щелкнул по каждой сцене, у которой была желтая стрелка, указывающая на некоторые проблемы с макетом (номер 1 на скриншоте).

После этого для каждой проблемной сцены мне пришлось щелкнуть маленькую иконку "Обновить фреймы" (номер 2 на снимке экрана), в которой исправлены все макеты на сцену.

введите описание изображения здесь

Однако одна сцена в моем случае все еще была в плачевном состоянии после перехода от Xcode7 к Xcode8. Я должен был исправить это вручную, установив ограничения или добавив недостающие ограничения.

Фу, не приятно удивлять XCode8 и Storyboards. Если вы использовали редактор AppCode, у вас не будет такой проблемы, поскольку он не поддерживает раскадровки, P

Удачи!

Ответ 5

Пожалуйста, следуйте за нитями для любого возможного решения: (Я считаю, что это происходит со многими разработчиками).
Xcode 8 выпуск распада семян GM
Xcode 8 - предыдущие раскадровки искажаются

(Я использовал anyH anyW ширину 600). Когда Xcode обновлен до Xcode 8, он изменил весь размер ViewControllers. В результате все макет был искажен.
В настоящее время я вижу только 3 решения проблемы (я бы не стал надеяться на скорое исправление).

1.Go для каждого Viewcontroller и закрепите его на Update Frames.

 2. Перейдите к главному ViewController Size Inspector -> Freeform -> 600, поскольку выведено большинство контроллеров, это изменит размер для  все они. (Будьте осторожны с воздействием новых функций Apple, я хочу  ввести).

 3. Отметьте изменения в git для раскадровки (я бы предложил это, потому что Apple также внедрила некоторые обновления, которые могут быть важны для  Xcode).

Дополнительная ссылка для новых функций AutoLayout в Xcode 8 (WWDC16): Создание приложений Adaptive, часть 1

Ответ 6

В моем случае для решений, предложенных Ахилем Катейхой, мне также необходимо reset Ширина и высота основного вида:

1) Установите размер представления в свободную форму

введите описание изображения здесь

2) reset Ширина и высота представления до исходного размера:

введите описание изображения здесь

Наконец, сохраните, и все готово.

Ответ 7

Настройка размера представления в Freeform из Inferred работала для меня. Его можно найти в заголовке "Имитированные показатели в инспекторе атрибутов".

Ответ 8

У меня была такая же проблема, и я решил ее силой обновить ограничения вида контроллера. Поместите следующий код в свою функцию viewDidLoad()

self.view.layoutIfNeeded()

Ответ 9

Я выбрал каждый контроллер и нажал "Обновить фреймы", и он исправил макет.

Ответ 10

Ответ от @david-truong (fooobar.com/questions/56970/...) не работает в моем случае, поэтому, если вы в той же ситуации, попробуйте следующее:

  • Загрузите предыдущий Xcode 7.3.1 отсюда: https://developer.apple.com/download/more/
  • Отмените все свои изменения (если у вас есть менеджер кода, например git. Если вы этого не сделаете, вы должны https://githowto.com/ ')
  • Откройте проект с помощью Xcode 7.3.1.

В случае, если все ваши устройства обновлены до версии iOS 10+, эта версия Xcode не будет распознавать эти устройства в качестве совместимых устройств. Итак, попробуйте с этим трюком:

  • Перейдите к:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Скопируйте папки, связанные с iOS 10 или 10.1, в:/Applications/Xcode 7.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Откройте проект с помощью Xcode 7.3.1 (перезапустите Xcode, если он уже открыт)
  • Выберите подключенное устройство iOS 10+
  • Push Run

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

Ответ 11

Надеюсь, это поможет

Когда я обновил Xcode с 7.3 до Xcode 8 и запустил приложение, некоторые из них прекрасно отображаются, но некоторые из них искажены. Затем я проверил файл nib, и он попросил меня выбрать определенный размер устройства, а затем показать значок в зависимости от того размера устройства, которое не является Any-Any(Xcode 7.3). Таким образом, все файлы nibs отображаются неверно.

Работа решения меня: нажмите желтую стрелку, как показано на рисунке ниже

введите описание изображения здесь

появится подсказка, в которой отображаются такие параметры, как

введите описание изображения здесь

выберите Update Frames с помощью Apply to all views in container checked.it будет разрешено около 90% искаженного пользовательского интерфейса, а остальная часть ограничений автоматического макета может быть решена вручную.

Ответ 12

Для меня решение было просто щелкнуть по UIViewController с проблемами, а затем Editor > Resolve Auto Layout Issues > All Views In ... > Updates Frames

Переделал представления, чтобы они соответствовали существующим ограничениям, основанным на недавно выбранном представлении по умолчанию (iPhone 7 в моем случае).

Также обратите внимание: если вы получаете предупреждение Навигационная панель Misplaced View, как я это делал, просто выберите UINavigationController/UIViewController, а затем Attributes Inspector > Bar Visibility > Shows Navigation Bar - отключите его, а затем снова включите.

Ответ 13

Я исправил проблему с помощью Xcode Version 7.3.1, вы можете загрузить файл .dmg с портала разработчиков Apple. Я использовал Autoresizing в каждом приложении, и он отлично работает для меня. я буду обновлять до Xcode 8, только если они могут исправить эту ошибку.

Загрузите его здесь: https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg

Ответ 14

Чтобы устранить подобную проблему, я сконфигурировал xib как Freeform (not Inferred) И сохранил файл xib как совместимый с Xcode 7.x. Оба шага были необходимы в моем случае. Надеюсь, это поможет!

Ответ 15

Я заметил одну новую кнопку в XCode 8.2 (проверьте оранжевый круг на изображении). Это даст вам некоторую помощь.

Шаги:  1. Откройте раскадровку и выберите любое устройство, которое вы хотите  2. Просто выберите контроллер просмотра  3. Нажмите указанную кнопку (как на изображении)  4. Он обновит фрейм для этого контроллера просмотра и вы сможете продолжить его.

Я не нашел лучшего решения, чем это. Ответьте, если найдете его.

введите описание изображения здесь

Ответ 16

ограничения обновления и представления в виде viewdidload решают проблему

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}