0

回転可能なViewControllerに画像を追加しようとしています。

問題は、可動オブジェクトを回転させようとするとすぐに、オブジェクトが初期化された場所、原点 x、y に移動し、その場で回転するのではなく、そこで回転することです。私の質問は、どうすればこれを防ぐことができるかということです。移動が終了したらすぐにオブジェクトの位置を設定する方法はありますか?

#import "MovableImageView.h"

@implementation MovableImageView

-(id)initWithImage:(UIImage *)image
{
    self = [super initWithImage:image];
    if (self) {
        UIRotationGestureRecognizer *rotationGestureRecognizer= [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotations:)];
        [self addGestureRecognizer:rotationGestureRecognizer];

    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    float deltaX = [[touches anyObject] locationInView:self].x - [[touches anyObject] previousLocationInView:self].x;
    float deltaY = [[touches anyObject] locationInView:self].y - [[touches anyObject] previousLocationInView:self].y;
    self.transform = CGAffineTransformTranslate(self.transform, deltaX, deltaY);
}

-(void) handleRotations: (UIRotationGestureRecognizer *) paramSender
{
    self.transform= CGAffineTransformMakeRotation(self.rotationAngleInRadians + paramSender.rotation);
    if (paramSender.state == UIGestureRecognizerStateEnded) {
        self.rotationAngleInRadians += paramSender.rotation;
    }
}

@end
4

1 に答える 1

1

まず、移動のタッチを検出する代わりに UIPanGestureRecognizer を使用することをお勧めします。変換を処理する方がはるかに簡単だからです。UIRotationGestureRecognizer がある場合は、ジェスチャ レコグナイザーをリセットする前に、既存の変換に回転を適用します。

self.transform = CGAffineTransformRotate(self.transform, paramSender.rotation;
paramSender.rotation = 0;

この方法では、回転を追跡する必要がなく、動きを処理できます。ここでも、UIPanGestureRecognizer を処理するときに、既存の変換に翻訳を適用できます。

-(void)pan:(UIPanGestureRecognizer*)panGesture
{
    CGPoint translation = [panGesture translationInView:self];
    self.transform = CGAffineTransformTranslate(self.transform, translation.x, translation.y);
    [panGesture setTranslation:CGPointZero inView:self];
}

(これらのメソッドを使用するには、初期化メソッドでself.transform を設定する必要がある場合がCGAffineTransformIdentityあります)。

于 2013-10-14T08:55:42.867 に答える