2012-04-04 10 views
5

Tengo una clase NSView que se encarga de una vista personalizada creada en el archivo nib.Crear NSScrollView de forma programada en un NSView - Cocoa

Ahora quiero agregar un NSScrollView a la vista personalizada, pero necesito hacerlo programáticamente y no usar el Constructor de interfaz (Incrustar en vista de desplazamiento).

He encontrado este código:

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

Suponiendo Declaro como IBOutlets las variables 'mainWindow' y 'ScrollView' anterior, ¿cómo hago para conectarlos a los componentes adecuados en el Interface Builder? ¿Tiene sentido hacerlo de esta manera?

¿O existe una mejor manera de agregar una vista de desplazamiento programáticamente?

¡Gracias!

P.S. No puedo conectarlos de la forma habitual porque no puedo crear un Objeto NSObject desde el Generador de Interfaces, o usar el Propietario del Archivo.

+0

Si crea puntos de vista mediante programación no "conectar" con el constructor de interfaces – Otium

+3

¿Qué? Por supuesto, puede interrelacionar vistas programáticas con vistas generadas por el constructor de interfaz. – ctpenrose

Respuesta

7

Este fragmento de código debe demostrar cómo crear un NSScrollView programáticamente y usarlo para mostrar cualquier vista, ya sea desde una punta o desde un código. En el caso de una vista generada por plumillas, simplemente necesita cargar el archivo plumilla en su vista personalizada anterior, y tener una salida a su vista personalizada (outletToCustomViewLoadedFromNib) hecha al Propietario del archivo.

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 tiene una guía sobre el tema, que no vincularé ya que requiere acceso de Apple Developer Connection y sus enlaces se rompen con frecuencia. Se titula "Creación y configuración de una vista de desplazamiento" y actualmente se puede encontrar buscando su título con Google.

+0

¡Muchas gracias! – Kevin

2

Tengo un difícil de crear NSScrollView con AutoLayout mediante programación, pero finalmente lo tengo funcionar. Esta es la versión 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

¡He buscado esto tanto tiempo! ¡Muchas gracias por proporcionar esto, era exactamente lo que estaba buscando y me ahorró horas! – chl

Cuestiones relacionadas