Domanda

Sto cercando un modo per effettuare una transizione UIViewAnimationTransitionCurlUp o UIViewAnimationTransitionCurlDown sull'iPhone ma invece che dall'alto verso il basso, fallo da sinistra a destra (o dall'alto / dal basso in modalità orizzontale). Ho visto questo chiedere alcune volte a Internet, ma nessuno ha bisogno di una risposta. Tuttavia ritengo che ciò sia fattibile.

Ho provato a cambiare la trasformazione di View e la trasformazione di view.layer ma ciò non ha influito sulla transizione. Dato che la transizione cambia quando il dispositivo cambia orientamento presumo che ci sia un modo per ingannare il dispositivo per utilizzare la transizione orizzontale in modalità verticale e viceversa?

È stato utile?

Soluzione 2

In realtà sono riuscito a ottenere questo effetto modificando l'orientamento del mio UIViewController. La cosa strana è che avevo il mio controller annidato in un altro quando non funzionava, ma quando l'ho impostato come controller di visualizzazione immediata, ha funzionato.

Codice che lo fa:

In un UIViewController che è il controller della vista principale nel mio delegato dell'app e consente solo l'orientamento orizzontale (come vedi nel secondo metodo di seguito) ho il seguente:

-(void)goToPage:(int)page flipUp:(BOOL)flipUp {

     //do stuff...

     // start the animated transition
     [UIView beginAnimations:@"page transition" context:nil];
     [UIView setAnimationDuration:1.0];
     [UIView setAnimationTransition:flipUp ? UIViewAnimationTransitionCurlUp : UIViewAnimationTransitionCurlDown forView:self.view cache:YES];

     //insert your new subview
     //[self.view insertSubview:currentPage.view atIndex:self.view.subviews.count];

      // commit the transition animation
      [UIView commitAnimations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

Altri suggerimenti

È possibile fare riccioli in una delle quattro direzioni usando una vista contenitore. Imposta la trasformazione della vista del contenitore sull'angolazione desiderata e quindi arriccia il ricciolo aggiungendo la vista alla vista del contenitore, non la vista principale della tua app che non ha una cornice trasformata:

NSView* parent = viewController.view; // the main view
NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease];
containerView.transform = CGAffineTransformMakeRotation(<your angle here, should probably be M_PI_2 * some integer>);
[parent addSubview:containerView]; 

[UIView beginAnimations:nil context:nil];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES];
[containerView addSubview:view];
[UIView commitAnimations];

Ho anche lottato con questo. Per ottenere l'arricciatura da destra o da sinistra è possibile creare una vista intermedia e trasformarla. Quindi, supponiamo che la vista in fase di transizione (myView) sia figlia della finestra principale (parentView):

-parentView
-->myView

Inserirai una vista intermedia tra (facilmente eseguibile in Interface Builder):

-parentView
-->containerView
--->myView

Quindi, utilizzare il seguente codice per capovolgere il contenitore di 90 gradi a sinistra e la vista di transizione di 90 gradi a destra:

containerView.transform = CGAffineTransformMakeRotation(-M_PI_2);
myView.transform = CGAffineTransformMakeRotation(M_PI_2);

myView apparirà comunque in posizione verticale per l'utente ma la transizione penserà che sia applicata a 90 gradi da sinistra.

Tieni presente che, a seconda del ridimensionamento automatico delle viste, potresti dover correggere le dimensioni dei fotogrammi dopo aver applicato la trasformazione, ad es.

  containerView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);
  myWebView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);

Spero che questo aiuti. È il più vicino che puoi raggiungere a UIViewAnimationTransitionCurlLeft e UIViewAnimationTransitionCurlRight.

Ho provato la soluzione di fluXa su iOS5 (quindi ho dovuto usare [UIView trans ......]) ma non ha funzionato: il ricciolo è comunque andato su o giù. Apparentemente la transizione ora non tiene conto della trasformazione della vista. Quindi, nel caso in cui qualcun altro voglia fare lo stesso trucco su iOS5, la soluzione è aggiungere un altro contenitore in mezzo e animare la transizione da lì.

Ecco il mio codice, che è un po 'specifico poiché voglio arricciarmi "a sinistra", ma con l'angolo inferiore che si arriccia. Come se stessi strappando una pagina da un taccuino.

UIView* parent = self.view; // the main view
CGRect r = flipRectSize(parent.bounds);
UIView* containerView = [[UIView alloc] initWithFrame:r];
CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2);
t = CGAffineTransformTranslate(t, -80, -80);
containerView.transform = CGAffineTransformScale(t, -1, 1);
[parent addSubview:containerView]; 

UIView* container2 = [[UIView alloc] initWithFrame:r];
[containerView addSubview:container2]; 

UIImageView* v = [[UIImageView alloc] initWithFrame:r];
v.image = [UIImage imageWithCGImage:contents.CGImage scale:contents.scale orientation:UIImageOrientationLeftMirrored];
[container2 addSubview:v];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [UIView transitionWithView:container2
                      duration:DURATION_CURL_ANIMATION
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        [v removeFromSuperview];
                    } completion:^(BOOL finished) {
                        if (completion) {
                            completion(finished);
                        }
                        [containerView removeFromSuperview];}];});

Note:

  1. Devo ammettere che la trasformazione della trasformazione affine (80,80) non ha senso nella mia mente, ma è necessaria per iPhone, probabilmente non funzionerà su iPad.
  2. flipSizeRect inverte la larghezza e l'altezza di un rettangolo (ce l'hai già, vero?)
  3. dispatch_after è necessario perché ho aggiunto il contenitore e quindi voglio rimuovere una vista dalla gerarchia. Se lascio fuori la spedizione nulla si anima. La mia ipotesi migliore è che dobbiamo prima lasciare che il sistema esegua un passaggio di layout prima di poter animare una rimozione.

Non penso che esista un modo per scrivere un'animazione personalizzata.

Ancora più importante, probabilmente non dovresti provarci. Il rannicchiarsi e il rannicchiarsi fanno parte della grammatica dell'interfaccia utente che dice all'utente che una vista viene sollevata o abbassata sulla vista esistente. Dovrebbe essere come una nota adesiva che viene messa e poi rimossa. A sinistra & Lt; - & Gt; il ricciolo destro sarà molto probabilmente interpretato come qualcosa come strappare una pagina da un libro. Confonderà gli utenti.

Ogni volta che ti ritrovi a provare a fare qualcosa nell'interfaccia che l'API standard non fa facilmente, dovresti chiederti se un tale nuovo metodo comunicherà qualcosa di importante per l'utente e se è simile alla grammatica dell'interfaccia esistente. In caso contrario, non dovresti preoccuparti.

Le interfacce insolite hanno un fattore iniziale sorprendente ma portano a frustrazione ed errori nell'uso quotidiano. Possono anche far sì che Apple rifiuti la tua app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top