it-swarm.com.ru

Кнопки Xcode 8 UIB с ограничениями не отображаются

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

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

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

Constraints Design

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

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

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

Обновление:

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

15
JustWork

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

2
JustWork

Решено это путем принудительной компоновки перед установкой любых связанных с макетом свойств, таких как 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 в представление, как ожидается, не будет перемещать представление, но в более ранних выпусках, если для view было установлено значение translatesAutoresizingMaskIntoConstraints равным NO, и если оно позиционировалось с помощью ограничений, layoutIfNeeded будет перемещать представление в соответствии с механизмом компоновки перед отправкой макета в поддерево . Эти изменения исправляют это поведение, и расположение получателя и обычно его размер не будут затронуты layoutIfNeeded.

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

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

20
Teffi

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

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

Шаги,

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

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

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

  4. Под "Интерфейсными Документами Разработчика" измените версию XCode "Открывает в" на "XCode 7.x"

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

4
MacKa

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

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

1
Javier Siancas

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

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

1
John Wu

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

0
Claudiu Matei

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

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

0
Lion