Как установить и удалить UIButton на основе класса размера?

Мне нужно, чтобы кнопка была установлена ​​в портретной ориентации, а другая кнопка была удалена в портретной ориентации (любая ширина, любая высота), а обратная должна происходить в альбомной ориентации (любая ширина, компактная высота). Одна из этих кнопок является частью UIStackView, а другая — частью UIView.

В книжной ориентации кнопка в UIStackView должна быть установлена, а кнопка внутри UIView должна быть удалена, причем обратное происходит, как я упоминал ранее в альбомной ориентации. В настоящее время я проверяю userInterfaceIdiom в моем контроллере представления для раскадровки, но хотел бы полностью полагаться на Interface Builder, если это возможно.

При удалении моего кода (который на самом деле заставляет его вести себя правильно) и просто полагаться на Interface Builder для установки/удаления кнопок на основе size class, кнопка, установленная для альбомной ориентации, всегда отображается правильно, но при повороте обратно в портретную, другая кнопка, которая теперь должен быть установлен, совершенно не на своем месте, из его исходного UIStackView, и тот UIStackView, в котором он должен был остаться, но не был, теперь расширен, чтобы заполнить недостающее место, где должна была быть эта кнопка. Когда это происходит, в журнале нет предупреждений или ошибок от UIKit, и моя раскадровка не показывает конфликтов. Я совсем запутался!

На первый взгляд это кажется простым решением. Просто установите/снимите флажок установки для size classes элемента пользовательского интерфейса. Хотя даже после прочтения документации и руководств Apple это оказалось более сложным и неясным, чем я ожидал.

Чтобы уточнить, я не установил ограничения для кнопки, установленной для портретной ориентации, поскольку она находится внутри UIStackView. С другой стороны, у меня есть несколько ограничений, установленных для кнопки альбомной ориентации. Хотя кнопка в UIStackView единственная, которая доставляет мне неприятности.

Отладчик представления не работает и в Xcode 7, и я получаю сообщение об ошибке: warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available. при попытке его использования.

Я считаю, что это может быть ошибка, связанная с этим сообщением: свойства UIStackView в соответствии с размерными классами < /а>

Ваша помощь очень ценится! Спасибо.


person logan.blevins    schedule 16.06.2016    source источник
comment
При этом в журнале нет ни предупреждений, ни ошибок от UIKit. Вы не получите предупреждения об этом, но они могут вызвать такую ​​​​проблему. Вам придется использовать отладку ведения журнала/представления, чтобы узнать.   -  person matt    schedule 16.06.2016
comment
@matt Спасибо за быстрый ответ! IB не показывает никаких предупреждений или неясностей для ограничений и/или фреймов на основе автоматического макета для моей раскадровки. Это то, что вы спрашивали?   -  person logan.blevins    schedule 16.06.2016
comment
Нет, я говорю о том, что происходит во время выполнения.   -  person matt    schedule 16.06.2016
comment
@matt Я тоже не получаю их во время выполнения. Какие-либо предложения?   -  person logan.blevins    schedule 16.06.2016
comment
Я бы сказал, вернитесь к этому в коде и двигайтесь дальше. IB явно не способен делать то, что вы хотите. Ничего страшного.   -  person matt    schedule 16.06.2016


Ответы (1)


Если вы хотите, чтобы компонент отображался только в определенном классе размера, вы делаете следующее:

Компактный x Обычный

Добавьте ограничения к вашему компоненту, используя класс размера, в котором вы хотите, чтобы он отображался (wCompact hRegular для всех iPhone в книжной ориентации и wAny hCompact для всех iPhone в альбомной ориентации). Затем убедитесь, что в инспекторе атрибутов отмечен только этот размерный класс.

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

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

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

ОБНОВИТЬ

Убедитесь, что ограничения компонентов также установлены для правильного класса размера.

Класс ограничения размера

В структуре документа выберите ограничения компонента и проверьте класс размера ограничения в инспекторе размеров. Обычно, когда вы добавляете ограничения к компоненту с определенным классом размера, выбранным в раскадровке, ограничения автоматически добавляются для этого класса размера.

person Lucas    schedule 16.06.2016
comment
Я уже установил / удалил элементы, необходимые для классов определенного размера. Как я уже сказал, они правильно устанавливаются/удаляются, но не всегда правильно «раскладываются» на исходные позиции или содержат представления. Это происходит, даже если я устанавливаю/удаляю набор ограничений для кнопки альбомной ориентации, в то время как для кнопки портретной ориентации ограничений нет, поскольку она находится в папке UIStackView. - person logan.blevins; 16.06.2016
comment
@logan2995 убедитесь, что вы добавляете ограничения для компонента в правильном классе размера, а не только устанавливаете его в правильном классе размера. См. Инспектор размера для ограничений компонента. Я обновил свой ответ скриншотом того, как это сделать. - person Lucas; 16.06.2016
comment
Странно то, что кнопка с ограничениями, которая установлена ​​только для альбомной ориентации, работает правильно, но кнопка, установленная для портретной ориентации (у которой нет ограничений, поскольку она находится в UIStackView), не работает. Он даже не должен выходить из UIStackView. Я подозреваю, что UIStackView размещает другие представления и занимает пространство до того, как кнопка будет внедрена в иерархию представлений. - person logan.blevins; 16.06.2016
comment
@logan2995 logan2995 кнопка в UIStackView, она должна появляться или исчезать в альбомной ориентации? Я обновлю свой ответ определением класса размера UIStackView. - person Lucas; 16.06.2016
comment
Кнопка в UIStackView должна быть установлена ​​только в портретной ориентации. Он правильно устанавливает / удаляет в соответствии с классом размера, хотя кнопка полностью теряет свое место за пределами UIStackView при повороте обратно в портретную ориентацию в верхнюю левую часть другого вида. - person logan.blevins; 16.06.2016
comment
@ logan2995 правильно ли ваша кнопка размещена внутри UIStackView? Что такое настройка выравнивания и распределения для вашего UIStackView? Есть ли ограничения у UIButton внутри представления стека? Какого макета вы пытаетесь достичь? Я думаю, что вашу проблему можно решить с помощью инспектора атрибутов UIStackView. - person Lucas; 17.06.2016
comment
нет проблем с атрибутами представления стека. Как я описал в исходном вопросе, он отлично работает, если я программно скрываю кнопки, а не устанавливаю/удаляю их в IB. - person logan.blevins; 22.06.2016