Visualização secundária tem orientação errada
-
12-12-2019 - |
Pergunta
Eu tenho um costume segue onde eu estou tentando fazer o inverso do padrão "Capa Vertical" segue de transição.Eu acho que isso deve funcionar:
UIView *srcView = ((UIViewController *)self.sourceViewController).view; UIView *dstView = ((UIViewController *)self.destinationViewController).view; [dstView setFrame:CGRectMake(0, 0, srcView.window.bounds.size.width, srcView.window.bounds.size.height)]; [srcView.window insertSubview:dstView belowSubview:srcView]; [UIView animateWithDuration:0.3 animations:^{ srcView.center = CGPointMake(srcView.center.x - srcView.frame.size.width, srcView.center.y); } completion:^(BOOL finished){ [srcView removeFromSuperview]; } ];
O problema é que o destino exibe em orientação retrato, mesmo que todos os outros visualizar no aplicativo é a orientação paisagem.Além disso, as coordenadas x e y são invertidos.Por que isso está acontecendo?
Eu montei shouldAutorotateToInterfaceOrientation
em cada controlador de visualização, mas que não ajuda.Eu poderia rodar o vista com CGAffineTransformMakeRotation
, mas que não parece ser a coisa certa a fazer;coordenadas seria ainda ser revertida, por uma coisa.
Atualização:
Eu tentei usar CGAffineTransformRotate
para rodar o vista , mas parece ridículo.Mais de fundo mostra black.Eu não acho que esta é a maneira que é suposto para trabalhar.
Solução 3
Aparentemente, era muito mais fácil do que eu pensei fazer o segue que eu queria.Aqui está o que funcionou:
- (void)perform {
UIViewController *src = (UIViewController *)self.sourceViewController;
[src dismissViewControllerAnimated:YES completion:^(void){ [src.view removeFromSuperview]; }];
}
Esperamos que isto ajude alguém.
Outras dicas
Desde que eu não era capaz de obter a orientação correta e de enquadramento da exibição de destino antes de os controladores de troca, eu fiz inverter o processo:
- salve a fonte de exibição, como uma imagem (ver Remover personalizado UIStoryboardSegue com animação personalizada ) ;
- mudar o controlador da corrente [presentViewController:...];
- em seguida, fazer a animação com a (correta) de destino de vista de incorporação, salvo a imagem de origem.
Aqui está o código completo :
#include <QuartzCore/QuartzCore.h>
@implementation HorizontalSwipingSegue
- (void) perform {
UIViewController *source = self.sourceViewController;
UIViewController *destination = self.destinationViewController;
UIView *sourceView = source.view;
UIView *destinationView = destination.view;
// Create a UIImageView with the contents of the source
UIGraphicsBeginImageContext(sourceView.bounds.size);
[sourceView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *sourceImageView = [[UIImageView alloc] initWithImage:sourceImage];
[[self sourceViewController] presentViewController:[self destinationViewController] animated:NO completion:NULL];
CGPoint destinationViewFinalCenter = CGPointMake(destinationView.center.x, destinationView.center.y);
CGFloat deltaX = destinationView.frame.size.width;
CGFloat deltaY = destinationView.frame.size.height;
switch (((UIViewController *)self.sourceViewController).interfaceOrientation) {
case UIDeviceOrientationPortrait:
destinationView.center = CGPointMake(destinationView.center.x - deltaX, destinationView.center.y);
sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaX, sourceImageView.center.y);
break;
case UIDeviceOrientationPortraitUpsideDown:
destinationView.center = CGPointMake(destinationView.center.x + deltaX, destinationView.center.y);
sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaX, sourceImageView.center.y);
break;
case UIDeviceOrientationLandscapeLeft:
destinationView.center = CGPointMake(destinationView.center.x, destinationView.center.y - deltaY);
sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaY, sourceImageView.center.y);
break;
case UIDeviceOrientationLandscapeRight:
destinationView.center = CGPointMake(destinationView.center.x, destinationView.center.y + deltaY);
sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaY, sourceImageView.center.y);
break;
}
[destinationView addSubview:sourceImageView];
[UIView animateWithDuration:0.6f
animations:^{
destinationView.center = destinationViewFinalCenter;
}
completion:^(BOOL finished){
[sourceImageView removeFromSuperview];
}];
}
@end
ATUALIZADO RESPOSTA:
Certifique-se de que você está definindo o seu dstView do quadro corretamente.Eu acho que você vai ter melhor sorte com:
dstView.frame = srcView.frame;
em vez de:
[dstView setFrame:CGRectMake(0, 0, srcView.window.bounds.size.width, srcView.window.bounds.size.height)];
o bounds
propriedade não reagir a mudanças na orientação da mesma forma frame
não.
Substituir
[srcView insertSubview:dstView belowSubview:srcView];
com
[srcView insertSubview:dstView atIndex:0];
Se você está apenas adicionando outro modo de exibição do controlador em vista sua visão de hierarquia, que ver controlador não está indo para obter qualquer informação sobre a orientação do dispositivo, de modo que ele irá apresentar a vista em sua configuração padrão.Você precisa adicionar o controlador de visualização para o modo de exibição controlador de hierarquia, como também, utilizando os métodos de contenção descrito aqui.Você também precisará removê-lo a partir de uma hierarquia ao feito.
Existem também vários bons WWDC palestras sobre o assunto, a partir de 2011, chamado "a Implementação do controlador de visualização de contenção" e a partir deste ano, a evolução de vista controladores.