私はiPhoneアプリを構築しています。UIImageView サブクラス オブジェクトのセットを含む UIView があります。ユーザーはタッチで画像ビューをドラッグおよび回転できます。画像ビューを回転した後、画像ビューを移動するのに問題があります。
画像ビューを回転するには、変換回転を適用しますが、これは正常に機能します。次のようになります。
CGAffineTransform trans = self.transform;
self.transform = CGAffineTransformRotate(trans, delta);
ユーザーがタッチで要素を移動しようとすると、後で問題が発生します。touchesBegan:WithEvent: では、開始点をクラス変数 startLocation: に保存します。
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
// Retrieve the touch point
CGPoint pt = [[touches anyObject] locationInView:self];
startLocation = pt;
}
touchesMoved:withEvent: には、次のコードがありました。これは、画像ビューに回転変換がない場合でも十分に機能します。
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
self.center = newCenter;
}
しかし、画像ビューに回転変換がある場合、画像ビューは touchesMoved イベントごとに画面上でスラッシングし、すぐに消えます。デバッガーで、pt の値が非常に大きくなっていることがわかりました。その点を変換する必要があることに気づき、次のようにしました。
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
if (!CGAffineTransformIsIdentity(self.transform)) {
pt = CGPointApplyAffineTransform(pt, self.transform);
}
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
}
これははるかにうまく機能しました。画面上で画像をドラッグできるようになりました。ただし、変換の回転角度とイメージ ビューのサイズに応じて、最初の動きでイメージがいずれかの方向に 1 回揺れます。
最初の衝撃を与えずに画像ビューを移動するにはどうすればよいですか?
startLocation (タッチが開始されたときにキャプチャしたポイント) を変換する必要がないのはなぜですか?