186 votes

UIGestureRecognizer sur UIImageView

J’ai un `` , dont je veux être en mesure de redimensionner et faire pivoter etc..

Peut un être ajouté à la ?

Je voudrais ajouter un module de reconnaissance de rotation et pincée à un `` qui serait créée lors de l’exécution.

Comment on ajoute ces modules de reconnaissance ?

434voto

Anna Points 44332

Vérifiez qu’userInteractionEnabled est oui sur le UIImageView. Vous pouvez ensuite ajouter un module de reconnaissance de geste.

78voto

0x7fffffff Points 40133

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X