2012-09-13 9 views
9

Ho creato un cacao app vuoto Xcode per OS X, e ha aggiunto:Come rendere NSView non ritaglia l'area di delimitazione?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)]; 
    self.view.wantsLayer = YES; 
    self.view.layer = [CALayer layer]; 
    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 1, 1, 1); 

    [self.window.contentView addSubview:self.view]; 
} 

Ma sfondo del livello ruotata è ritagliato dalla della vista di delimitazione:

enter image description here

ho pensato dal momento che alcuni versione di OS X e iOS, la vista non ritaglia il contenuto delle sue sottoview e mostrerà tutto dentro e fuori? Su iOS, vedo questo comportamento, ma mi chiedo perché si presenti in questo modo e come mostrare tutto? (Sto già utilizzando Xcode 4.4.1 più recente su Mountain Lion).

(nota: se si cerca il codice di cui sopra, è necessario collegarsi al quarzo core, ed eventualmente importare l'intestazione di base di quarzo, anche se mi chiedo perché non ha importato l'intestazione e compila ancora perfettamente)

risposta

10

si scopre che se la linea:

((NSView *)self.window.contentView).wantsLayer = YES; 

viene aggiunto fin dall'inizio, allora funziona come previsto:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    ((NSView *)self.window.contentView).wantsLayer = YES; 

    self.view = [[NSView alloc] initWithFrame:NSMakeRect(200, 200, 200, 200)]; 

    self.view.wantsLayer = YES; 

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

    [self.window.contentView addSubview:self.view]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 

    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 0, 0, 1); 

} 

quindi sembra che se tutti i punti di vista sono fatti per essere supportato da livelli, quindi funziona allo stesso modo che su iOS. (Se c'è un modo rapido per rendere automaticamente il backup di tutte le viste, sarebbe bello).

la riga anchorPoint non può essere spostata prima della riga addSubview, oppure non è corretta, anche se mi chiedo perché ciò possa fare la differenza.

La riga self.view.layer = [CALayer layer]; può essere rimossa se il livello window.contentView è supportato dal livello. Sia contentView e self.view non hanno bisogno di impostare il livello, e mi chiedo anche perché.

La riga transform non può essere prima della riga addSubview, altrimenti non ruoterà, e mi chiedo anche perché.

La terza cosa è che, ho pensato che se vado a Interface Builder e rendere il contentView una classe di ContentView (sottoclassi NSView), e nel suo metodo init, fare un self.wantsLayer = YES;, allora sarebbe lavorare troppo, ma lo fa non.

Ma in ogni caso, il codice sopra funziona e aggiornerò le ragioni sopra perché quando ne avrò altre.

enter image description here

+0

Sono uno sviluppatore iOS e ho da poco iniziato a lavorare in Cocoa. Questo mi ha fatto impazzire negli ultimi tre giorni. Sono sorpreso di non riuscire a trovare più informazioni a riguardo. Grazie per aver postato la tua soluzione !! – KevinM

+0

Potrebbero esserci problemi quando si mescola NSView con i livelli e quelli senza livelli. Non è stabile ciò che il contenuto si sovrapporrà agli altri. – Slavik

+1

L'impostazione 'self.wantsLayer = YES' non funziona in' init' perché 1. l'inizializzatore corretto è 'initWithFrame:' ​​e 2. anche questo non viene chiamato per le viste caricate dai pennini. Dovresti sovrascrivere '-awakeFromNib' ed eseguire la configurazione lì. In alternativa, è possibile impostare la proprietà Layer dell'anima core nell'ispettore Effetti vista IB. –