Как скрыть разделитель nssplitview? - PullRequest
3 голосов
/ 24 декабря 2009

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

- (BOOL)splitView:(NSSplitView *)splitView shouldHideDividerAtIndex:(NSInteger)dividerIndex
{
   if (A) 
       return YES;
   else 
       return NO;
}

но это не сработало, почему? Как использовать этот метод? Большое спасибо!

Ответы [ 5 ]

9 голосов
/ 14 марта 2015

В дополнение к примечанию @ carmin выше, переопределение свойства NSSplitView dividerThickness - единственное, что сработало для меня (в частности, возвращение NSRectZero из splitView :ffectiveRect: forDrawnRect: ofDividerAtIndex: метод делегата NSSplitView - , как подробно здесь - не сработало и привело к тому, что плавающие разделители были отделены от самих представлений).

Вот код в Swift:

override var dividerThickness:CGFloat
{
    get { return 0.0 }
}
4 голосов
/ 24 декабря 2009

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

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

3 голосов
/ 03 ноября 2013

Вы можете перегрузить NSSplitView-dividerThickness и вернуть 0, чтобы скрыть все разделители. Вы можете перегрузить NSSplitView-drawDividerInRect: чтобы иметь индивидуальный контроль над разделителями (выбирая, разрешать ли super рисовать разделитель или нет). Эти варианты работают даже тогда, когда подвиды видны.

2 голосов
/ 29 февраля 2016

Вот как это сделать в Obj-C, который не включает создание подклассов. Убедитесь, что у вас подключен делегат SplitView в IB.

Тогда в вашем классе делегата:

 -(NSRect)splitView:(NSSplitView *)splitView effectiveRect:(NSRect)proposedEffectiveRect forDrawnRect:(NSRect)drawnRect ofDividerAtIndex:(NSInteger)dividerIndex 
{

    if ( [_splitView subviews][1].isHidden ==YES || [[_splitView subviews][1] frame].size.height < 50) //closed or almost closed
    {

    return NSZeroRect;

    }

    return proposedEffectiveRect;

}



- (BOOL)splitView:(NSSplitView *)splitView shouldHideDividerAtIndex:(NSInteger)dividerIndex 
{

    if ( [_splitView subviews][1].isHidden ==YES || [[_splitView subviews][1] frame].size.height < 50)
   {

    return YES;
   }

    return NO;
}

Это позволит скрыть разделитель, когда разделенное представление закрыто, но показать его, когда оно открыто.

Если вы не хотите, чтобы они могли перетаскивать его, даже когда он открыт, просто вырежьте весь код первого метода и верните только NSZeroRect. Сделайте то же самое во втором методе и верните только YES.

0 голосов
/ 06 ноября 2015

Ради потомков, работая со swift 2, вы можете вызвать делегатскую функцию splitView (_ :ffectiveRect: forDrawnRect: ofDividerAtIndex :) и просто вернуть ей пустой NSRect

func splitView(splitView: NSSplitView, effectiveRect proposedEffectiveRect: NSRect, forDrawnRect drawnRect: NSRect, ofDividerAtIndex dividerIndex: Int) -> NSRect {
    return NSRect.init()
}
...