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


102

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

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

До Xcode 8

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

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

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


Попробуйте снова открыть XCode 8 из свежего источника (сохраните все изменения, внесенные ранее). Теперь, когда вы открываете раскадровку, выделите все элементы пользовательского интерфейса и нажмите «Обновить кадры». Это может решить вашу проблему.
d1str0

6
Не могли бы вы зарегистрировать ошибку на bugreport.apple.com и прикрепить раскадровку, для которой это происходит? Мы хотели бы проанализировать это дальше.
Куинн Тейлор

1
У меня точно такая же проблема. После открытия моей раскадровки в Xcode8 и принятия диалогового окна «Выберите начальное представление устройства» все работает странно. Когда я обновляю все фреймы, IB выглядит хорошо, но после сборки приложение полностью не работает. Протестировал с 4 приложениями.
Cherrypig

@QuinnTaylor У меня аналогичная проблема, после того как Xcode 8 преобразует мою раскадровку, UIImageViews в UITableViews не показывают никакого контента, хотя их структура видна в Debug View Hierarchy. Другие объекты того же класса, которые находятся в UICollectionViews, не затронуты.
Мануэль

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

Ответы:


111

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

  1. Откройте раскадровку в Xcode 8 и выберите начальное представление устройства. Внесите изменения, как обычно.
  2. После внесения изменений выберите раскадровку -> Инспектор файлов -> Открывается в -> Выберите «Xcode 7.x».

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

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

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


Вау +1 за это точно. Я боролся с этим в iOS 10 в моем TodayExtension. Только когда я сузил круг вопросов, проанализировав различия git, я увидел подозрительные правки XML раскадровки, добавленные Xcode 8. После сохранения документа раскадровки для Xcode 7 (после внесения правок) я теперь могу создавать и отправлять с использованием Xcode 8 для iOS 10. Спасибо.
Джон Эрк

Это действительно выглядит ошибкой. Сохранение как открывающееся в Xcode 7.x работало для меня как временное решение.
Steve A

Я потратил последние 3 дня на исправление всего сломанного макета с места на место в Xcode8, пока не нашел этот пост. Я, наверное, должен доверять таким людям, как вы, больше, чем Apple. Не могу поверить, что я потратил так много времени. Большое спасибо Дэвиду за это!
Сюй Инь

@XuYin Стоит ли делать это для каждой раскадровки? Я имею в виду, что если в моем проекте есть еще одна раскадровка? А как насчет файлов Xib? я должен сделать это и для них?
Дорогая,

@Honey я не делал этого на раскадровке, но я делал это для каждого файла xib, с которым у меня есть проблема. но я думаю, вы можете попробовать его и на раскадровке, если увидите странную проблему с макетом. так как это исправление займет всего 5 секунд. и после перестройки приложения вы сможете очень быстро увидеть исправление.
Сюй Инь

14

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


6
Это не помогает, потому что мне нужно работать с файлом. Все это сохраняет файл для обратной совместимости. Это не позволяет редактировать xib в Xcode 8.
jowie 03

Я делаю это, но снова, когда я выбираю файл xib в раскрывающемся списке, он показывает только xcode 8.0 ...
jayant rawat

8

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

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

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

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

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

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

Удачи!



6

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

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

1. Найдите каждый Viewcontroller и исправьте его Update Frames.

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

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

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


1
Вариант 1 самый разумный и у меня он сработал. Как отмечает Mike.R, будьте осторожны, пытаясь «обмануть» XCode, чтобы исправить что-то, поскольку дальнейшие проблемы неизбежны.
аркадий боб

Я тоже использовал вариант 1 (считаю его более безопасным). Но это требует времени.
Mike.R

5

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

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

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

2) Восстановите исходный размер ширины и высоты вида:

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

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


4

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

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

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


3

У меня сработала установка размера представления в произвольную форму из Inferred . Его можно найти под заголовком Simulated Metrics в Attributes Inspector .


3

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

self.view.layoutIfNeeded()

1
Ура, Билл! этот layoutIfNeeded работал у меня! (После того, как часами пробовал все остальное ..)
Итан Халприн

3

Я выбрал каждый контроллер и щелкнул «Обновить кадры», и макет был исправлен.


3

Ответ от @ david-truong ( https://stackoverflow.com/a/39589860/1407528 ) не работает в моем случае, поэтому, если вы находитесь в моей ситуации, попробуйте следующее:

  • Загрузите предыдущую версию 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+
  • Нажми, беги

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


3

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

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

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

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

появится всплывающее окно с такими параметрами, как

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

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


Это также может испортить макеты. ИМХО, это нужно делать с большой осторожностью, по одному просмотру за раз и проверять, сработало ли все, прежде чем продолжить.
brainray

да, конечно, вам нужно потратить некоторое время на это, и это решение может помочь вам в более длительной перспективе, когда вы хотите обновить некоторые из пользовательского интерфейса ur.
Анураг Бхакуни

1

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

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


Это решение бесполезно, если вы хотите поддерживать iOS 10
jungledev

1

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


1

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

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

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

Скриншот IB


Ничего не произошло.
Муджу

0

Обновить ограничения и подвиды макета в viewdidload решает проблему

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.