2010-08-30 14 views
20

Sto tentando di creare una transizione tra due subviews (view1 e view2). Quando si preme un pulsante, voglio che view1 (frontale) capovolga e mostri view2 (indietro). Ho provato sia transitionFromView che transitionWithView. Ciascuno funziona, ma ognuno ha un problema.Comportamento della transizione utilizzando transitionFromView e transitionWithView

transitionFromView - capovolge la superview (l'intera vista a finestra fa capolino, non le sottoview). Quando questo capovolgimento avviene - una sottoview si trova nella parte anteriore della superview prima del flip, e l'altra sottoview si trova sul retro del flip - come dovrebbe essere. Ma io non voglio che il superview gira, solo le sottoview.

transitionWithView - capta solo le sottoview - ma la vista 'a' viene visualizzata prima che avvenga la transizione.

Qualcuno ha un suggerimento?

-(IBAction) button1action:(id) sender { 

if ([sender tag] == 0) { 

    [UIView transitionFromView:view2 toView:view1 duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    completion:nil]; 
} 

else { 
    [view1 removeFromSuperview];  
    [self.view addSubview:view2]; 
    [UIView transitionWithView:view2 
    duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromRight + 
    UIViewAnimationOptionShowHideTransitionViews 
     animations:^{} 
    completion:nil]; 
} 
} 
+4

Si prega di contrassegnare una domanda sotto come la risposta, o inserire una risposta propria che ha risolto il problema per aiutare la comunità. – Sam

+0

Perché dovrebbe contrassegnare una domanda come risposta? : D –

risposta

26

È necessario rimuovere e aggiungere le sottoview nel blocco di animazione. Inoltre, penso che transitionWithView dovrebbe prendere la super vista come argomento. Penso che quello che devi fare per farlo è usare una vista del contenitore delle stesse dimensioni delle viste che vuoi capovolgere.

Questo viene copiato dalla documentazione:

[UIView transitionWithView:containerView 
     duration:0.2 
     options:UIViewAnimationOptionTransitionFlipFromLeft 
     animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; } 
     completion:NULL]; 
+0

Questo non sembra funzionare – jjxtra

+1

La vista del contenitore è la chiave. Questo è testato e funziona su ios6 e ios7 – Jameo

12

Ho eseguito in questo esatto lo stesso problema, e sono d'accordo con la risposta precedente. Sembra che tu debba avere una vista contenitore per animare una transizione da una sottoview ad un'altra sottoview.

Sto utilizzando l'approccio transitionFromView. Per avere uno sfondo dietro l'animazione, avrai anche bisogno di una superview con lo sfondo per la vista del contenitore.

Il mio codice si presenta come:

[UIView transitionFromView:view1 
         toView:view2 
         duration:0.5 
         options:UIViewAnimationOptionTransitionFlipFromRight | 
           UIViewAnimationOptionAllowUserInteraction | 
           UIViewAnimationOptionBeginFromCurrentState 
        completion:nil]; 
1

Ho avuto la stessa esigenza, e ho visto molti approcci - da utilizzando i livelli (che finisce molto complicato se si desidera solo a che fare con un UIView) per suggerimenti che avevo bisogno di un "contenitore" per poi passare tra le sottoviste. Ma se vuoi semplicemente vedere qualcosa in avanti, come sfogliare una carta da gioco o una tessera di gioco, ho fatto un cambio di riga:

(nota: ho una matrice di UIViews (tessere [x] [y ]) in una griglia (per un gioco) Ho tutti i miei nomi di immagini nelle tabelle/matrici del database, che vengono caricati dinamicamente negli UIImages delle UIImageViews. L'immagine per il "dietro" di una tessera o tessera in un UIImage chiamato " tileBackPicImageNM"

quindi il mio codice che semplicemente scambiato l'immagine frontale per un'immagine del retro era:..

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 

che funziona bene

ma ora, per mostrare un'azione flipping, è:

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 
        } 
        completion:NULL];  

Ho sperimentato con diversi "durata" Parametri - successivamente reso un galleggiante che ho impostato nella routine viewDidLoad. Più veloce di 0.3 non è quasi visibile e il valore 1 o 2 è molto lento ...

Questo non coinvolge due viste secondarie, che è il mio caso è molto più utile poiché non volevo avere una serie di contenitori contenenti una gerarchia di viste, ecc ... e su nuovi livelli ecc. comunque ricaricare sempre gli array ...

5

Avendo incontrato lo stesso problema sono d'accordo con Eric e Sam: sia transitionWithView che transitionFromView faranno entrambi ciò che si desidera come indicato sopra purché si crei una vista container dell'appropriato dimensione che si desidera capovolgere. Altrimenti l'intera vista della finestra si invertirà.

Quindi, se view1 è la visualizzazione secondaria di iniziare con e si vuole lanciare a View2 quindi aggiungere

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize]; 
[containerView addSubview:view1]; 

E poi il modo più semplice per animare è probabilmente:

[UIView transitionFromView:view1 
        toView:view2 
        duration:2.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:nil]; 
7

Ecco la mia soluzione di lavoro stub, una cosa semplice che ha impiegato 2 ore, accidenti: abbiamo 1 pulsante per capovolgere le cose, un pannello chiamato UIView che contiene le 2 viste che voglio scambiare con un'animazione flip.

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnFlip.frame = CGRectMake(10, 10, 50, 30); 
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal]; 
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnFlip]; 

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)]; 
    panel.backgroundColor = [UIColor darkGrayColor]; 
    [self.view addSubview:panel]; 

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelBack.tag = 1; 
    panelBack.backgroundColor = [UIColor brownColor]; 
    [panel addSubview:panelBack]; 

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelFront.tag = 2; 
    panelFront.backgroundColor = [UIColor whiteColor]; 
    [panel addSubview:panelFront]; 

    displayingFront = TRUE; 
} 

-(void)flip{ 

    [UIView transitionWithView:panel 
    duration:0.5 
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) 
    animations:^{ 
     if (displayingFront) { 
      //panelFront.hidden=TRUE; 
      //panelBack.hidden = FALSE; 
      [panelFront removeFromSuperview]; 
      [panel addSubview:panelBack]; 
     }else{ 
      //panelFront.hidden=FALSE; 
      //panelBack.hidden = TRUE; 
      [panelBack removeFromSuperview]; 
      [panel addSubview:panelFront]; 
     } 
    } 
    completion:^(BOOL finished){ 
     displayingFront = !displayingFront; 
    }]; 
} 
+0

cool ... funziona perfettamente – RATTLESNAKE

0

Tenete a mente che la vista del contenitore richiede uno sfondo color.It solido significa altro che Color.This chiari stato un mio errore e ha trascorso molto tempo per capirlo.

0

utilizzando transitionFromView, sia la vista anteriore che quella posteriore dovrebbero trovarsi all'interno di un'altra vista (non la vista super). in questo modo non capovolgerà l'intero schermo.

> superview 
>  another view 
>  backview 
>  frontview 

UIView.transitionFromView (frontview, toview: backview, durata: 0,5, opzioni: .TransitionFlipFromLeft | .ShowHideTransitionViews) {rifiniti in

}

si potrebbe desiderare di fare il (un'altra vista) uguale alla dimensione del frontView