Настройте NSSplitView с тремя подвидами, такими как mail.app

Можно ли настроить разделенное представление с 3 подвидами с помощью ограничений автоматического макета, например, в mail.app? Что я имею в виду: когда пользователь изменяет размер окна, только самое правое подвид изменяет его размер, когда пользователь перетаскивает разделитель между самым левым и средним подвидами, только левый и правый подвиды изменяют свой размер, и когда пользователь перетаскивает разделитель между средним и правые подвиды изменяют размер только этих подвидов. Если можно то как сделать. Я думаю, что эта задача может быть выполнена по приоритету ограничений, но я с этим спутал. Спасибо!


person Nikolai Nagornyi    schedule 09.07.2013    source источник
comment
Точно не знаю, но сомневаюсь. В моем приложении есть 3 панели (разделенное представление, содержащее другое разделенное представление), и мне пришлось использовать методы делегата разделенного представления, чтобы контролировать (т.е. ограничивать) изменение размера пользователя.   -  person trojanfoe    schedule 09.07.2013
comment
Хорошая идея. Я думал об этом. Но я все еще думаю, что это возможно реализовать с ограничением макета...   -  person Nikolai Nagornyi    schedule 09.07.2013
comment
Учитывая, что NSSplitView предоставляет делегат именно для этой цели (ну, среди прочего), я думаю, вы будете плыть против течения.   -  person trojanfoe    schedule 09.07.2013


Ответы (2)


Я нашел решение без использования ограничений автоматического макета. Я работаю с Rubymotion, поэтому мое решение на Ruby, но его можно легко перевести на Objective-C.

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

Последний пункт, упомянутый в вопросе, то есть when the user drags the divider between the middle and the right subviews only these subviews change size - это поведение по умолчанию для NSSplitView, поэтому здесь нечего делать.

Наконец, чтобы изменить размер только самого правого подпредставления, когда пользователь изменяет размер окна, я реализовал метод делегата splitView:resizeSubviewsWithOldSize::

def splitView(splitView, resizeSubviewsWithOldSize:oldSize)
  sv1 = splitView.subviews[0]
  sv2 = splitView.subviews[1]

  leftFrame = sv1.frame
  rightFrame = sv2.frame
  newFrame = splitView.frame

  leftFrame.size.height = newFrame.size.height
  rightFrame.size.height = newFrame.size.height

  leftFrame.origin = NSMakePoint(0,0)
  ## 1 is the NSSplitView divider width
  rightFrame.size.width = newFrame.size.width - leftFrame.size.width -  1
  rightFrame.origin.x = leftFrame.size.width + 1

  sv1.setFrame(leftFrame)
  sv2.setFrame(rightFrame)
end

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

person siekfried    schedule 19.09.2013

С автоматической компоновкой вы можете установить приоритет удержания каждого разделителя в NSSplitView. Вы можете сделать это в коде с помощью методов делегата или в построителе интерфейса в Xcode.

person uchuugaka    schedule 19.09.2013