Sim, um UIGestureRecognizer pode ser adicionado a um UIImageView. Conforme indicado na outra resposta, é muito importante lembrar de ativar a interação do usuário na visualização da imagem, definindo sua userInteractionEnabled
propriedade como YES
. UIImageView herda de UIView, cuja propriedade de interação do usuário é definida como YES
padrão, no entanto, a propriedade de interação do usuário de UIImageView é definida como NO
padrão.
Nos documentos do UIImageView:
Novos objetos de exibição de imagem são configurados para desconsiderar eventos do usuário por padrão. Se você quiser manipular eventos em uma subclasse personalizada de UIImageView, altere explicitamente o valor da propriedade userInteractionEnabled para YES depois de inicializar o objeto.
Enfim, na maior parte da resposta. Aqui está um exemplo de como criar a UIImageView
com a UIPinchGestureRecognizer
, a UIRotationGestureRecognizer
e a UIPanGestureRecognizer
.
Primeiro, em viewDidLoad
ou em outro método de sua escolha, crie uma visualização de imagem, forneça uma imagem, um quadro e ative a interação do usuário. Em seguida, crie os três gestos da seguinte maneira. Certifique-se de utilizar a propriedade delegada (provavelmente definida como auto). Isso será necessário para usar vários gestos ao mesmo tempo.
- (void)viewDidLoad
{
[super viewDidLoad];
// set up the image view
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage"]];
[imageView setBounds:CGRectMake(0.0, 0.0, 120.0, 120.0)];
[imageView setCenter:self.view.center];
[imageView setUserInteractionEnabled:YES]; // <--- This is very important
// create and configure the pinch gesture
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureDetected:)];
[pinchGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:pinchGestureRecognizer];
// create and configure the rotation gesture
UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureDetected:)];
[rotationGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:rotationGestureRecognizer];
// creat and configure the pan gesture
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureDetected:)];
[panGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:panGestureRecognizer];
[self.view addSubview:imageView]; // add the image view as a subview of the view controllers view
}
Aqui estão os três métodos que serão chamados quando os gestos em sua exibição forem detectados. Dentro deles, verificaremos o estado atual do gesto e, se ele estiver iniciado ou alterado UIGestureRecognizerState
, leremos a propriedade de escala / rotação / tradução do gesto, aplicaremos esses dados a uma transformação afim, aplicaremos a transformação afim à imagem visualizar e, em seguida, redefinir a escala de gestos / rotação / translação.
- (void)pinchGestureDetected:(UIPinchGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat scale = [recognizer scale];
[recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, scale, scale)];
[recognizer setScale:1.0];
}
}
- (void)rotationGestureDetected:(UIRotationGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat rotation = [recognizer rotation];
[recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, rotation)];
[recognizer setRotation:0];
}
}
- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [recognizer translationInView:recognizer.view];
[recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
}
}
Finalmente e muito importante, você precisará utilizar o método UIGestureRecognizerDelegategestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
para permitir que os gestos funcionem ao mesmo tempo. Se esses três gestos são os únicos três que têm essa classe atribuída como delegada, basta retornar YES
como mostrado abaixo. No entanto, se você tiver gestos adicionais que tenham essa classe atribuída como delegada, poderá ser necessário adicionar lógica a esse método para determinar qual gesto é o que antes de permitir que todos trabalhem juntos.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Não se esqueça de garantir que sua classe esteja em conformidade com o protocolo UIGestureRecognizerDelegate . Para fazer isso, verifique se sua interface se parece com isso:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Se você preferir jogar com o código em um projeto de exemplo funcional, o projeto de exemplo que eu criei contendo esse código pode ser encontrado aqui.