Eu tenho um UIImageView
que está exibindo uma imagem que é mais larga e mais alta do que o UIImageView
é. Eu gostaria de deslocar a imagem dentro da visão usando uma animação (para que o pan seja agradável e suave).
Parece-me que eu deveria ser capaz de apenas ajustar a bounds.origin
do UIImageView
, e a imagem deve se mover (porque a imagem deve pintar dentro da visão com isso como sua origem, certo?), Mas isso não parece trabalhos. O bounds.origin
muda, mas a imagem desenha no mesmo local.
O que quase funciona é alterar o contentsRect
da camada da vista. Mas isso começa como um quadrado de unidade, mesmo que a área visível da imagem não seja a imagem inteira. Então, não tenho certeza de como detectaria que a borda mais distante da imagem está sendo puxada para a área visível (que preciso evitar, pois é exibida esticando a borda até o infinito, que parece, bem, abaixo da média). ).
Minha visão atualmente tem seu kCAGravityTopLeft
definido como kCAGravityTopLeft
via Interface Builder, se isso faz diferença (está causando a imagem para mover?). Nenhuma outra opção parecia ser melhor, no entanto.
ATUALIZAÇÃO: para deixar claro, quero mover a imagem para dentro da visualização, mantendo a visualização no mesmo local.
Eu recomendo include seu UIImageView
em um UIScrollView
. Faça com que o UIImageView
exiba a imagem completa e defina o contentSize no UIScrollView
como UIImageView's
tamanho UIImageView's
seu UIImageView's
. Sua window
na imagem será do tamanho do UIScrollView
, e usando scrollRectToVisible:animated:
você pode deslocar para áreas específicas da imagem de uma forma animada.
Se você não quer que as barras de rolagem apareçam, você pode definir o showsHorizontalScrollIndicator
e showsVerticalScrollIndicator
propriedades do showsVerticalScrollIndicator
como NO
.
UIScrollView
também oferece funcionalidade de zoom de pinça, que pode ou não ser útil para você.
Brad Larson me indicou o caminho certo com sua sugestão de colocar o UIImageView
dentro de um UIScrollView
.
No final, coloquei o UIImageView
dentro de um UIScrollView
e defini o contentSize do contentSize
e os limites do imageView
para o mesmo tamanho da imagem no UIImage:
UIImage* image = imageView.image; imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height); scrollView.contentSize = image.size;
Então, eu posso animar o contentOffset do contentOffset
para obter um bom efeito de panning:
[UIView beginAnimations:@"pan" context:nil]; [UIView setAnimationDuration:animationDuration]; scrollView.contentOffset = newRect.origin; [UIView commitAnimations];
No meu caso particular, estou fazendo um espaço random na imagem. Para encontrar um retângulo adequado para a panorâmica e uma duração adequada para obter uma boa velocidade constante, eu uso o seguinte:
UIImage* image = imageView.image; float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width]; float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height]; CGRect oldRect = scrollView.bounds; CGRect newRect = CGRectMake( xNewOrigin, yNewOrigin, scrollView.bounds.size.width, scrollView.bounds.size.height); float xDistance = fabs(xNewOrigin - oldRect.origin.x); float yDistance = fabs(yNewOrigin - oldRect.origin.y); float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2)); float hDistanceInPixels = hDistance; float animationDuration = hDistanceInPixels / speedInPixelsPerSecond;
Estou usando um speedInPixelsPerSecond
de 10.0f
, mas outros aplicativos podem querer usar um valor diferente.