Eine Skala-Transformations verlässt den Ursprung (0, 0) unberührt. Um eine Ansicht um einen bestimmten Punkt herum zu skalieren, müssen Sie diesen Punkt zuerst in den Ursprung übersetzen, dann die Skala anwenden und dann zurück übersetzen.
- (IBAction)pinchGestureDidFire:(UIPinchGestureRecognizer *)pinch {
Zuerst bekommen wir die Ansicht eingeklemmt.
UIView *pinchView = pinch.view;
das Zentrum der Quetschung zu berechnen, werden wir den Mittelpunkt der Grenzen des Ansicht benötigen, so erhalten wir die auch Grenzen gesetzt:
CGRect bounds = pinchView.bounds;
Das Zentrum auf den Schwerpunkt der Quetschung des basiert berührt, die wir auf diese Weise erhalten:
CGPoint pinchCenter = [pinch locationInView:pinchView];
Aber wir brauchen eigentlich die Prise in die Mitte der Ansicht versetzt, weil der Blick auf die Mitte der Ansicht standardmäßig relativ Transformation des ist. (Sie können dies durch die layer.anchorPoint
Ansicht zu ändern ändern.)
pinchCenter.x -= CGRectGetMidX(bounds);
pinchCenter.y -= CGRectGetMidY(bounds);
Jetzt können wir die Ansicht der Transformation aktualisieren. Zuerst bekommen wir seine aktuelle Transformation:
CGAffineTransform transform = pinchView.transform;
Dann aktualisieren wir die Prise Zentrum auf den Ursprung zu übersetzen:
Jetzt können wir den Maßstab anwenden:
CGFloat scale = pinch.scale;
transform = CGAffineTransformScale(transform, scale, scale);
Dann wir übersetzen Sie die Ansicht zurück:
transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y);
Jetzt können wir die Ansicht mit der Transformation modifiziert aktualisieren:
pinchView.transform = transform;
Schließlich haben wir die Gestenerkenner-Skala zurückgesetzt, da wir den aktuellen Maßstab angewendet haben:
pinch.scale = 1.0;
}
Demo:

Beachten Sie, dass Sie im Simulator die Option (Alt) für eine Pinch-Geste halten können. Wenn Sie die Umschalttaste gedrückt halten (während Sie die Option gedrückt halten), werden die beiden Berührungen zusammengeführt.
Hier ist der Code alle zusammen für Kopieren/Einfügen:
- (IBAction)pinchGestureDidFire:(UIPinchGestureRecognizer *)pinch {
UIView *pinchView = pinch.view;
CGRect bounds = pinchView.bounds;
CGPoint pinchCenter = [pinch locationInView:pinchView];
pinchCenter.x -= CGRectGetMidX(bounds);
pinchCenter.y -= CGRectGetMidY(bounds);
CGAffineTransform transform = pinchView.transform;
transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y);
CGFloat scale = pinch.scale;
transform = CGAffineTransformScale(transform, scale, scale);
transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y);
pinchView.transform = transform;
pinch.scale = 1.0;
}
Dies scheint nicht für mich zu arbeiten (obwohl es scheint, wie es sollte)? Ich habe das oben beschriebene implementiert und kann immer noch nur auf eine Stelle des Bildes zoomen. – Brittany
Sind Sie sicher, dass Sie den Gestenerkenner mit der neuen Methode verbunden haben und ihn nicht mit der alten Methode verbunden haben? Haben Sie einen 'NSLog' oder einen Haltepunkt in die neue Methode eingefügt, um sicherzustellen, dass er aufgerufen wird? –
ist es möglich, nicht proportional Zoom anzuwenden? Ich meine, dass x und y sich einzeln ändern? – user5599807