Sí, se puede agregar un UIGestureRecognizer a un UIImageView. Como se indicó en la otra respuesta, es muy importante recordar habilitar la interacción del usuario en la vista de imagen estableciendo su userInteractionEnabled
propiedad en YES
. UIImageView hereda de UIView, cuya propiedad de interacción de usuario está configurada YES
de manera predeterminada, sin embargo, la propiedad de interacción de usuario de UIImageView está configurada NO
de manera predeterminada.
De los documentos UIImageView:
Los nuevos objetos de vista de imagen están configurados para ignorar los eventos del usuario de forma predeterminada. Si desea manejar eventos en una subclase personalizada de UIImageView, debe cambiar explícitamente el valor de la propiedad userInteractionEnabled a YES después de inicializar el objeto.
De todos modos, en la mayor parte de la respuesta. Aquí hay un ejemplo de cómo crear un UIImageView
con a UIPinchGestureRecognizer
, a UIRotationGestureRecognizer
y a UIPanGestureRecognizer
.
Primero, en viewDidLoad
u otro método de su elección, cree una vista de imagen, dele una imagen, un marco y permita su interacción con el usuario. Luego crea los tres gestos de la siguiente manera. Asegúrese de utilizar su propiedad delegada (muy probablemente configurada como self). Esto será necesario para usar múltiples gestos al mismo tiempo.
- (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
}
Estos son los tres métodos que se llamarán cuando se detecten los gestos en su vista. Dentro de ellos, verificaremos el estado actual del gesto, y si está en el inicio o el cambioUIGestureRecognizerState
, leeremos la propiedad de escala / rotación / traducción del gesto, aplicaremos esos datos a una transformación afín, aplicaremos la transformación afín a la imagen. ver, y luego restablecer la escala de gestos / rotación / traducción.
- (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 y muy importante, necesitará utilizar el método UIGestureRecognizerDelegategestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
para permitir que los gestos funcionen al mismo tiempo. Si estos tres gestos son los únicos tres gestos que tienen esta clase asignada como su delegado, simplemente puede regresarYES
como se muestra a continuación. Sin embargo, si tiene gestos adicionales que tienen esta clase asignada como su delegado, es posible que deba agregar lógica a este método para determinar qué gesto es cuál antes de permitir que todos trabajen juntos.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
No olvide asegurarse de que su clase cumpla con el protocolo UIGestureRecognizerDelegate . Para hacerlo, asegúrese de que su interfaz se vea así:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Si prefiere jugar con el código en un proyecto de muestra en funcionamiento, puede encontrar el proyecto de muestra que he creado que contiene este código aquí.
userInteractionEnabled
todavía debe establecerse en YES / true en Xcode 8 Objective-C / Swift