2012-02-09 4 views
0

J'ai un problème avec l'inversion d'une échelle de transformation pour ainsi dire. Voici mon code:Inverser une échelle de transformation

- (void)updateTransforms { 

    CGAffineTransform holeTransform = CGAffineTransformIdentity; 
    holeTransform = CGAffineTransformTranslate(holeTransform, _holeOffset.x, _holeOffset.y); 
    holeTransform = CGAffineTransformRotate(holeTransform, _holeRotation); 
    //Problem code: 
    holeTransform = CGAffineTransformScale(holeTransform, _holeScale, _holeScale); 

    self.transform = holeTransform; 
    self.imageToUse.transform = CGAffineTransformInvert(holeTransform); } 

Ceci est fondamentalement une méthode qui me permet de faire pivoter, de faire un panoramique, et de mettre à l'échelle mon objet. L'effet désiré que je veux est le contraire de chaque action. Donc, si vous vous déplacez vers la gauche, l'image se déplace vers la droite, tourne vers la gauche, pivote vers la droite, agrandit, l'image redescend au même rythme. Ce code fonctionne parfaitement jusqu'à présent pour le panoramique et la rotation. Le problème que je crois réside dans l'inversion de l'échelle, parce que l'échelle ne devient pas réellement négative, elle augmente simplement ou diminue de 1,0. Comment puis-je modifier mon code pour que la mise à l'échelle fonctionne correctement? Merci.

Répondre

2

Vous n'avez pas mentionné ce qui se passe réellement de manière incorrecte avec votre transformation de mise à l'échelle. Mais depuis I helped you get the rotation and panning working, je vais prendre un coup à ce sujet. Comme picciano souligné dans sa réponse, pour inverser un facteur d'échelle, vous prenez sa réciproque, pas son négatif. Vous pensez apparemment que vous avez besoin du négatif du facteur d'échelle. Sur la base de ce que je spécule que vous initialisant à 0 (ce qui est son propre négatif) au lieu de 1 (qui est son propre réciproque) et obtenir des erreurs comme ceci:

Feb 9 14:17:41 Robs-iPad-2 imagehole[3138] <Error>: CGAffineTransformInvert: singular matrix. 

Voici ce que vous devez faire pour obtenir votre geste de pincement à l'échelle du trou correctement:

  1. Vous devez initialiser _holeScale à . Vous pouvez le faire en viewDidLoad ou viewWillAppear. Si vous avez un bouton de réinitialisation ou un contrôle similaire, vous devez le faire aussi.

  2. Vous devez multiplier _holeScale par le geste échelle de reconnaissance, et remettre la balance de reconnaissance à , non :

    - (IBAction)pinchGesture:(UIPinchGestureRecognizer *)sender { 
        _holeScale *= sender.scale; 
        sender.scale = 1; 
        [self updateTransforms]; 
    } 
    

Vous pouvez télécharger my test project pour voir un exemple de travail .

+0

Salut Rob, mettre le _holeScale à 1.0 était en effet le coupable. Après cela, vous n'avez pas besoin de multiplier le _holeScale par sender.scale et vous? – user339946

+0

Essayez-le et voir. –

+0

Je vois, j'ai mal compris comment fonctionnait CGAffineTransformScale. – user339946

2

Cela devrait le faire: 2.0f devient 0.5f, 5.0f devient 0.2f, etc Vous avez probablement besoin de créer un nouvel objet de transformation, plutôt que d'essayer de faire l'inversion de transformation.

holeTransform = CGAffineTransformScale(holeTransform, 1.0f/_holeScale, 1.0f/_holeScale); 
Questions connexes