2015-01-17 3 views
5

У меня есть время, создающее простой вид сплита. Первый вид сплита рухнул. Мне нужно установить для него минимальную ширину. Все, что я вижу в Интернете (мало для NSSplitViewController/NSSplitView), предназначено для Objective-C, помещает все в делегат приложения и использует XIB.Установка минимальной ширины NSSplitViews

Вот сценарий: Контроллер окна с segue контроллеру SplitView, который имеет два разделенных вида (2 контроллера вида).

В каком объекте должен быть NSSplitViewDelegate?

EDIT: Добавление фрагмента кода: Например, у меня есть это:

import Cocoa 

class ViewController: NSSplitViewController, NSSplitViewDelegate { 


    @IBOutlet weak var pdlSplitView: NSSplitView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     } 
    override func splitView(splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { 
     return proposedMinimumPosition + 200 
    } 

} 

Есть еще, что я не хватает?

Благодаря

UPDATE

Основываясь на комментариях ниже, я сделал изменения, но теперь я получаю sigAbort по определению класса для AppDelegate. Full code

ViewController:

import Cocoa 

class ViewController: NSSplitViewController, NSSplitViewDelegate { 


    @IBOutlet weak var pdlSplitView: NSSplitView! 

    let publicDataListings : PDL = PDL() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     self.pdlSplitView.delegate = self 

    } 

    override func splitView(splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { 
    return proposedMinimumPosition + 200 
    } 

} 

SidebarViewController:

import Cocoa 

class SidebarViewController: NSViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do view setup here. 
    } 


} 

DatasetViewController:

import Cocoa 

class DatasetViewController: NSViewController, NSSplitViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do view setup here. 
    } 

} 

Update Я забрал свой обычай NSSplitViewCont класса роликов и создал два класса NSSplitView, один с методом ограничения. Теперь я вижу, как подвидов, но они гораздо меньше, чем они должны быть:

enter image description here

Есть ли кто-нибудь на всех, что сделал это с Swift и раскадровки?

+0

Вы используете автоматическую компоновку? Какова более ранняя версия ОС, на которой вы хотите запустить приложение? Если вы используете таргетинг 10.8 или более поздней версии и используя автоматическую компоновку, разделенное представление будет соблюдать ограничения своих подзонов. Таким образом, минимальная ширина может быть неявной, потому что что-то внутри subview имеет внутреннюю ширину и сопротивляется сжатию и имеет передние и конечные ограничения для subview. Или вы можете создать явное ограничение ширины в подзаголовке, которое будет больше или равно некоторой константе. –

+0

Я в порядке с таргетингом 10.10+. Я пытаюсь сделать это в Свифт. Я пробовал применять ограничения, но они не придерживаются. Я знаю, что сейчас это мобильный мир, но, черт возьми, я бы заплатил за Sweet прямо сейчас. Тогда я поеду на гонки. –

+0

Если вы реализуете определенные методы делегата с разделенным представлением, тогда разделенный вид не будет использовать автоматическую компоновку. См. Примечания к выпуску AppKit для 10.8 для конкретной информации. Кроме того, я не уверен, что методы делегирования разделенного представления совместимы с 'NSSplitViewController'. Если удаление этого метода делегата не помогает, покажите ограничения, которые вы пытались настроить, и как вы это сделали. –

ответ

-2
  1. Установить NSSplitViewController как делегат NSSplitView (разделенное представление, которое вы хотите ограничить). В вашем случае это должно быть - в XIb зацепить выход делегата от NSSplitView для владельца файла (я предполагаю, что владелец файла NSSplitViewController подкласс)
  2. Реализовать

    - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex { ... } 
    

в NSSplitViewController

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSSplitViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSSplitViewDelegate/splitView:constrainMinCoordinate:ofSubviewAt:

+0

в XIB? Разве мы не должны использовать раскадровки? Вот где все сейчас. См. Мое изменение выше для кода, который у меня есть. –

+0

Вышеупомянутый код правильный, просто установите ViewController для делегирования разделенного представления, которое вы хотите ограничить. в ViewController: переопределить func viewDidLoad() { super.viewDidLoad() splitView.delegate = self; } –

+0

override func viewDidLoad() {super.viewDidLoad(); pdlSplitView.delegate = self; } –

16

Для установки минимальной ширины в раскадровке с автоматической компоновкой для NSSplitViewController/NSSplitView кодирования не требуется.

Выберите CustomView, для которого требуется минимальная ширина (например.200) и добавьте ограничение ширины к требуемому значению, которое добавит ограничение «Равное» (например, Custom View.Width равно 200).

Далее найдите это новое ограничение и измените отношение ограничения на «Больше или равно» (например, теперь у вас есть ширина ≥ 200).

Теперь у вас есть минимальная ширина в NSSplitView. Затем вы можете использовать поле «Приоритет» для разрешения любых конфликтов с любыми другими ограничениями автоматической компоновки.

+6

Спасибо. Это была полная тайна, пока вы не знаете, что она есть! :-) Это может помочь вашему ответу включить скриншот. – RichS

+0

Спасибо, я боролся с этим. Параметры> = и <= для ограничений трудно найти, если вы не знаете, что они существуют. –

Смежные вопросы