Pergunta

Eu estou procurando uma maneira de fazer uma UIViewAnimationTransitionCurlUp ou UIViewAnimationTransitionCurlDown transição no iPhone, mas em vez de cima para baixo, fazê-lo a partir da esquerda para a direita (ou superior / inferior em modo paisagem). Eu já vi isso pediu aroud a internet algumas vezes, mas nenhum sems para obter uma resposta. No entanto, eu sinto que este é factível.

Eu tentei mudar da exibição transformar e o view.layer de transformar, mas isso não afetou a transição. Desde a transição muda quando o dispositivo muda de orientação Eu presumo que há uma maneira de enganar o dispositivo para usar a transição paisagem no modo retrato e vice-versa?

Foi útil?

Solução 2

Eu realmente conseguiu atingir esse efeito, alterando a orientação do meu UIViewController. O estranho é, eu tinha o meu controlador nesten em outro quando não estava trabalhando, mas quando eu colocá-lo como o controlador de vista imediato, funcionou.

O código que faz isso:

Em uma UIViewController que é o principal controlador de exibição no meu delegado app e só permite a orientação paisagem (como você vê na 2ª método abaixo) eu tenho a seguinte:

-(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);
}

Outras dicas

É possível fazer cachos em qualquer das quatro direções utilizando uma vista do recipiente. Definir a transformação da visão recipiente para o ângulo desejado e, em seguida, fazer a onda adicionando a sua opinião sobre o ponto de vista do recipiente, não vista principal do seu aplicativo que não tem um quadro transformado:

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];

Eu também lutado com isso. Para obter a onda de vir da direita ou à esquerda, você pode criar uma visão intermediária e transformá-la. Então, vamos dizer que a vista que está em transição (myView) é um filho da janela principal (parentView):

-parentView
-->myView

Você irá inserir uma visão intermediária entre (feito facilmente em Interface Builder):

-parentView
-->containerView
--->myView

Em seguida, use o seguinte código para virar o recipiente 90 graus à esquerda e à direita vista 90 graus transição:

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

myView ainda aparecerá na posição vertical para o usuário, mas a transição vai pensar que é aplicado em 90 graus a partir da esquerda.

Note que, dependendo de como auto-scaling suas opiniões são, você pode ter para corrigir os tamanhos de quadros depois de aplicar a transformação, por exemplo,

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

Espero que isso ajude. O é o mais próximo que você pode chegar a UIViewAnimationTransitionCurlLeft e UIViewAnimationTransitionCurlRight.

Eu tentei a solução de FLUXA em iOS5 (Então, eu tive que usar [UIView trans ......]), mas não funcionou: a onda ainda subiu ou para baixo. Aparentemente, a transição agora não levam a transformação da visão em conta. Assim, no caso de alguém mais quer fazer o mesmo truque em iOS5, a solução é adicionar um outro recipiente no meio e animar a transição de lá.

Aqui está o meu código, que é um pouco específico desde que eu quero onda 'up' para a esquerda, mas com a ondulação canto inferior. Como se eu estou rasgando uma página de um livro de nota.

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];}];});

Notas:

  1. Devo admitir que a afim transformação traduzir (80,80) não faz sentido na minha mente, mas vai não é necessário para iphone, provavelmente trabalho no iPad.
  2. flipSizeRect vira a largura e altura de um retângulo (você já tem isso, certo?)
  3. o dispatch_after é necessário porque eu adicionei o recipiente e, em seguida, deseja remover uma vista da hierarquia. Se eu deixar de fora os nada anima despacho. Meu melhor palpite é que, primeiro necessidade de deixar o sistema fazer uma passagem de layout antes de nós pode animar uma remoção.

Eu não acho que há uma maneira além de escrever uma animação personalizada.

Mais importante que você provavelmente não deve tentar isso. A onda se e enrolar para baixo são parte da gramática interface de usuário que informa ao usuário que a vista está sendo levantado para cima ou para colocar para baixo sobre a vista existente. É suposto ser como uma nota de ser colocado para baixo e, em seguida, removido. A esquerda <-> onda certa provavelmente será interpretado como a algo como rasgar uma página de um livro. Ele irá confundir os usuários.

Sempre que você encontrar-se tentando fazer algo na interface que a API padrão não faz facilmente, você deve se perguntar se um método tal novela vai comunicar algo importante para o usuário e se é semelhante à gramática interface existente. Se não, então você não deve se preocupar.

Interfaces incomuns têm um fator inicial wow mas eles levar à frustração e erros no uso do dia-a-dia. Eles também podem causar Apple para recusar a sua aplicação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top