2012-04-04 9 views
5

Ho una classe NSView che si occupa di una vista personalizzata creata nel file pennino.Creare NSScrollView in modo programmatico in un NSView - Cocoa

Ora voglio aggiungere un NSScrollView alla visualizzazione personalizzata, ma ho bisogno di farlo a livello di programmazione e non di utilizzare Interface Builder (Incorpora nella vista di scorrimento).

Ho trovato questo codice:

NSView *windowContentView = [mainWindow contentView]; 
NSRect windowContentBounds = [windowContentView bounds]; 
scrollView = [[NSScrollView alloc] init]; 
[scrollView setBorderType:NSNoBorder]; 
[scrollView setHasVerticalScroller:YES]; 
[scrollView setBounds: windowContentBounds]; 
[windowContentView addSubview:scrollView]; 

Assumendo dichiaro come IBOutlets le variabili 'MainWindow' e 'ScrollView' sopra, come potrei fare per collegarli ai componenti corretti in Interface Builder? Ha senso farlo in questo modo?

Oppure c'è un modo migliore per aggiungere una vista di scorrimento a livello di codice?

Grazie!

P.S. Non riesco a collegarli nel solito modo perché non posso creare un oggetto NSObject da Interface Builder o utilizzare il proprietario del file ..

+0

Se si crea una vista a livello di codice non "connettersi" con il costruttore di interfaccia – Otium

+3

Cosa? Ovviamente è possibile correlare le viste programmatiche con le viste generate dal generatore di interfacce. – ctpenrose

risposta

7

Questo frammento di codice dovrebbe dimostrare come creare un NSScrollView a livello di codice e utilizzarlo per visualizzare qualsiasi vista, sia da un pennino o da un codice. Nel caso di una vista generata da pennino, è sufficiente caricare prima il file pennino nella vista personalizzata e disporre di una presa sulla vista personalizzata (outletToCustomViewLoadedFromNib) creata su Proprietario file.

NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:[[mainWindow contentView] frame]]; 

// configure the scroll view 
[scrollView setBorderType:NSNoBorder]; 
[scrollView setHasVerticalScroller:YES]; 

// embed your custom view in the scroll view 
[scrollView setDocumentView:outletToCustomViewLoadedFromNib]; 

// set the scroll view as the content view of your window 
[mainWindow setContentView:scrollView]; 

Apple ha una guida su questo argomento, che non voglio creare un collegamento a quanto richiede l'accesso Developer Connection di Apple e dei loro legami pausa di frequente. Si intitola "Creazione e configurazione di una vista di scorrimento" e al momento può essere trovato cercando il suo titolo utilizzando Google.

+0

Grazie mille! – Kevin

2

Ho difficoltà a creare NSScrollView con AutoLayout a livello di codice, ma finalmente ho funzionato. Questa è la versione Swift.

// Initial scrollview 
    let scrollView = NSScrollView() 
    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.borderType = .noBorder 
    scrollView.backgroundColor = NSColor.gray 
    scrollView.hasVerticalScroller = true 

    window.contentView?.addSubview(scrollView) 
    window.contentView?.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView])) 
    window.contentView?.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView])) 

    // Initial clip view 
    let clipView = NSClipView() 
    clipView.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.contentView = clipView 
    scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: scrollView, attribute: .left, multiplier: 1.0, constant: 0)) 
    scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: scrollView, attribute: .top, multiplier: 1.0, constant: 0)) 
    scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: scrollView, attribute: .right, multiplier: 1.0, constant: 0)) 
    scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1.0, constant: 0)) 

    // Initial document view 
    let documentView = NSView() 
    documentView.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.documentView = documentView 
    clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: documentView, attribute: .left, multiplier: 1.0, constant: 0)) 
    clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: documentView, attribute: .top, multiplier: 1.0, constant: 0)) 
    clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: documentView, attribute: .right, multiplier: 1.0, constant: 0)) 

    // Subview1 
    let view1 = NSView() 
    view1.translatesAutoresizingMaskIntoConstraints = false 
    view1.wantsLayer = true 
    view1.layer?.backgroundColor = NSColor.red.cgColor 
    documentView.addSubview(view1) 
    documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view1]|", options: [], metrics: nil, views: ["view1": view1])) 

    // Subview2 
    let view2 = NSView() 
    view2.translatesAutoresizingMaskIntoConstraints = false 
    view2.wantsLayer = true 
    view2.layer?.backgroundColor = NSColor.green.cgColor 
    documentView.addSubview(view2) 
    documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view2]|", options: [], metrics: nil, views: ["view2": view2])) 

    // Subview3 
    let view3 = NSView() 
    view3.translatesAutoresizingMaskIntoConstraints = false 
    view3.wantsLayer = true 
    view3.layer?.backgroundColor = NSColor.blue.cgColor 
    documentView.addSubview(view3) 
    documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view3]|", options: [], metrics: nil, views: ["view3": view3])) 

    // Vertical autolayout 
    documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view1(==100)][view2(==200)][view3(==300)]", options: [], metrics: nil, views: ["view1": view1, "view2": view2, "view3": view3])) 
    documentView.addConstraint(NSLayoutConstraint(item: documentView, attribute: .bottom, relatedBy: .equal, toItem: view3, attribute: .bottom, multiplier: 1.0, constant: 0)) 

enter image description here

+1

L'ho cercato così a lungo! Grazie mille per aver fornito questo, era esattamente quello che stavo cercando e mi ha salvato ore! – chl

Problemi correlati