problema IPhone UIToolbar UIBarButtonItem Transição
-
18-09-2019 - |
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];
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.