2012-03-01 13 views
21

Questo è un progetto iPad in cui ho un UIView con diverse subview, e sto cercando di animare una di queste Uiviews usando [UIView transitionFromView: toView: duration: options : completamento], ma quando eseguo questo metodo l'intera vista genitore viene capovolta! Questo è il codice che sto utilizzando:Come capovolgere un singolo UIView (senza capovolgere la vista genitore)

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; 
[newView setBackgroundColor:[UIColor redColor]]; 
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

Qualche idea su come posso capovolgere tra queste opinioni senza che anima tutta la visione genitore? Grazie!

risposta

70

Questo codice può ti aiuta:

mettere i due punti di vista che si desidera capovolgere all'interno di una vista senza nome con le stesse dimensioni e il collegamento il IBOutlet UIView *newView,*oldView; alle opinioni e mettere la nuova vista in cima

bool a = NO; 

@implementation ViewController 

- (IBAction)flip:(id)sender 
{ 
    if (a == NO) { 
     [UIView transitionFromView:oldView toView:newView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = YES; // a = !a; 
    } 
    else { 
     [UIView transitionFromView:newView toView:oldView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = NO; // a = !a; 
    } 
} 
+5

Grazie mille! La soluzione era usare una vista container. – DanMunoz

+0

@ Floris497, mi hai salvato la giornata. Grazie mille :) – Ahmed

+1

Grazie per questo. Ho avuto la sensazione che questa fosse la soluzione. Immagino che la transizione sia più di un trucco, fa una vibrazione dell'animazione sulla vista genitore e, a metà strada, scambia le sottoview specificate. Poi di nuovo, la maggior parte delle animazioni ecc. Su iPhone sono un trucco :-) – Dermot

2

Utilizzare una vista Contenitore per conservare le proprie visualizzazioni secondarie e rendere la vista del contenitore delle stesse dimensioni della visualizzazione secondaria che si sta tentando di animare.

Quindi, è possibile impostare le visualizzazioni come questo.

self.view-> "una vista contenitore" -> subviews

2
**//flipping view continuously** 



bool a = NO; 


-(void)viewDidLoad 
{ 



// THIS is the canvass holding the two views this view is flipping 
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; 

    v.backgroundColor=[UIColor clearColor]; 

    [self.view addSubview:v]; 

    [v addSubview:yourfirstview]; 
    [v addSubview:yoursecondview]; 

// calling the method 

[NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(flip) 
            userInfo:nil 
            repeats:YES]; 

} 



//flipping view randomly 

-(void)flip 

{ 

if (a == NO) 
{ 

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
     a = YES; 
    } 

else if(a==YES) 
{ 

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
    a = NO; 
    } 

} 
37

avevo problemi ottenere questo al lavoro anche. Ho usato il codice scritto da Floris, ma sebbene abbia funzionato per il primo "flip", il prossimo flip ha iniziato a diventare strano, in cui i pulsanti e le etichette sull'UI View Frontside hanno perso posizioni.

Ho inserito il codice in basso e funziona correttamente.

Coppia di cose da notare:

  1. PanelView è un controllo UIView sul ViewController che ha altri due UIViews annidati in esso (subviews). Il primo si chiama frontView, il secondo si chiama backView. (Vedi foto sotto)

image of the view and subviews in IB

  1. ho una proprietà bool denominata displayingFront sulla classe

(nel mio .h)

@property BOOL displayingFront; 

nel mio .m

@synthesize displayingFront; 

nel mio metodo viewDidLoad

self.displayingFront = YES; 

Questo è il codice che .m che ho truccato fino ai due pulsanti se UIViews anteriore e posteriore ...

- (IBAction)flip:(id)sender 
{ 
    [UIView transitionWithView:self.panelView 
         duration:1.0 
         options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : 
           UIViewAnimationOptionTransitionFlipFromLeft) 
        animations: ^{ 
         if(displayingFront) 
         { 
          self.frontView.hidden = true; 
          self.backView.hidden = false; 
         } 
         else 
         { 
          self.frontView.hidden = false; 
          self.backView.hidden = true; 
         } 
        } 

        completion:^(BOOL finished) { 
         if (finished) { 
          displayingFront = !displayingFront; 
         } 
        }]; 
} 
+0

Penso che sia più pulito della risposta – RonPelayo

+0

La differenza con questo approccio è che le animazioni si verificano dopo il capovolgimento ... quindi il frontView è nascosto e il backView visualizzato dopo il flip. L'approccio "transitionFromView" sopra dettagliato aggiunge la vista al punto centrale in modo tale che al momento del completamento del flip, il "toView" sia già visualizzato. – wuf810

+0

Grazie! Questo ha risolto i miei problemi con le sotto-visualizzazioni in bacheca delle viste di transizione (etichette). Erano sparpagliati sullo schermo. –

2

ho risolto questo problema utilizzando animazioni di vecchia scuola:

[UIView beginAnimations:@"Flip" context:nil]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; 

[self addSubview:secondView]; 

[UIView commitAnimations]; 

Inoltre è possibile rimuovere la FirstView:

[firstView removeFromSuperview]; 
Problemi correlati