Autolayout: NSStackView не изменит размер родительского представления при динамическом изменении высоты
Аналогичный вопрос: Как изменить размер родительского представления в зависимости от размера подпредставлений, размещаемых с помощью Autolayout
Я получил NSStackView, который загружает DisclosureViewController
s (подклассы NSViewController), как в примере Apple InfoBarStackView.
Они могут расширять и убирать представления произвольной высоты. Я хотел бы, чтобы родительский вид, содержащий NSStackView
изменить его высоту в соответствии с содержанием NSStackView
, В примере с Apple это работает.
Однако, к сожалению, Apple изменяет размер NSWindow, и я использую CCNStatusItem
( CCNStatusItem Github), представление, которое присоединяется к элементу состояния в строке меню Apple. Это окно изменяет размер содержимого NSStackView
когда он загружается, но не меняет размер при изменении содержимого.
Когда я раскрываю раздел, содержимое переполняется и обрезается по нижнему краю представления.
Я прошел через все ограничения и попытался воспроизвести это точно, но не мог заставить это работать. В примере с Apple они все добавляют программно, тогда как я добавил NSStackView в Interface Builder.
Мой вопрос будет таким: Какие ограничения у меня есть в Интерфейсном Разработчике (с какими приоритетами), чтобы родительское представление (окно) изменяло размер содержимого стека динамически? Нужно ли вызывать какой-то метод представления, чтобы он работал?
Пожалуйста, дайте мне знать, если я пропустил, чтобы предоставить необходимую информацию.
ОБНОВИТЬ
Принятый ответ был правильным способом сделать это. Вот результат. Мою разветвленную версию CCNStatusItem можно найти по адресу https://github.com/julianvogels/CCNStatusItem.git
2 ответа
Проблема в том, что CCNStatusItem
не совместим с автоматической компоновкой. Он устанавливает представление содержимого своего окна на экземпляр одного из своих собственных классов представления (CCNStatusItemWindowBackgroundView
). Ваше мнение является подвидом этого представления.
Когда он создает и добавляет свой вид, он не выключается translatesAutoresizingMaskIntoConstraints
или использовать ограничения, чтобы расположить его относительно его суперпредставления. В основном это означает, что ограничения не могут быть принудительно изменены до другого размера.
Аналогично, когда он добавляет ваш вид в фоновый режим, он не выключается translatesAutoresizingMaskIntoConstraints
на вашем представлении, и при этом он не устанавливает ограничений, чтобы связать ваше представление с фоновым представлением.
Поскольку у вас есть источник, вы можете внести эти изменения.
При использовании ограничений автоматического макета вам не нужно вызывать метод представления, чтобы вызвать этот эффект, но просто убедитесь, что:
- у представлений в представлении стека есть ограничения, которые заставят их расти
- контейнер имеет ограничения для стекового представления, которые указывают, что контейнер должен расти вместе с стековым представлением
- контейнер не имеет ограничений, которые могли бы помешать его росту
Снимки экрана показывают, что это не первый случай - количество просмотров растет, как и ожидалось. Так что это может быть как второй, так и третий. Снимок экрана от конструктора интерфейса, по-видимому, показывает, что нижнее ограничение StackView<>Container является необязательным (оно пунктирное). В зависимости от того, что на самом деле является приоритетом, это может быть вашей проблемой. Исходя из описанной вами конструкции, не должно быть никаких причин для того, чтобы это ограничение не требовалось.