Можно ли настроить разделенное представление с 3 подвидами с помощью ограничений автоматического макета, например, в mail.app? Что я имею в виду: когда пользователь изменяет размер окна, только самое правое подвид изменяет его размер, когда пользователь перетаскивает разделитель между самым левым и средним подвидами, только левый и правый подвиды изменяют свой размер, и когда пользователь перетаскивает разделитель между средним и правые подвиды изменяют размер только этих подвидов. Если можно то как сделать. Я думаю, что эта задача может быть выполнена по приоритету ограничений, но я с этим спутал. Спасибо!
Настройте NSSplitView с тремя подвидами, такими как mail.app
Ответы (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
И вуаля! Мне потребовалось некоторое время, чтобы заставить его работать, поэтому я надеюсь, что это сэкономит время другим людям.
С автоматической компоновкой вы можете установить приоритет удержания каждого разделителя в NSSplitView. Вы можете сделать это в коде с помощью методов делегата или в построителе интерфейса в Xcode.
NSSplitViewпредоставляет делегат именно для этой цели (ну, среди прочего), я думаю, вы будете плыть против течения. - person trojanfoe   schedule 09.07.2013