UIButtons Xcode 8 с ограничениями, которые не отображаются
Все отлично работало до тех пор, пока я не обновил Xcode до версии 8.
Если я не использую никаких ограничений, я могу видеть кнопки, но когда я применяю ограничения (ограничения) к кнопкам, которые они исчезают, независимо от того, сколько или сколько ограничений (высота, вертикальный интервал, трейлинг и т.д.) Я применяю.
Когда я нажимаю кнопки, они действуют нормально (события всегда отправляются, поэтому я предполагаю, что они на самом деле расположены там (?)). Я попытался изменить цвет текста, цвет фона (даже добавив новый UIButton), но закончил без везения. Я не вижу кнопок. Когда я меняю цвет фона Centered View
, я вижу это изменение в приложении. Самая странная часть - когда я нажимаю Debug View Hierarchy
на Xcode, чтобы увидеть, что происходит, все выглядит хорошо; Я вижу все кнопки, расположенные, как я ожидаю.
![Дизайн]()
Тестирование приложения как на iPhone 5 (iOS 9.3.5), так и на iPhone 6 (iOS 10).
Я использую Swift 2.3, iOS 10 и Xcode 8.
Это ошибка на Xcode 8? Как решить эту проблему?
UPDATE:
Я только что понял, что проблема с ограничениями возникает и в UILabel и UIImageView. Они отлично смотрятся без ограничений, но когда я добавляю какое-либо ограничение, они исчезают.
Ответы
Ответ 1
Мне не удалось установить класс UIButton в свой собственный класс. Я проверил свой собственный класс и увидел, что я задал угловой радиус по методу awakeFromNib()
. Я назвал layoutIfNeeded()
, прежде чем установить угловой радиус, который был решением в моем случае.
Ответ 2
Решено это, заставляя компоновку перед установкой любых свойств, связанных с компоновкой, таких как 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
Edit:
"Я думаю, что инициализация с привязкой (0, 0, 1000, 1000) - это новый способ Xcode инициализирует представления из IB. До Xcode8 были созданы представления с их сконфигурированным размером в xib, а затем изменить размер в соответствии с экран сразу после. Но теперь в документе IB нет настроенного размера так как размер зависит от выбора вашего устройства (в нижней части экран)".
Ссылка: Начиная с Xcode 8 и iOS10, представления не отображаются должным образом на viewDidLayoutSubviews
Из примечаний к выпуску Apple:
Отправка layoutIfNeeded к представлению не ожидается, чтобы перемещать представление, но в более ранних версиях, если представление переводилоAutoresizingMaskIntoConstraints, установленное в NO, и если оно было помещено ограничениями, layoutIfNeeded переместил бы представление, чтобы он соответствовал механизму компоновки перед отправка макета в поддерево. Эти изменения исправляют это поведение, а положение приемников и обычно его размер не зависят от layoutIfNeeded.
Некоторые существующие коды могут полагаться на это неправильное поведение, которое теперь исправлено. Нет изменений поведения для двоичных файлов, связанных до iOS 10, но при построении на iOS 10 вам может потребоваться исправить некоторые ситуации, отправив -layoutIfNeeded в супервизор вида translatesAutoresizingMaskIntoConstraints, который был предыдущим ресивером, или позиционируя и оценивая его раньше ( или после, в зависимости от вашего желаемого поведения) layoutIfNeeded.
Ссылка: примечания к выпуску iOS10
Ответ 3
Я нашел решение. Скорее всего, это ошибка Xcode 8. Я также столкнулся с этой проблемой.
Решение заключается в изменении версии Xcode в построителе интерфейса.
Шаги,
-
Выберите ваш .xib файл.
-
Откройте раздел "Утилиты".
-
Выберите "File Inspector"
-
В "Документах по созданию интерфейса" измените версию Xcode "Открывается в" на "Xcode 7.x"
Я думаю, это поможет вам.
Ответ 4
Я не знаю, была ли это ошибка, но я решил, что добавляет метод self.layoutIfNeeded()
on awakeFromNib()
. На всякий случай, я подклассифицирую UIButton
...
НО, если вы этого не сделаете, вы не сможете решить ту же проблему, добавляя эту строку кода (по крайней мере, вы не можете в этой версии Xcode). Использование viewDidLayoutSubviews()
тоже не работает...
Ответ 5
Подтверждено, что это проблема с XCode 8 в настоящее время (по состоянию на 19 октября), распространяемой через App Store. Он излишне удаляет элемент <rect/>
из файлов Storyboard/xib.
Ни один из обходных решений layoutIfNeeded
не работает для меня. Я закончил загрузку XCode 8 Beta 3, которая исправила эту проблему.
Ответ 6
ограничения для scrollview должны быть: top,bottom,leading,trailing
Ограничение для contentview в scrollview должно быть: top,bottom,leading,trailing,fixed height and center x(horizontally in container)
Ответ 7
Кажется, что Xcode 8.1 Beta 2 (8T46g) исправляет проблему размера содержимого 1000x1000 (и, конечно же, проблемы автоматического макета внутри ячеек таблицы/коллекции).
Итак, что он работает в Xcode 7.x, он работает без проблем в Xcode 8.1 Beta 2.