2012-05-02 5 views
1

как this question, у меня есть NSView, который является contentView для NSWindow и содержит несколько подъячейков, расположенных вертикально один над другим. некоторые из них являются фиксированным размером, и некоторые из них могут быть расширены или свернуты с помощью кнопки раскрытия.как я могу получить содержимое окна для «обнимания» его подвид

Я хочу реализовать своего рода эффект «аккордеона», когда расширение или свертывание одного из подзонов делает все остальное настраиваемым и изменяет размер надстройки и окна соответственно.

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

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

Кто-нибудь знает как?

ответ

2

Autolayout - это здорово и полно. И тайный.

Я старался изо всех сил, но не мог придумать набор ограничений, которые бы сделали то, что я хотел сделать. Мне все еще кажется, что если вы поставите NSView вертикально внутри супервизора и настройте ограничения, чтобы верхнее подвью было прикреплено к вершине супервизора и спустилось вниз по стопке подзонов, вы привязываете верхнюю часть к нижнему краю выше, а затем, наконец, вы привязываете нижний край последнего подсмотра к нижнему краю супервизора, а затем программно изменяете размер одного или нескольких подзонов, которые он должен иметь, чтобы вытащить или надавить на нижнюю часть супервизора держите его, обнимая его подпункты.

Все работает как ожидалось, за исключением последней части. Когда вы пытаетесь прикрепить нижний подъярус к нижней части супервизора, автомат не может удовлетворить все ограничения. Кажется, изменение размера супервизора для удовлетворения ограничений не в алгоритме. Либо это, либо я пропускаю какое-то другое ограничение, которое требует настройки.

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

В любом случае, я придумал решение, использующее автозапуск, и это очень близко к тому, что я ожидал, что автозапуск будет делать, потому что все, что было необходимо, - это подклассификация NSView и помещение нескольких строк кода в метод intrinsicSize, а затем используя этот подкласс для супервизора.

Я создал проект xcode с моими складными видами базовых классов и рабочей демонстрацией всего предмета на github.

0

Я могу подтвердить, что в такой ситуации, как ваша, автоматические ограничения, установленные Xcode сами по себе, могут сломать макет. Например, если ваш вертикальный вид переменной не имеет явного ограничения, возможно, что IB добавит автоматический, чтобы сделать макет недвусмысленным. Позже, когда вы попытаетесь изменить размер этого представления, установив на него другое ограничение, вы получите ошибку автомакета.

Одним из возможных решений (за исключением внедрения -intrinsicContentSize и/или другого подкласса) является выслеживание в IB всех автоматических ограничений, которые могут помешать вашему макету и попытаться установить явные на свои места с более низкими приоритетами. Это не работает все время.

Другим жестоким решением является удаление всех ограничений в вашем -awakeFromNib, а затем установка только тех, которые вам нужны. Конечно, вы можете попробовать программно только те ограничения, которые стоят на вашем пути, но это не является надежным, потому что в следующий раз, когда вы что-то измените в .xib, проблема может появиться в совершенно другом месте.

Как правило, мне приходилось делать немного, чтобы все работало нормально.

+0

Я удалил все ограничения в -awakeFromNib и программно создал те, которые мне нужны. Я по-прежнему убежден, что существуют ограничения между оконным фреймом и окном contentView, которые находятся за пределами моего/нашего элемента управления, которые бесполезны с вами в таких случаях. В любом случае решение, которое я поставил на github, указанное в моем ответе выше (с подклассом NSView, over-ridden intrinsicContentSize) работает нормально для меня. – pjv

+0

Единственная ситуация, в которой у меня были проблемы с ограничениями между оконным фреймом и представлением содержимого, когда я включил панель инспектора для текстового представления, но это была какая-то ошибка, я полагаю. У меня почти такая же конфигурация, как у вас (своего рода вертикальный аккордеон, полностью реализованный с ограничениями, мне не пришлось реализовывать '-intrinsicContentSize', но мне приходилось играть с приоритетами. – skh