A animação UINavigationController no botão "voltar"
-
29-09-2020 - |
Pergunta
Eu tenho um botão personalizado em um controlador de visualização de navegação do controlador de hierarquia, que, quando pressionado, aparece o visível do controlador de visualização.
Eu quero usar a uiview do transform
propriedade para animar o encerramento do controlador de visualização.Ele funciona, mas se eu usar `popViewControllerAnimated:SIM', o padrão da esquerda slide da animação ainda está lá, embora a minha transformação personalizada também funciona.
Se eu definir popViewControllerAnimated:NO
ele não se animar com nada.
Eu também olhei para o uso de CATransition
que funciona quando eu popViewControllerAnimated
conjunto para NO
, mas não há um "zoom" efeito que faz parte da API pública, e eu não quero usar a privada efeito.Filtros personalizados também não estão disponíveis para o iPhone, apenas OS X.
Então eu acho que minhas perguntas são:
1) existe uma maneira de remover a esquerda slide no padrão de transição, mas ainda tem uma animação personalizada usando transform
?
2) de Alguma forma para utilizar um filtro personalizado para CATransition
?
3) Se eu usar uma API privada para o efeito de zoom, qual a probabilidade de a Apple lançar a minha app no rejeição bin?
Alguém tem uma solução que eu estou vista?
Solução
Eu fiz algo semelhante ao que você descreve, por exemplo,alterar o padrão de animação para o pop e push de vista em UINavigationController.
A ideia é desabilitar o padrão de animação para o objeto e substituí-lo com sua própria animação.Eu criei uma nova categoria para UINavigationController e utilizada uma função semelhante à abaixo.
- (void) altAnimatePopViewControllerAnimated:(BOOL)animated
{
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush; // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;
CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];
[self popViewControllerAnimated:YES];
[CATransaction commit];
}
para usar basta usar o código
[self.navigationController altAnimatePopViewControllerAnimated:YES];
A fim de fazer um push, apenas criar outro tipo de função inversa e a animação.
Ele não é perfeito, mas funciona.Quando você escolher diferentes tipos de animação brincar com as diferentes subviews compor a barra de navegação/controlador para ficar perfeito.
Levei o meu muito branco de vir com isso, para usá-lo sabiamente :)
******* EDITAR
Tente substituir o impulso de transição com isso (não tente isso sozinho):
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scale.duration = duration;
scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
[NSNumber numberWithFloat:1.2f],
[NSNumber numberWithFloat:.85f],
[NSNumber numberWithFloat:1.f],
nil];
Isso vai fazer um pop, i.é.a exibição será maior, antes que ele se instale para o tamanho certo.Jogar com os valores na matriz para controlar a curva de animação.