Как мне реализовать NSSplitView с 3 панелями с минимальными и максимальными размерами?
Я хочу реализовать 3-х вертикаль NSSplitView
(очень похоже на Mail.app). Я не совсем уверен, с чего начать. Я уверен, что мне нужно реализовать NSSplitViewDelegate
, но я не уверен, какие методы и / или их реализации.
Макет, который я хочу, следующий:
+----------+------------------+------------------------------------+
| | | |
| | | |
| | | |
| | | |
| Pane 1 | Pane 2 | Pane 3 |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------+------------------+------------------------------------+
Я хочу реализовать следующие ограничения для каждой панели:
- Панель 1: минимум 140pt. Максимум: 400pt.
- Панель 2: минимум 250pt.
- Панель 3: минимум 400pt.
Любые указатели будут высоко оценены.
4 ответа
Это довольно просто в Xcode 8.2.1
- Просто добавьте
Split View Controller
в Интерфейсном Разработчике. - Добавить дополнительный
View Controller
, - Crtl + нажатие мыши на
Split View Controller
и перетащите к дополнительномуView Controller
, - Выбрать
split items
,
Вот и все.
Чтобы обеспечить минимальный размер, проверьте созданный нами служебный класс https://github.com/incbee/BESplitViewConstraintEnforcer.
Кстати, если вы хотите избежать вложения разделенных видов и вместо этого добавить дополнительную панель в Интерфейсном Разработчике, перетащите новый вид в объект разделенного представления, как показано на снимке экрана ниже.
На самом деле, HTH вдохновил меня попробовать третью возможность в Интерфейсном Разработчике, и оказалось, что она прекрасно работает. В частности, перемещение одного разделителя не вносит никаких непреднамеренных изменений в другом месте, что может легко произойти, если вы вложите разделенные представления.
- Добавить
NSSplitView
к твоему окну, - Добавить
NSView
(пользовательский вид в IB) как дочерний элемент вида Split. Вы получите разделенное представление, которое имеет три, а не два подпредставления.
То же самое работает, если вы добавите еще NSSplitView
как ребенок, хотя вы должны быть осторожны, как вложенные разделенные представления влияют друг на друга. Изображение выше показывает, как это будет выглядеть в конструкторе интерфейсов, второе показывает результат в симуляторе.
Я думаю, что вы это решили. Во всяком случае, есть два пути. Первый аналогичен ответу выше, перетащите разделенное представление туда, куда вы хотите, и перетащите второе разделенное представление внутри одного из контейнеров (подпредставление разделенного просмотра). Иерархия представления похожа
Window
Window containerview
Splitview
Containerview_left | containerview_right
Splitview
Containerview_left | containerview_right
Если вы по коду, то вы создаете splitview, добавляете его как подпредставление окна, view. Затем вы создаете подпредставления splitview, добавляя их с помощью [splitview addubview], если вы добавляете три подпредставления, у вас есть два делителя. Иерархия отличается.
Window Window containerview
Splitview
Containerview_ind(0)| Containerview_ind(1) | Containerview_ind(2)
Это означает, что если вы хотите найти подпредставление, вы должны знать, как вы его создали.
НТН