3

の中に を描きましUIBezierPathUIView。を使用して、pinchGesture拡大と縮小を試みます。

スケーリングは機能しますが、私の問題は、UIBezierPath下/上に移動することです(サイズが大きくなると下に移動し、サイズが小さくなると上に移動します)。

UIBezierPath中心が同じ場所にとどまるようにスケーリングのアンカーポイントを設定するにはどうすればよいですか?

- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer {
  CGAffineTransform transform = CGAffineTransformScale(recognizer.view.transform, 
                                                       recognizer.scale, 
                                                       recognizer.scale);
  [self.selectedObject applyAffineTransform:transform];
  recognizer.scale = 1;
}

affineTransform(selectedObject は、 を に適用するだけのオブジェクトですUIBezierPath)

スケーリングに加えて移動を適用して元の場所に戻そうとしましたが、移動の値を見つける方法がわからないため、パスは同じ場所にとどまります。

4

1 に答える 1

8

何度も試した後、なんとか解決できました。スケーリングの後、翻訳を追加する必要があります。翻訳の距離については、uibezierpath の境界を比較し、原点の変化と幅と高さの増加の半分を差し引く必要がありました。コードで翻訳されたものと同じです:

- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer {
CGRect originalBounds = self.selectedObject.bounds;

CGAffineTransform scale = CGAffineTransformMakeScale(recognizer.scale, recognizer.scale);
[self.selectedObject applyAffineTransform:scale];

CGAffineTransform translate = CGAffineTransformMakeTranslation(-(self.selectedObject.bounds.origin.x - originalBounds.origin.x) - (self.selectedObject.bounds.size.width - originalBounds.size.width) * 0.5, -(self.selectedObject.bounds.origin.y - originalBounds.origin.y) - (self.selectedObject.bounds.size.height - originalBounds.size.height) * 0.5);
[self.selectedObject applyAffineTransform:translate];

recognizer.scale = 1;
}

これが他の誰かにも役立つことを願っています。

于 2012-09-25T06:39:05.573 に答える