2

UIPanGestureRecognizerは、指を動かしているときにセレクターを呼び出すだけなので、操作に問題があります。指が同じ場所に立っていても、セレクターを呼び出し続けたいと思います。

画面には4つのオブジェクトがあり、1つは上部、1つは右側、1つは左側、もう1つは下部にあります。画面の中央にオブジェクトがあります(これは、panGestureで移動しているオブジェクトです)。このオブジェクトが他のオブジェクトに触れると、ログを取得したいのですが、触れたときに機能しますが、同じ場所に指を置いたままにするとログが停止し、少し動かすと再びログが表示されます。

とにかく同じ場所に指を置いてもセレクターを呼び出し続けることができますか?

コード例は次のとおりです。

- (void)moveObject:(UIPanGestureRecognizer *)sender
{
    CGPoint translation = [sender translationInView:self.limiteDirecional];
    [sender setTranslation:CGPointMake(0, 0) inView:self.limiteDirecional];

    CGPoint center = sender.view.center;
    center.y += translation.y;
    int yMin = 0;
    int yMax = self.limiteDirecional.frame.size.height;

    if (center.y < yMin || center.y > yMax )
        return;

    sender.view.center = center;

    center.x += translation.x;
    int xMin = self.limiteDirecional.frame.size.width;
    int xMax = 0;

    if (center.x > xMin || center.x < xMax)
        return;

    sender.view.center = center;

    if (CGRectIntersectsRect(sender.view.frame,self.Top.frame)) {
         NSLog(@"TOP");        
    }

    if (CGRectIntersectsRect(sender.view.frame,self.Botton.frame)) {
        NSLog(@"BOTTON");
    }

    if (CGRectIntersectsRect(sender.view.frame,self.Right.frame)) {
        NSLog(@"RIGHT");
    }

    if (CGRectIntersectsRect(sender.view.frame,self.Left.frame)) {
        NSLog(@" LEFT");
    }

    if (sender.state == UIGestureRecognizerStateEnded) {
        sender.view.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
    }
}
4

1 に答える 1

3

私はあなたのルーチンのロジックに完全には従っていないので、ユーザーが指を動かしているかどうかに関係なく、ジェスチャの途中で継続的なイベントが必要な場合にソリューションがどのように見えるかについての一般的なテンプレートを提供します。うまくいけば、あなたはあなた自身の目的のためにこのテクニックを適応させることができます。

これはCADisplayLink、を使用します。これは、を使用する古い手法よりもアニメーションに適した手法と見なされていNSTimerます。CADisplayLinkただし、使用するには、必要なフレームワークQuartzCore.frameworkをプロジェクトに追加する必要があります(まだ追加していない場合)。また、ジェスチャレコグナイザーでは、ジェスチャの状態をチェックして、ジェスチャを開始するのか、途中で開始するのか、終了するのかを確認しています。

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()

@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CGPoint translationInView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                              action:@selector(handleGesture:)];
    // I'm adding to the main view, but add it to whatever you want
    [self.view addGestureRecognizer:gesture]; 
}

- (void)startDisplayLink
{
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)stopDisplayLink
{
    [self.displayLink invalidate];
    self.displayLink = nil;
}

- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
    NSLog(@"%s translationInView = %@", __FUNCTION__, NSStringFromCGPoint(self.translationInView));

    // Do here whatever you need to happen continuously while the user is in the
    // middle of the gesture, whether their finger is moving or not.
}

- (void)handleGesture:(UIPanGestureRecognizer *)gesture
{
    self.translationInView = [gesture translationInView:gesture.view];

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        [self startDisplayLink];

        // Do whatever other initialization stuff as the user starts the gesture
        // (e.g. you might alter the appearance of the joystick to provide some
        // visual feedback that they're controlling the joystick).
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        // Do here only that stuff that actually changes as the user is moving their
        // finger in the middle of the gesture, but which you don't need to have
        // repeatedly done while the user's finger is not moving (e.g. maybe the
        // visual movement of the "joystick" control on the screen).
    }
    else if (gesture.state == UIGestureRecognizerStateEnded ||
             gesture.state == UIGestureRecognizerStateCancelled ||
             gesture.state == UIGestureRecognizerStateFailed)
    {
        [self stopDisplayLink];

        // Do whatever other cleanup you want to do when the user stops the gesture
        // (e.g. maybe animating the moving of the joystick back to the center).
    }
}
@end

を使用しても同様の効果が得られますNSTimer。あなたにとってより良いものは何でも。

于 2013-02-16T05:59:08.543 に答える