Pergunta

Eu tenho um UIView com um UIToolbar com um botão "Voltar" quando eu começar uma transição (UIViewAnimationTransitionFlipFromLeft) a partir de um UIView para este ponto de vista o botão aparece somente no final da transição Por quê ? Pls me ajudar

Graças

Código:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.90];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    UIViewController *coming = nil;
UIViewController *going = nil;
    UIViewAnimationTransition transition;
going = languageMenu;
coming = loadingmenu;
transition = UIViewAnimationTransitionFlipFromLeft;
   [UIView setAnimationTransition: transition forView:self.view cache:YES];

[coming viewWillAppear:YES];
[going viewWillDisappear:YES];

[going.view removeFromSuperview];
[self.view insertSubview: coming.view atIndex:0];
[going viewDidDisappear:YES];
[coming viewDidAppear:YES];

[UIView commitAnimations];
Foi útil?

Solução

Eu diria que depende de quando você cria o UIToolbar e seu botão de volta, e quando você adicioná-los à nova visão.

Também - há uma razão específica para que as linhas viewWillAppear e viewWillDisappear precisa ser parte da animação? Eu experimentar com puxando-os para fora da animação, e também mover a viewDidDisappear e viewDidAppear em uma função de retorno de chamada invocada quando o concluída animação; veja docs para UIView setAnimationDidStopSelector.

Não tenho certeza se isso vai ajudar, mas talvez.

Outras dicas

A forma como as transições de trabalho em cache é o iPhone tira um instantâneo da janela e faz algumas transformações nele como se fosse uma imagem. As transições uncached realmente redesenhar a janela ao vivo como ele é transformado.

Seu problema parece ser que o botão Voltar não está presente na visão quando a captura é feita. A solução pode ser adicionar o botão manualmente em vez de confiar no controlador de visualização de navegação ou algo assim.

Poderia ser um problema com a diferença entre os dois pontos de vista. Ter um olhar para os atributos de ambos os seus pontos de vista no IB; se você especificar uma barra de status para ambos? Ou apenas um deles? Isso pode causar uma diferença no deslocamento vertical e pode causar alguns problemas, eu acho.

Você pode, talvez, resolver este pequeno problema, definindo seus dois quadros iguais perante o código de transição animação:

newViewController.view.frame = self.view.frame;

(Isso também deve então permitir que você voltar para o cache: YES)

Em outra matéria, você pode querer considerar acrescentando o subexibição para a janela atual em vez de vista atual da janela atual, assim:

[[self.view superview] addSubview:newViewController.view];

Desta forma, você pode remover as chamadas explícitas para todos os eventos de janela. Você também vai precisar de vincular a transição para sua janela, em vez da visão atual de outra forma animação não vai funcionar:

[UIView setAnimationTransition:transition forView:self.view.superview cache:YES];

Eu estava lutando com problemas semelhantes e, finalmente, tenho esse direito. Você também pode querer tentar usar animações QuartzCore fundação:

#import <QuartzCore/QuartzCore.h>

// ...

    // get the view that's currently showing
    UIView *currentView = self.view;
    [currentView retain];
    // get the the underlying UIWindow, or the view containing the current view
    UIView *theWindow = [currentView superview];

    UIView *newView = myNewViewController.view;
    newView.frame = currentView.frame;

    // add subview
    [theWindow addSubview:newView];

    // set up an animation for the transition between the views
    CATransition *animation = [CATransition animation];
    [animation setDuration:0.8];
    [animation setType:kCATransitionPush];
    [animation setSubtype:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction
            functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

    [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];

E a volta de transição, fazer o mesmo (exceto no sentido oposto, é claro) substituindo seu subexibição add com:

    [self.view removeFromSuperview];

Com esta janela anterior virá para o primeiro plano novamente, mas seus eventos não será disparado (eu ainda não sei por que).

Espero Isso classifica as coisas para você e ajuda um monte de outras pessoas.

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