10

これは私が作成した 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];
}
}
4

10 に答える 10

4

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

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

于 2013-09-20T12:44:55.530 に答える
2

良い例を見つけました:stackoverflow link

これは、クラスにジェスチャ認識エンジンを実装する方法に関する段階的なガイドです。

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

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

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

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

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

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

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

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

[self.imageView addGestureRecognizer:tapGestureRecognizer];

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

tapGestureRecognizer.delegate = self;

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

于 2013-09-20T12:19:33.543 に答える
1

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

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

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

于 2014-07-24T22:34:16.220 に答える
0

それはうまくいくはずです。ラベルのサブクラス コード内にジェスチャーを追加したようです。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];

}

于 2013-09-20T11:31:17.927 に答える