2011-01-31 13 views
6

Vengo da uno sfondo iOS e sono nuovo allo sviluppo di Mac OSX (app coco).Facile commutazione di "View Controller" nelle app Mac (simile a iOS)

A partire dal progetto di codice di esempio Apple "Simple Cocoa App" come base, voglio essere in grado di passare tra diversi "Controller di visualizzazione" o anche solo tra NSViews in qualsiasi modo simile a quello delle app iOS.

Sfortunatamente, non sono riuscito a trovare un modo per farlo - e Internet è piuttosto carente di risorse legate a parole chiave come "Cambiamento delle app di cacao, cambio di visualizzazione in mac app, mac app tutorial di dev" ...

Qualcuno di voi sa un tutorial che, e qui è il kicker, in realtà copre la questione di passare da una vista? O forse sai di un modo rapido che potresti essere in grado di spiegare nella tua risposta Stack Overflow?

prova di concetto
Un concetto proof-of-molto semplice potrebbe essere la seguente. In una semplice app, ci sono due visualizzazioni: schermata 1 (attualmente visualizzata) e schermata 2 (nascosta):

PASSO 1) Avvia app, viene visualizzata la schermata 1 (contiene etichetta "Schermo 1" e pulsante "Avanti" ")
FASE 2) Premere il pulsante
FASE 3) schermo 1 scorre fuori schermo come
FASE 4) schermo 2 scivoli in (contiene una singola etichetta "screen 2")

Grazie.

risposta

16

Core Animation non è così integrato in OS X come in iOS. Quindi dovrai fare molto da te. Quello che potresti fare è usare la finestra contentView come una superview e poi fare quanto segue per passare a un'altra vista (animata).

- (void)switchSubViews:(NSView *)newSubview 
{ 
    NSView *mainView = [[self window] contentView]; 
    // use a for loop if you want it to run on older OS's 
    [mainView removeAllSubViews]; 

    // fade out 
    [[mainView animator] setAplhaValue:0.0f]; 

    // make the sub view the same size as our super view 
    [newSubView setFrame:[mainView bounds]]; 
    // *push* our new sub view 
    [mainView addSubView:newSubView]; 

    // fade in 
    [[mainView animator] setAlphaValue:1.0f]; 
} 

Questo non ti darà comunque l'effetto desiderato. Se si vuole dare un effetto sorta mossa è necessario includere QuartzCore.framework e procedere come segue:

- (void)prepareViews 
{ // this method will make sure we can animate in the switchSubViewsMethod 
    CATransition *transition = [CATransition animation]; 
    [transition setType:kCATransitionPush]; 
    [transition setSubtype:kCATransitionFromLeft]; 
    NSView *mainView = [[self window] contentView]; 
    [mainView setAnimations:[NSDictionary dictionaryWithObject:transition forKey:@"subviews"]]; 
    [mainView setWantsLayer:YES]; 
} 

poi nei switchSubViews: è sufficiente utilizzare:

[[mainView animator] addSubView:newSubView]; 
+0

Quando uso il codice precedente, nella riga "[mainView removeAllSubViews];", mostra il seguente errore ... "Nessuna interfaccia @ visibile per 'NSView' dichiara il selettore 'removeAllSubViews'". Qual è il motivo – nbs

+0

@NidhinBalakrishnan che il metodo è piuttosto una nuova API, come ho affermato nel commento su quella linea dovrai rimuovere manualmente tutte le sottoview (loop attraverso la matrice di subviews e rimuovere una ad una) per ottenere l'effetto desiderato . –

3

Si consiglia di controllare PXNavigationBar da Perspx, in grado di gestire la situazione in un modo molto più simile a iOS.

+0

Grazie sidyll per questo link utile. – m0rtimer

Problemi correlati