Como faço para lidar adequadamente com a rotação de um UIScrollView contendo UIImageViewS?
-
26-09-2019 - |
Pergunta
Estou desenvolvendo um visualizador de imagem, assim como o aplicativo de fotos.
É um UISCROLLVIEW com paginação ativada com imagens carregadas da Internet, então eu adaptei partes do Amostra do LazyTableImages. A visualização de rolagem e cada visualização de imagem dentro dela têm todos os seus sinalizadores de máscara automáticos.
Quando observei como os redes estavam acontecendo durante a rotação, parecia bom, mas uma vez que comecei a tentar interagir com a visualização de rolagem, percebi que também precisava alterar programaticamente o tamanho do contentView. Fiz isso implementando o DIDROTATEFROMINTERFACIDADE: no meu controlador de exibição.
[self.scrollView setContentSize:CGSizeMake(numberOfImages * portraitWidth, [scrollView bounds].size.height)];
Com a interação se comportando corretamente, descobri que, se estivesse visualizando a segunda foto e gire, partes das fotos 1º e 2º seriam mostradas na tela. Eu também precisava alterar o conteúdo do ContentOffset.
Eu tentei corrigir essas duas maneiras - ambos usando o scrollrectTovisible: Animated: Method of UIScrollView, além de tentar definir a propriedade ContentOffset diretamente. E eu experimentei colocando esse código nas implementações das respostas "uma etapa" e "em duas etapas" às mudanças na orientação. Por exemplo:
-(void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
[self.scrollView setContentOffset:CGPointMake(currentlyViewedPhotoIndex * largeImageHeight,0) animated:YES];
Em todos os casos, porém, parece muito mal -humorado. Ou eu vejo claramente o pergaminho acontecer, ou apenas pula. Uuuuuuuuuuuugly! Existe uma maneira de fazer isso para se comportar exatamente como o aplicativo de fotos?
Solução
O que acabei fazendo - pouco antes do início da rotação, oculte o UIScrollView e crie um UIImageView que contém a imagem atualmente vista. Gire, essa imagem girará tudo de bom e bonito e, quando a rotação for concluída, remova o ImageView e unhe a exibição de rolagem.
ATUALIZAÇÃO - Se você está lendo isso hoje (a qualquer momento após o iOS 6), use um uiPageViewController e defina transição para o uiPageViewControllerTransitionStylesCroll, para crissakes.
Outras dicas
Fiz algo um pouco diferente quando se depara com o mesmo problema. Dentro willRotateToInterfaceOrientation:duration:
, Eu escondo todas as subvisões do UISCROLLVIEW, exceto para a subview atualmente exibida e em didRotateFromInterfaceOrientation:
Eu uio as subviews.