2012-03-23 13 views
6

Abbiamo una vista genitore Split (NSSplitView) e due sottoview, Content e SideBar (la barra laterale è sulla destra).Come attivare la visibilità di NSSplitView subView + hide Riquadro divisore di separazione?

Quale sarebbe il modo ottimale di cacao per attivare la vista SideBar?

  • mi piacerebbe molto, se la soluzione suggerita include animazione
  • Io davvero non hanno bisogno di suggerimenti relativi ai plugin esterni, ecc (ad esempio BWToolkit)

SUGGERIMENTO: I Ho provato a farlo, ma ho comunque avuto problemi a nascondere anche il divisore di NSSplitView. Come potrei farlo, nascondendolo allo stesso tempo?

risposta

6

Ecco un tutorial abbastanza decente che mostra come eseguire questa operazione: Unraveling the Mysteries of NSSplitView.

L'occultamento del divisore viene eseguito nel metodo delegato di NSSplitView splitView:shouldHideDividerAtIndex:.

Dovrai animare le dimensioni della cornice cambiando te stesso se non ti piace il modo in cui NSSplitView lo fa.

+0

Grazie, Nathan! Questo sembra avere un senso ... –

3

Ho scritto una versione Swift del contenuto nel collegamento dalla risposta di @ Nathan che funziona per me. Nel contesto del mio esempio splitView è impostato altrove, probabilmente come una proprietà di istanza su una classe totalizzante:

func toggleSidebar() { 
    if splitView.isSubviewCollapsed(splitView.subviews[1] as NSView) { 
     openSidebar() 
    } else { 
     closeSidebar() 
    } 
} 

func closeSidebar() { 
    let mainView = splitView.subviews[0] as NSView 
    let sidepanel = splitView.subviews[1] as NSView 
    sidepanel.hidden = true 
    let viewFrame = splitView.frame 
    mainView.frame.size = NSMakeSize(viewFrame.size.width, viewFrame.size.height) 
    splitView.display() 
} 

func openSidebar() { 
    let sidepanel = splitView.subviews[1] as NSView 
    sidepanel.hidden = false 
    let viewFrame = splitView.frame 
    sidepanel.frame.size = NSMakeSize(viewFrame.size.width, 200) 
    splitView.display() 
} 

Queste funzioni saranno probabilmente i metodi in una classe, sono per me. Se il tuo splitView può essere nil devi ovviamente verificarlo. Questo presuppone anche che tu abbia due sottoview e quella nell'indice 1, qui come sidePanel è quello che vuoi collassare.

2

Ho alcuni artefatti con il codice sopra, probabilmente perché era fuori dal contesto. Sono certo che funziona dove era destinato. In ogni caso, ecco un implementazione molto snella:

// this is the declaration of a left vertical subview of 
// 'splitViewController', which is the name of the split view's outlet 

var leftView: NSView { 
    return self.splitViewController.subviews[0] as NSView 
    } 

// here is the action of a button that toggles the left vertical subview 
// the left subview is always restored to 100 pixels here 

@IBAction func someButton(sender: AnyObject) { 

    if splitViewController.isSubviewCollapsed(leftView) { 
     splitViewController.setPosition(100, ofDividerAtIndex: 0) 
     leftView.hidden = false 
    } else { 
     splitViewController.setPosition(0, ofDividerAtIndex: 0) 
     leftView.hidden = true 
    } 
} 

Per vedere un buon esempio utilizzando animazioni, control-click per scaricare this file.

2

In Xcode 9.0 con gli Storyboard aprire la scena applicazione selezionare Visualizza-> Menu-> Mostra barra laterale. CTRL-clic Mostra barra laterale, nelle azioni invia eliminate quella fornita, fare clic su x. Dal cerchio, CTRL trascina su First Responder nella scena dell'applicazione e seleziona toggleSideBar per connettersi. Apri lo storyboard e seleziona il primo elemento della vista divisa e, nel comportamento degli ispettori, modifica il comportamento da predefinito a barra laterale. Esegui e prova con la voce di menu Visualizza mostra/nascondi. Tutto fatto nel costruttore di interfacce senza codice. toggleSideBar gestisce il primo elemento della vista divisa. https://github.com/Dis3buted/SplitViewController

+0

Ottimo esempio, grazie! –