Oui, un UIGestureRecognizer peut être ajouté à une UIImageView. Comme indiqué dans l'autre réponse, il est très important de se rappeler pour permettre l'interaction de l'utilisateur sur l'affichage de l'image en réglant sa userInteractionEnabled
de la propriété d' YES
. UIImageView hérite de UIView, dont l'interaction de l'utilisateur propriété est définie à l' YES
par défaut, cependant, UIImageView de l'interaction de l'utilisateur propriété est définie à l' NO
par défaut.
À partir de la UIImageView docs:
Nouvelle image à visualiser les objets sont configurés de manière à ignorer les événements de l'utilisateur par
par défaut. Si vous souhaitez gérer des événements dans une sous-classe personnalisée de
UIImageView, vous devez modifier la valeur de la
userInteractionEnabled bien OUI après l'initialisation de l'objet.
De toute façon, sur la majeure partie de la réponse. Voici un exemple de comment créer un UIImageView
avec un UIPinchGestureRecognizer
, UIRotationGestureRecognizer
, et un UIPanGestureRecognizer
.
Tout d'abord, en viewDidLoad
, ou une autre méthode de votre choix, créer une image, une image, un cadre, et de permettre son interaction avec l'utilisateur. Créez ensuite les trois gestes comme suit. Assurez-vous d'utiliser leurs délégué à la propriété (le plus probable pour moi). Ceci sera nécessaire d'utiliser plusieurs gestes en même temps.
- (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
}
Ici sont les trois méthodes qui seront appelées lors de l'gestes sur votre point de vue sont détectés. À l'intérieur, nous allons vérifier l'état actuel de la geste, et si c'est dans le ont débuté ou modifiés UIGestureRecognizerState
nous allons lire le geste de l'échelle/rotation/translation de la propriété, appliquer les données à une transformation affine, appliquer la transformation affine pour l'affichage de l'image, puis réinitialiser les gestes de l'échelle/rotation/translation.
- (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];
}
}
Enfin et surtout, vous aurez besoin d'utiliser la UIGestureRecognizerDelegate méthode gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
afin de permettre les gestes de travailler en même temps. Si ces trois gestes sont les trois seuls les gestes qui ont cette classe affecté en tant que délégué, vous pouvez simplement retourner YES
comme indiqué ci-dessous. Toutefois, si vous avez d'autres gestes qui ont cette classe affecté en tant que délégué, vous devrez peut-être ajouter de la logique de cette méthode pour déterminer le geste est qui avant de leur permettre de travailler tous ensemble.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
N'oubliez pas de assurez-vous que votre classe est conforme à la UIGestureRecognizerDelegate protocole. Pour ce faire, assurez-vous que votre interface ressemble à quelque chose comme ceci:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Si vous préférez jouer avec le code dans un exemple de projet vous-même, l'exemple de projet, j'ai créé contenant ce code peut être trouvé ici.