2011-12-03 6 views
2

さて、私はここでは非常に奇妙な(私にとっては)問題にぶつかっています。私は自分のビューで150x150のボタンを持っており、私はそのボタンにUILongPressGestureRecognizerを追加しました。ボタンを押したときにボタンが押されたポイントを取得する必要があるからです。これを行うコードは、次のようになります。タッチポイントを取得しようとすると、NaNが返される

-(CGPoint)detectedTouch:(UILongPressGestureRecognizer *)sender { 

    CGPoint touchPoint = [sender locationInView:button]; 
    return touchPoint; 
} 


-(void)myAction { 

    CGPoint touchPoint = [self detectedTouch:myGestureRecognizer]; 
    NSLog(@"touchPoint = %f, %f", touchPoint.x, touchPoint.y); 

    //do stuff 
} 

ボタンが通常の表示になっていれば、すべて正常に機能します。しかし、ボタンがscrollView上にあるとき、それはあなたがそれを約1秒間押したときにのみ機能します。あなたもすぐにそれを解放した場合、ログは私にこれを与える:

touchPoint = nan, nan 

この問題を解決するための任意の助けをいただければ幸いです!

答えて

2

UIGestureRecognizerには、寿命、認識、失敗、終了、キャンセルなどのさまざまな状態があります。私は州のあなたの認識メソッドの中にswitch文を入れて、問題の絞り込みを行っています。それはこのようになります:

switch (sender.state){ 
    case UIGestureRecognizerStatePossible: 
     NSLog(@"possible"); 
     break; 
    case UIGestureRecognizerStateFailed: 
     NSLog(@"Failed!"); 
     break; 
    ... All Cases wanted 
    default: 
     break; 
} 

私は、内部の詳細を知っているが、それが失敗した場合、おそらく/それはビュー内の場所をピックアップしていませんキャンセルしないでください。

ジェスチャ認識子をサブクラス化し、発生する可能性のある状態についての文書です。

http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html

+0

これはありがたいですが、どういうわけか私の問題はscrollViewに関連しています。タッチポイントを取得するポイントは、タッチした場所に応じて、ボタンをアニメーション化する方法が異なります。ちょうどテストするために、私はタッチ位置を確認する部分を削除し、押し下げたときにボタンをy軸の下に移動させ、もう押さなくなったら元の位置に戻しました。通常のビューでは、期待どおりに動作しますが、scrollViewでは遅延(上記のような)の後にのみ動作し、アニメーションは流動的ではありません。何か案は? – kopproduction

0

私はあなたの問題を再現しようとしましたが、成功しませんでした。最初は、ジェスチャ認識機能がscrollViewスクロールジェスチャ認識機能を妨害している可能性があると思ったが、そうではないようだ。ここで私が持っているコードです:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongHold:)]; 
// [scrollView addGestureRecognizer:recognizer]; 
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 2000)]; 
    lbl.text = @"lorem ipsum......"; 
    lbl.numberOfLines = 0; 
    scrollView.contentSize = CGSizeMake(lbl.frame.size.width, lbl.frame.size.height); 
    [scrollView addSubview:lbl]; 
    btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btn.frame = CGRectMake(0, 0, 150, 150); 
    [btn addGestureRecognizer:recognizer]; 
    [scrollView addSubview:btn]; 

    v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
    v.backgroundColor = [UIColor yellowColor]; 
    v.hidden = YES; 
    [scrollView addSubview:v]; 
} 

- (void) handleLongHold:(UILongPressGestureRecognizer*) recognizer { 
    NSLog(@"long tap handled"); 
    v.hidden = NO; 
    v.center = [recognizer locationInView:btn]; 
} 

はところで、私はジェスチャー認識セレクタからのタッチポイントを見つけるための方法を探して、あなたの質問につまずいた - locationInView方法は、私を助けて、うまくいけば、このコードは、あなたを助けます。

関連する問題