2012-09-11 11 views
16

Dal momento che il modello di una X app OS in Xcode sembra essere simile a un modello di applicazione vuota, il seguente viene utilizzata per aggiungere una vista e un pulsante (cercando di non usare Interface Builder per ora):Come aggiungere un NSView a NSWindow in un'app Cocoa?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{  
    NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 

    view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

    [self.window.contentView addSubview:view]; 

    NSRect frame = NSMakeRect(10, 40, 90, 40); 
    NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
    pushButton.bezelStyle = NSRoundedBezelStyle; 

    [self.window.contentView addSubview:pushButton]; 

    NSLog(@"subviews are %@", [self.window.contentView subviews]); 
} 

Codice simile su iOS dovrebbe aver prodotto una casella gialla e un pulsante, ma il codice sopra produce solo un pulsante, ma la vista non verrà visualizzata. C'è qualcosa di sbagliato nel codice sopra e come farlo mostrare la vista con uno sfondo giallo?

risposta

16

Utilizzare il metodo setWantsLayer: della classe NSView.

NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 
[view setWantsLayer:YES]; 
view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

[self.window.contentView addSubview:view]; 

NSRect frame = NSMakeRect(10, 40, 90, 40); 
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
pushButton.bezelStyle = NSRoundedBezelStyle; 

[self.window.contentView addSubview:pushButton]; 

NSLog(@"subviews are %@", [self.window.contentView subviews]); 
+0

NSView non ha una proprietà backgroundColor, a quanto pare. Mi manca "UIKit' ...! –

+5

Questa risposta è male. Sei [esplicitamente detto] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html # // apple_ref/doc/uid/20000014-SW61) per non toccare il livello di supporto in una vista con strato (a guarda dove hai usato '-setWantsLayer:' senza chiamare '-setLayer:' prima). Dai documenti: ** Quando utilizzi le viste supportate dal livello, non devi mai interagire direttamente con il livello ** –

+0

, vuoi prima istanziare un CALayer, impostarlo su view.layer, quindi impostare wantLayer su YES e impostare il colore di sfondo ? –

5

NSView s in Cocoa sono, per impostazione predefinita, non supportati da layer. Ho il sospetto che se si digita

NSLog(@"%@", view.layer); 

si vedrà che è nil.

In iOS, tutte le viste hanno livelli. Ma su OS X, le viste non hanno livelli. Inoltre, su OS X ci sono 2 "modalità" di viste supportate da layer. Esiste una cosiddetta "visualizzazione con layer" e una "visualizzazione hosting layer". Una vista con strato di livello utilizza un livello CoreAnimation per memorizzare nella cache i dati disegnati, ma non è consentito interagire con il livello in alcun modo. Una vista di hosting del livello utilizza uno CALayer che fornisci esplicitamente e potresti rovinare tutto ciò che desideri. Tuttavia, con una vista di hosting del livello, è possibile che non sia aggiungere immagini secondarie o utilizzare il meccanismo di disegno incorporato NSView. Una vista di hosting del livello deve essere utilizzata solo come radice di una gerarchia di livelli CoreAnimation.

Dato tutto questo, probabilmente dovresti evitare di usare CoreAnimation per la tua vista.

È possibile che un NSBox faccia ciò che si desidera. È possibile impostare un colore di riempimento, disattivare il bordo e impostare lo stile su personalizzato. Non sono sicuro al 100% che disegni come un semplice rettangolo di colore pieno. In alternativa puoi definire la sottoclasse NSView che disegna un colore in -drawRect:.

+0

fai a sapere come fare lo show vista con uno sfondo giallo? –

+0

@JeremyL: Sto facendo ricerche per ora. Io principalmente faccio iOS, quindi per favore aspetta. –

+0

@JeremyL, faccio sempre come menzionato Kevin, uso una NSBox invece di una vista personalizzata. Basta impostare il suo tipo su personalizzato, quindi puoi (in IB o codice) impostare il colore di sfondo, un colore del bordo (o nessun bordo se lo desideri) e gli angoli arrotondati se lo desideri. – rdelmar

5

Per espandere su suggerimento di Kevin Ballard, il modo classico per farlo è quello di sottoclasse NSView e l'override del metodo -drawRect:. NSRectFill è una funzione molto comoda per il riempimento di un rettangolo senza dover creare un tracciato Bezier:

- (void)drawRect:(NSRect)rect 
{ 
    [[NSColor yellowColor] set]; 
    NSRectFill(rect); 
} 
Problemi correlati