Frage

Ich mag RBSplitView mit NSSplitView in meinem bestehenden Projekt ersetzen. Die Anwendung ist nur jetzt Leopard und ich möchte RBSplitView mit der neue NSSplitView ausgeliefert mit Leopard ersetzen.

Allerdings bin ich RBSplitView die handliche Methoden expand und collapse in NSSplitView fehlt. Wie kann ich Teile NSSplitView programmatisch erweitern oder reduzieren?

War es hilfreich?

Lösung

Ich habe gerade programmatische Auf- und Zuklappen von NSSplitView zu arbeiten. Ich habe auch meine NSSplitView Aufklappen / Zuklappen ein Subview konfiguriert, wenn der Teiler doppelgeklickt wird, so wollte ich das mit dieser Funktion schön spielen (und es scheint). Dies ist, was ich getan habe:

(in diesem Beispiel splitView ist die NSSplitView selbst, splitViewSubViewLeft ist die subview Ich möchte zeigen / Zusammenbruch und lastSplitViewSubViewLeftWidth wird eine Instanz-Variable vom Typ CGFloat.)

// subscribe to splitView's notification of subviews resizing
// (I do this in -(void)awakeFromNib)
[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(mainSplitViewWillResizeSubviewsHandler:)
 name:NSSplitViewWillResizeSubviewsNotification
 object:splitView
 ];

// this is the handler the above snippet refers to
- (void) mainSplitViewWillResizeSubviewsHandler:(id)object
{
    lastSplitViewSubViewLeftWidth = [splitViewSubViewLeft frame].size.width;
}

// wire this to the UI control you wish to use to toggle the
// expanded/collapsed state of splitViewSubViewLeft
- (IBAction) toggleLeftSubView:(id)sender
{
    [splitView adjustSubviews];
    if ([splitView isSubviewCollapsed:splitViewSubViewLeft])
        [splitView
         setPosition:lastSplitViewSubViewLeftWidth
         ofDividerAtIndex:0
         ];
    else
        [splitView
         setPosition:[splitView minPossiblePositionOfDividerAtIndex:0]
         ofDividerAtIndex:0
         ];
}

Andere Tipps

Sie einfach ausblenden subview Sie ausblenden möchten, z.

[aSubViewToCollapse setHidden:YES];

Sie möchten vielleicht auch die delegierte Methode implementieren - (BOOL) SPLITVIEW-. ShouldHideDividerAtIndex: JA zurückzukehren, um den Teiler zu verstecken, wenn eine kollabierte

habe ich versucht, die Lösung oben, und fand es nicht funktioniert hat, wie isSubviewCollapsed nie JA zurückgegeben

Eine Kombination der Vorschläge ergab ein Ergebnis, das funktioniert

if ([splitViewTop isHidden]) {
    [splitViewTop setHidden:NO];
    [split
     setPosition:previousSplitViewHeight
     ofDividerAtIndex:0];
}
else {
    [splitViewTop setHidden:YES];
}
[split adjustSubviews];

Nach den Vorschlägen etwas experimentieren war dies die einfachste Lösung, die ich gefunden:

-(void)toggleCollapsibleView:(ib)sender {
   [collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
   [splitView adjustSubviews];
}

Die Funktion ist eine frei wählbare erstes responder Aktion. Es wird von einem Menüpunkt (oder Tastendruck) ausgelöst. Die collapsibleView ist ein Subview in der SPLITVIEW- beide in IB mit ihren Eigenschaften verbunden sind.

In El Capitan, dies hat den Trick für mich.

splitViewItem.collapsed = YES;

NSSplitView tatsächlich hat eine Private Methode -(void)_setSubview:(NSView *)view isCollapsed:(BOOL)collapsed, das dies tut. Diejenigen, die möchten alle Warnungen ignorieren gegen die Verwendung von privaten Methoden, siehe:

- (void)toggleSubview:(NSView *)view {
    SEL selector = @selector(_setSubview:isCollapsed:);
    NSMethodSignature *signature = [NSSplitView instanceMethodSignatureForSelector:selector];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    [invocation setArgument:&view atIndex:2];
    BOOL arg = ![self isSubviewCollapsed:view];
    [invocation setArgument:&arg atIndex:3];
    [invocation invoke];
}

I umgesetzt dies als eine Kategorie auf NSSplitView. Das einzige Problem ist, dass Xcode eine Warnung über _setSubview:isCollapsed: gibt nicht deklariert zu werden ... Ich bin nicht wirklich sicher, wie um das zu bekommen.


El Capitan-Update

Ich habe keinen Code für OS X in ~ 2 Jahren geschrieben jetzt so habe ich nicht in der Lage, dies zu überprüfen, aber nach

In macOS Sierra wird die collapsed Eigenschaft auf isCollapsed geändert. Ist gerade nach vorne nur die Eigenschaft auf true oder false. Der folgende Code ist aus meiner WindowController, wo ich zwei SplitViewItems haben.

@IBAction func toggleMap(_ sender: Any) {
    if let splitViewController = contentViewController as? NSSplitViewController {
        let splitViewItem = splitViewController.splitViewItems
        if splitViewItem.first!.isCollapsed {
            splitViewItem.first!.isCollapsed = false
        } else if splitViewItem.last!.isCollapsed {
            splitViewItem.last!.isCollapsed = false
        } else {
            if splitViewItem.first!.isCollapsed {
                splitViewItem.first!.isCollapsed = false
            }
            splitViewItem.last!.isCollapsed = true
        }
    }
}

Ich empfehle NSSplitViewController zu verwenden, anstatt, und NSSplitViewItem.isCollapsed sie zu kontrollieren. Dies ist nur Arbeit.

let item: NSSplitViewItem = ...
item.isCollapsed = true

Um dies richtig zu arbeiten, müssen Sie mit hauptsächlich View-Controller Split-UI-Komponenten konfigurieren. Andernfalls kann es gebrochen werden.

Sie könnten Brandon versuchen Walkin BWToolKit .

Die BWSplitView Klasse hat eine Methode

- (IBAction)toggleCollapse:(id)sender;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top