Xcode 8 UIButtons с ограничениями, которые не отображаются

Раньше все работало отлично, пока вчера я не обновил Xcode до версии 8.

Если я не использую никаких ограничений, я могу видеть кнопки, но когда я применяю ограничения к кнопкам, они исчезают, независимо от того, какие или сколько ограничений (высота, вертикальный интервал, трейлинг и т. д.) я применяю.

Когда я нажимаю кнопки, они ведут себя нормально (события отправляются всегда, поэтому я предполагаю, что они действительно находятся там (?)). Я попытался изменить цвет текста, цвет фона (даже добавив новый UIButton), но безуспешно. Я не вижу кнопок. Когда я меняю цвет фона Centered View, я вижу это изменение в приложении. Самое странное, когда я нажимаю Debug View Hierarchy в Xcode, чтобы посмотреть, что происходит, там все выглядит нормально; Я вижу все кнопки, расположенные так, как я ожидаю.

Ограничения< /a> Дизайн

Тестирование приложения на iPhone 5 (iOS 9.3.5) и iPhone 6 (iOS 10).

Я использую Swift 2.3, iOS 10 и Xcode 8.

Это ошибка в Xcode 8? Как решить эту проблему?

ОБНОВЛЕНИЕ:

Я только что понял, что такая же проблема с ограничениями возникает и в UILabel, и в UIImageView. Они выглядят нормально без ограничений, но когда я добавляю какие-либо ограничения, они исчезают.


person JustWork    schedule 15.09.2016    source источник
comment
У меня была та же проблема, в моем случае это был layer.CornerRadius, который создал проблему (я установил их на основе кадра кнопки, прежде чем узнать размер кадра). В Xcode 7 все было в порядке.   -  person Mike.R    schedule 26.09.2016


Ответы (7)


Решил это, заставив макет перед установкой любых свойств, связанных с макетом, таких как clipToBounds и т. Д. Хитрость заключается в том, где и когда вызывать layoutIfNeeded.

В моем случае у меня есть UIButton с ограничениями по горизонтали, верху и высоте. По-видимому, в Xcode 8 заголовок моей кнопки внезапно пропал. Затем, как ни странно, заголовок появился после того, как я удалил ограничение по высоте. Такое поведение указывает на проблему, вероятно, в цикле компоновки представления. Мне нужно было иметь ограничение по высоте, поэтому его удаление не было решением. Поэтому я попытался вызвать layoutIfNeeded перед установкой ограничений, но безрезультатно.

Я генерирую эту кнопку в viewDidLoad на контроллере через класс NSObject, который ее обрабатывает. Решением для меня было заставить layoutIfNeeded перед вызовом метода, который устанавливает кнопку.

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view layoutIfNeeded];
    //editBooking - NSObject class where the button gets configured.
    [_editBooking setUpViews];
}

Связанные проблемы: clipsToBounds приводит к тому, что UIImage не отображается в iOS10 и XCode 8

Изменить:

«Я думаю, что связанная инициализация (0, 0, 1000, 1000) — это новый способ, которым Xcode создает экземпляры представлений из IB. До Xcode8 представления создавались с их настроенным размером в xib, а затем изменялись в соответствии с экраном сразу после этого. Но теперь, в документе IB нет настроенного размера, поскольку размер зависит от выбора вашего устройства (внизу экрана)».

Ссылка: Начиная с Xcode 8 и iOS10, представления имеют неправильный размер в viewDidLayoutSubviews

Из примечаний к выпуску Apple:

Ожидается, что отправка layoutIfNeeded в представление не приведет к перемещению представления, но в более ранних выпусках, если для представления для translatesAutoresizingMaskIntoConstraints задано значение NO, и если оно позиционировалось с помощью ограничений, layoutIfNeeded перемещал представление в соответствии с механизмом компоновки перед отправкой макета в поддерево. Эти изменения исправляют это поведение, а положение получателя и обычно его размер не будут затронуты layoutIfNeeded.

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

Ссылка: примечания к выпуску iOS10

person Teffi    schedule 17.09.2016
comment
Должен ли я делать это и в -(void)awakeFromNib; для ячеек? Редактировать: я добавил [self.contentView layoutIfNeeded]; к методу одной из моих затронутых tableViewCells, и это решило проблему. Вероятно, лучше всего создать подкласс ячейки, чтобы это больше не повторилось; по крайней мере, пока Apple не опубликует обновление для XCode8, чтобы решить эту проблему. - person Jargen89; 21.09.2016
comment
@ Jargen89 Jargen89 Не уверен, что это ошибка или новая норма для Xcode - см. правки выше. Вероятно, мы получим исправление, чтобы уменьшить серьезность изменения, но я думаю, что Apple теперь вынуждает использовать автомакет с помощью этого средства. Мне пришлось заменить большую часть представлений, зависящих от размера кадра, ограничениями, которые решили большинство проблем без принудительной компоновки. - person Teffi; 21.09.2016
comment
Это спасло мой день! СПАСИБО! self.view.layoutIfNeeded() быстро - person Cherrypig; 23.09.2016
comment
Отлично спас жизнь и сэкономил много часов !!! был в беде с последних 7 дней :( - person Premal Khetani; 20.10.2016

Я только что нашел решение. Скорее всего, это ошибка Xcode 8. Я также столкнулся с этой проблемой.

Решение состоит в том, чтобы изменить версию Xcode в конструкторе интерфейса.

Шаги,

  1. Выберите файл .xib.

  2. Откройте раздел «Утилиты».

  3. Выберите «Инспектор файлов»

  4. В разделе «Документы построителя интерфейса» измените версию Xcode «Открывается в» на «Xcode 7.x».

Я думаю, это поможет вам.

person MacKa    schedule 20.09.2016
comment
После того, как я безуспешно пробовал все, поэтому я попытался изменить его на «Открывается в XCode 7».... предупреждающий совет о том, что раскадровка будет закрыта, а затем снова открыта.. после этого я снова запускаю приложение и все кнопки появился... кроме того, раскадровка все еще показывается в XCode 8... - person Luca Rocchi; 06.10.2016
comment
Это лучшее решение, чем принятый ответ и ответ, получивший наибольшее количество голосов, поскольку он будет совместим с будущими версиями Xcode 8, в которых ошибка была исправлена, без необходимости изменять код без необходимости. - person Steve Cotner; 24.10.2016
comment
Я нашел еще один обходной путь. Перед тем, как установить angleRadius, установите layoutIfNeeded() для вида. - person MacKa; 27.10.2016
comment
@MacKa спасибо за твой ответ, приятель. Я потратил час на эту глупость xcode. - person Kunal Gupta; 10.12.2016

Мне не хватало точки установки класса UIButton для моего пользовательского класса. Я проверил свой пользовательский класс и увидел, что я установил угловой радиус для метода awakeFromNib(). Я вызвал layoutIfNeeded() перед тем, как установить угловой радиус, что было решением в моем случае.

person JustWork    schedule 26.09.2016

Я не знаю, является ли это ошибкой, но я решил ее, добавив self.layoutIfNeeded() к методу awakeFromNib(). На всякий случай я создаю подкласс UIButton...

НО, если вы этого не сделаете, вы не сможете решить ту же проблему, добавив эту строку кода (по крайней мере, в этой версии Xcode). Использование viewDidLayoutSubviews() тоже не работает...

person Javier Siancas    schedule 15.09.2016
comment
Это тоже не работает. Вызов layoutIfNeeded() не имеет никакого эффекта. - person JustWork; 15.09.2016

Подтверждено, что это проблема с XCode 8, который в настоящее время (по состоянию на 19 октября) распространяется через App Store. Он излишне удаляет некоторые элементы <rect/> из файлов Storyboard/xib.

Ни один из обходных путей layoutIfNeeded не работает для меня. В итоге я скачал XCode 8 Beta 3, которая устранила эту проблему.

person John Wu    schedule 19.10.2016

ограничения для прокрутки должны быть: top,bottom,leading,trailing

ограничение для просмотра содержимого в прокрутке должно быть: top,bottom,leading,trailing,fixed height and center x(horizontally in container)

person Ketan Parmar    schedule 15.09.2016
comment
Я думаю, вы не обратили внимания на мой вопрос. Независимо от того, какое ограничение я применяю, кнопки исчезают. Даже если я применяю только ограничение по высоте, они исчезают. - person JustWork; 15.09.2016
comment
что произойдет, если вы примените ограничение к прокрутке? оно исчезает? - person Ketan Parmar; 15.09.2016
comment
Нет. Когда я меняю цвет фона Centered View, я вижу это изменение в приложении. На этой странице невидимы только эти кнопки, остальные элементы управления (UIScrollView, UIView) никогда не видны. Они выглядят так, как ожидалось. - person JustWork; 15.09.2016
comment
затем однажды попробуйте установить ограничения, которые я упомянул в ответе. Затем добавьте кнопку, а затем попробуйте установить ограничение для кнопок! - person Ketan Parmar; 15.09.2016
comment
Это не работает, потому что, как я уже сказал, независимо от того, что и сколько ограничений я применяю, кнопки исчезают. - person JustWork; 15.09.2016

Похоже, что Xcode 8.1 Beta 2 (8T46g) устраняет проблему размера содержимого 1000x1000 (и, конечно же, проблемы с автоматическим макетом внутри ячеек представления таблицы/коллекции). Итак, то, что работает в Xcode 7.x, работает без проблем и в Xcode 8.1 Beta 2.

person Claudiu Matei    schedule 10.10.2016