Como faço para pan a imagem dentro de um UIImageView?

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.