Wie zu erweitern und programmatisch Teile NSSplitView zu kollabieren?
-
06-09-2019 - |
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?
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 SplitViewItem
s 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
}
}
}
In swift das funktioniert
func togglePanel() {
let splitViewItem = self.mySplitView.arrangedSubviews
if mySplitView.isSubviewCollapsed(outline.view){
splitViewItem[0].hidden = false
} else {
splitViewItem[0].hidden = true
}
nennen dies von IBAction, Umriss ist ein OutlineViewController mit eigenen xib und wir brauchen die Ansicht daher outline.view, es einfach zu halten, aber hoffen, dass Sie auf die Idee
@IBAction func segmentAction(sender: NSSegmentedControl) {
splitVC?.togglePanel(sender.selectedSegment)
}
und
func togglePanel(segmentID: Int) {
let splitViewItem = self.mySplitView.arrangedSubviews
switch segmentID {
case segmentID:
if mySplitView.isSubviewCollapsed(splitViewItem[segmentID]) {
splitViewItem[segmentID].hidden = false
} else {
splitViewItem[segmentID].hidden = true
}
default:
break
}
}
Und implementieren Delegat
func splitView(splitView: NSSplitView, shouldHideDividerAtIndex dividerIndex: Int) -> Bool {
return true
}
Und mit 10.11 Sie können nur toggleSidebar Aktion Methode verwenden. Wie umschalten Sichtbarkeit von NSSplitView SubView + Pane Splitter Teiler verstecken? https://github.com/Dis3buted/SplitViewController
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;