web-dev-qa-db-ja.com

iPhoneでジェスチャーレコグナイザーが何らかの理由で機能しない

これは私が作成したUILabelサブクラスにありますが、機能していないようです。何らかの理由で「tappedOn」を呼び出しません。

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];

なぜそうなるのか知っていますか?

TappedOnメソッドは次のとおりです。

-(void)tappedOn
{

NSLog(@"tapped");
if ([self.type isEqualToString: @"load"])
{
    [self.manager.manager loadSavedGameInRow:self.name];
}

if ([self.type isEqualToString: @"save"])
{
    [self.manager.manager saveGameInRow:self.name];
}
}
9
Horton Jackson

私にとってはうまくいきます:

最初にこれを設定します:[self setUserInteractionEnabled:YES];

その後:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(method:)];
tap.numberOfTapsRequired = 1;

[self addGestureRecognizer:tap];
21
Irfa

ラベルがスーパービューの範囲外にある可能性が低い場合、タッチ処理は機能しない可能性があります。ジェスチャ認識コードが正しいように見えるので、チェックする価値があります。

もう1つ試してみてください。ビューにジェスチャ認識機能を追加するコードが実行されていますか?あなたがそれを呼ぶとき、あなたはどのような方法をとっていますか?

4
Zev Eisenberg

私は自分のプロジェクトでこのコードを試しましたが、うまく機能しました。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureUpdated:)];
    tapGesture.delegate = self;
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.numberOfTouchesRequired = 1;
    tapGesture.cancelsTouchesInView = NO;
    [[self view] addGestureRecognizer:tapGesture];

- (IBAction)tapGestureUpdated:(UIGestureRecognizer *)recognizer
{
    // Code to respond to gesture here
}
4
Manthan

私はあなたのための良い例を見つけました: stackoverflow link

これは、クラスにジェスチャーレコグナイザーを実装する方法のステップバイステップガイドです。

クラスをUIGestureRecognizerDelegateプロトコルに準拠させます。

ジェスチャレコグナイザをインスタンス化します。たとえば、UITapGestureRecognizerをインスタンス化するには、次のようにします。

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];

ここで、アクションはジェスチャを処理するセレクタです。ここで、セレクターhandleTapFromは次のようになります。

- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer
{
    //Code to handle the gesture
}

セレクターへの引数はジェスチャレコグナイザーです。このジェスチャレコグナイザーを使用して、そのプロパティにアクセスできます。たとえば、UIGestureRecognizerStateBeganUIGestureRecognizerStateEndedなどのジェスチャレコグナイザーの状態を見つけることができます。

インスタンス化されたジェスチャレコグナイザで必要なプロパティを設定します。たとえば、UITapGestureRecognizerの場合、プロパティnumberOfTapsRequirednumberOfTouchesRequiredを設定できます。

ジェスチャを検出するビューにジェスチャレコグナイザを追加します。サンプルコード(参照用にそのコードを共有します)では、次のコード行を使用してジェスチャレコグナイザーをimageViewに追加します。

[self.imageView addGestureRecognizer:tapGestureRecognizer];

ジェスチャレコグナイザーをビューに追加した後、ジェスチャレコグナイザーのデリゲート、つまりすべてのジェスチャレコグナイザーを処理するクラスを設定します。サンプルコードでは、次のようになります。

tapGestureRecognizer.delegate = self;

注:ジェスチャ認識機能をビューに追加した後、デリゲートを割り当てます。それ以外の場合、アクションメソッドは呼び出されません。

2
incmiko

これを試して:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {

    return true

}

私はObjCに精通していないため、Swiftを使用します。Returntrueは同時認識を可能にすることが保証されています。

次のように、競合を回避するためにいくつかの制約を設定したい場合があります。

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer == singleTapShowHideRecognizer {
        return true
    }
    return false
}
2
billphilip22
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn:)];
[self.view addGestureRecognizer:gesture];
self.UserInteractionEnabled=TRUE;

このようにメソッドを追加します

- (void) tappedOn:(UIGestureRecognizer*)sender
{
}

これを試してください

1
Jitendra

正常に動作しているように見えますが、「ジェスチャー」の前でタイプを忘れていませんか?以下を参照し、コードの前に追加されたUITapGestureRecognizerに注意してください。

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];

詳細については、 ラベルをクリック可能にする方法に関するこの回答 を参照してください。

1
siege_Perilous

これが役立つかどうかはわかりませんが、タッチイベントを受信するには、setExclusiveTouchを排他的に使用します。

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];
[self setExclusiveTouch:YES];
0
βhargavḯ

同様の苛立たしい問題がありました。解決策は、ビューの親ビューの「ユーザーインタラクションを有効にする」プロパティもtrueに設定されていることを確認することでした。これは、IBの[表示] => [インタラクション]で設定できます。

0
ArturT

動作するはずです。ラベルサブクラスコード内にジェスチャーを追加したようです。 initWithFrame:メソッドとinitWithCoder:メソッドの両方を入れてもよろしいですか? XIBを使用して、またはプログラムでラベルをインスタンス化するという事実に基づいて、2つのinitを個別に呼び出すことができるためです。

例:


@implementation MyLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addGesture];
   }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self addGesture];
    }
    return self;
}

-(void)addGesture {
    UITapGestureRecognizer *_g = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTap:)];
    [self addGestureRecognizer:_g];
    [self setUserInteractionEnabled:YES];

}

0
viggio24