2012-03-23 48 views
6

Mamy rodzica Split widok (NSSplitView) i dwa subviews, Content i SideBar (pasek boczny jest po prawej stronie).Jak zmienić widoczność NSSplitView subView + ukryć dzielnik podziału ekranu?

Jaki byłby najlepszy sposób, aby zmienić widok SideBar na kakao?

  • ja naprawdę kocham to, czy zaproponowane rozwiązanie zawiera animację
  • naprawdę nie potrzeba żadnych sugestii związanych z wtyczek, etc (np BWToolkit)

Podpowiedź: I Próbowałem to zrobić, ale nadal miałem problemy z ukrywaniem dzielnika NSSplitView. Jak mogłem to zrobić, jednocześnie ukrywając go?

Odpowiedz

6

Oto całkiem przyzwoity samouczek, który pokazuje, jak to zrobić: Unraveling the Mysteries of NSSplitView.

Ukrywanie dzielnika odbywa się za pomocą metody delegata NSSplitView splitView:shouldHideDividerAtIndex:.

Będziesz musiał samodzielnie animować zmianę rozmiaru ramki, jeśli nie podoba ci się sposób, w jaki robi to NSSplitView.

+0

Dzięki, Nathan! To wydaje się mieć sens ... –

3

Napisałem wersję Swift treści w linku z odpowiedzi @ Nathana, która działa dla mnie. W związku z moim przykładzie splitView jest ustawiony w innym miejscu, prawdopodobnie jako właściwość instancji w klasie obejmujący:

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() 
} 

Funkcje te będą prawdopodobnie metody w klasie, są one dla mnie. Jeśli Twój splitView może być nil, musisz oczywiście to sprawdzić. Zakłada to również, że masz dwa subviews i jeden pod indeksem 1, tutaj jako sidePanel to ten, który chcesz zwinąć.

2

Dostałem trochę artefaktów z powyższym kodem, prawdopodobnie dlatego, że było to poza kontekstem. Jestem pewien, że działa tam, gdzie ma być. W każdym razie, tutaj jest to bardzo uproszczone wdrożenie:

// 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 
    } 
} 

Aby zobaczyć dobry przykład za pomocą animacji, sterowania kliknij aby pobrać this file.

2

W Xcode 9.0 ze scenami dialogowymi otwórz aplikację Scena wybierz Widok-> Menu-> Pokaż pasek boczny. Kliknij przycisk Pokaż pasek boczny CTRL, w wysłanych działaniach usuń dostarczony, kliknij x. Z okręgu CTRL przeciągnij do First Responder w scenie aplikacji i wybierz toggleSideBar, aby się połączyć. Otwórz scenopis i wybierz pierwszy element widoku podzielonego, aw inspektorze atrybutów zmień zachowanie z domyślnego na pasek boczny. Uruchom i spróbuj z elementem menu widoku pokaż/ukryj. Wszystko robione w konstruktorze interfejsów bez kodu. toggleSideBar obsługuje pierwszy element widoku podzielonego. https://github.com/Dis3buted/SplitViewController

+0

Świetny przykład, dzięki! –

Powiązane problemy