7

私はiPhone用のObjective-Cプログラムを書いています。

を実装しようとしてUILongPressGestureRecognizerいますが、希望どおりに動作させることができません。

私がやりたいことは簡単です:

画面上で押し続けているタッチに応答します。

UILongPressGestureRecognizerタッチが動くときもタッチが始まるときも問題なく動作しますが、同じ場所でタッチを押し続けると何も起こりません。

なんで?

タッチを開始し、移動せず、まったく同じ場所にとどまるにはどうすればよいですか?

これが私の現在のコードです。


// Configure the press and hold gesture recognizer 
touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(touchAndHold:)]; 
touchAndHoldRecognizer.minimumPressDuration = 0.1; 
touchAndHoldRecognizer.allowableMovement = 600;
[self.view addGestureRecognizer:touchAndHoldRecognizer];
4

1 に答える 1

12

説明する動作は、移動していないときにジェスチャレコグナイザがハンドラへの呼び出しをそれ以上受け取らない場合の標準的な動作です。state移動するときのこれらのジェスチャのプロパティはタイプUIGestureRecognizerStateChangedであるため、変更がない場合はハンドラーが呼び出されないことは理にかなっています。

あなたは出来る

  • ジェスチャレコグナイザーを呼び出すと、繰り返しタイマーstateが開始されます。UIGestureRecognizerStateBegan
  • 、、、またはその後stateでジェスチャレコグナイザを呼び出したら、タイマーを解放します。UIGestureRecognizerStateCancelledUIGestureRecognizerStateFailedUIGestureRecognizerStateEndedinvalidate
  • ジェスチャレコグナイザーメソッドが、探している値をクラスプロパティに保存していることを確認します(たとえば、の値などlocationInView

だから、多分次のようなものです:

@interface ViewController ()

@property (nonatomic) CGPoint location;
@property (nonatomic, strong) NSTimer *timer;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    gesture.minimumPressDuration = 0.1;
    gesture.allowableMovement = 600;
    [self.view addGestureRecognizer:gesture];
}

- (void)handleTimer:(NSTimer *)timer
{
    [self someMethod:self.location];
}

- (void)handleGesture:(UIGestureRecognizer *)gesture
{
    self.location = [gesture locationInView:self.view];

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
    }
    else if (gesture.state == UIGestureRecognizerStateCancelled ||
             gesture.state == UIGestureRecognizerStateFailed ||
             gesture.state == UIGestureRecognizerStateEnded)
    {
        [self.timer invalidate];
        self.timer = nil;
    }

    [self someMethod:self.location];
}

- (void)someMethod:(CGPoint)location
{
    // move whatever you wanted to do in the gesture handler here.

    NSLog(@"%s", __FUNCTION__);
}

@end
于 2013-02-01T03:54:35.967 に答える