2015-01-17 14 views
5

Sto avendo un pò di tempo per impostare una semplice visualizzazione divisa. La prima vista divisa è compressa. Devo impostare una larghezza minima per questo. Tutto ciò che vedo online (scarso per NSSplitViewController/NSSplitView) è per Objective-C, mette tutto nell'app delegato e usa XIBs.Impostazione dell'ampiezza minima di NSSplitViews

Ecco lo scenario: Controller di finestra con un seguito a un controller SplitView, che ha due viste divise (2 controller di vista).

Quale oggetto deve avere il NSSplitViewDelegate?

EDIT: Aggiunta di frammento di codice: Per esempio, ho questo:

import Cocoa 

class ViewController: NSSplitViewController, NSSplitViewDelegate { 


    @IBOutlet weak var pdlSplitView: NSSplitView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     } 
    override func splitView(splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { 
     return proposedMinimumPosition + 200 
    } 

} 

c'è di più che mi manca?

Grazie

UPDATE

Sulla base commenti qui sotto, ho fatto un cambiamento, ma ora ho un sigAbort sulla definizione di classe per l'AppDelegate. Full code

ViewController:

import Cocoa 

class ViewController: NSSplitViewController, NSSplitViewDelegate { 


    @IBOutlet weak var pdlSplitView: NSSplitView! 

    let publicDataListings : PDL = PDL() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     self.pdlSplitView.delegate = self 

    } 

    override func splitView(splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { 
    return proposedMinimumPosition + 200 
    } 

} 

SidebarViewController:

import Cocoa 

class SidebarViewController: NSViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do view setup here. 
    } 


} 

DatasetViewController:

import Cocoa 

class DatasetViewController: NSViewController, NSSplitViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do view setup here. 
    } 

} 

Aggiornamento ho portato via mia abitudine NSSplitViewCont roller class e creato due classi NSSplitView, una con il metodo constraint. Ora, io vedo due subviews, ma sono molto più piccole di quanto dovrebbero essere:

enter image description here

C'è qualcuno a tutti che ha fatto questo con Swift e storyboard?

+0

Si sta utilizzando il layout automatico? Qual è la versione precedente del sistema operativo su cui desideri eseguire la tua app? Se utilizzi il targeting 10.8 o successivo e utilizzi il layout automatico, la visualizzazione divisa rispetterà i vincoli delle sue sottoview. Quindi, la larghezza minima potrebbe essere implicita perché qualcosa all'interno della sottoview ha una larghezza intrinseca e resiste alla compressione e ha vincoli iniziali e finali per la sottoview. Oppure è possibile creare un vincolo di larghezza esplicito nella sottoview che sia maggiore o uguale a qualche costante. –

+0

Sto bene con il targeting 10.10+. Sto provando a farlo in Swift. Ho provato ad applicare i vincoli, ma non si attaccano. So che ora è un mondo mobile, ma diamine, pagherei solo un SplitView Hello World in Swift proprio ora. Poi sarei partito per le gare. –

+0

Se si implementano determinati metodi di delega della vista divisa, la vista divisa non utilizzerà il layout automatico. Vedi le note di rilascio di AppKit per 10.8 per le specifiche. Inoltre, non sono sicuro che i metodi di delega della vista divisa siano compatibili con 'NSSplitViewController'. Se la rimozione di quel metodo di delega non aiuta, mostra i vincoli che hai provato a configurare e come lo hai fatto. –

risposta

-2
  1. Impostare NSSplitViewController come delegato di NSSplitView (la vista divisa che si desidera limitare). Nel tuo caso dovrebbe essere - nel XI ter agganciare l'uscita delegato del NSSplitView di file proprietario (credo che il proprietario del file è NSSplitViewController sottoclasse)
  2. Implementare

    - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex { ... } 
    

in NSSplitViewController

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSSplitViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSSplitViewDelegate/splitView:constrainMinCoordinate:ofSubviewAt:

+0

in XIB? Non dovremmo usare gli storyboard? Ecco dove è tutto in questo momento. Si prega di consultare la mia modifica sopra per il codice che attualmente ho. –

+0

Il codice sopra postato è corretto, basta impostare ViewController come delegato della vista divisa che si desidera limitare. in ViewController: override func viewDidLoad() { super.viewDidLoad() splitView.delegate = self; } –

+0

override func viewDidLoad() {super.viewDidLoad(); pdlSplitView.delegate = self; } –

16

Non è richiesta alcuna codifica per impostare una larghezza minima in uno storyboard con layout automatico per NSSplitViewController/NSSplitView.

Selezionare CustomView per cui è richiesta una larghezza minima (ad es.200) e aggiungere un vincolo di larghezza impostato sul valore richiesto che aggiungerà un vincolo "Uguale" (ad esempio, Vista personalizzata. Larghezza uguale a 200).

Successivamente, individuare il nuovo vincolo e modificare la relazione di vincolo in "Maggiore di o uguale a" (ad esempio, in questo modo si ha larghezza ≥ 200).

Ora si ha una larghezza minima in un NSSplitView. È quindi possibile utilizzare il campo Priorità per risolvere eventuali conflitti con qualsiasi altro vincolo di layout automatico.

+6

Grazie. Questo era un mistero completo, finché non sai che è lì! :-) Potrebbe aiutare la tua risposta a includere uno screenshot. – RichS

+0

Grazie, stavo lottando con questo. Le impostazioni> = e <= per i vincoli sono difficili da trovare se non sai che esistono. –