これは私が作成した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];
}
}
私にとってはうまくいきます:
最初にこれを設定します:[self setUserInteractionEnabled:YES];
その後:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(method:)];
tap.numberOfTapsRequired = 1;
[self addGestureRecognizer:tap];
ラベルがスーパービューの範囲外にある可能性が低い場合、タッチ処理は機能しない可能性があります。ジェスチャ認識コードが正しいように見えるので、チェックする価値があります。
もう1つ試してみてください。ビューにジェスチャ認識機能を追加するコードが実行されていますか?あなたがそれを呼ぶとき、あなたはどのような方法をとっていますか?
私は自分のプロジェクトでこのコードを試しましたが、うまく機能しました。
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
}
私はあなたのための良い例を見つけました: stackoverflow link
これは、クラスにジェスチャーレコグナイザーを実装する方法のステップバイステップガイドです。
クラスを
UIGestureRecognizerDelegate
プロトコルに準拠させます。ジェスチャレコグナイザをインスタンス化します。たとえば、
UITapGestureRecognizer
をインスタンス化するには、次のようにします。
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
ここで、アクションはジェスチャを処理するセレクタです。ここで、セレクターhandleTapFromは次のようになります。
- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer { //Code to handle the gesture }
セレクターへの引数はジェスチャレコグナイザーです。このジェスチャレコグナイザーを使用して、そのプロパティにアクセスできます。たとえば、
UIGestureRecognizerStateBegan
、UIGestureRecognizerStateEnded
などのジェスチャレコグナイザーの状態を見つけることができます。インスタンス化されたジェスチャレコグナイザで必要なプロパティを設定します。たとえば、
UITapGestureRecognizer
の場合、プロパティnumberOfTapsRequired
とnumberOfTouchesRequired
を設定できます。ジェスチャを検出するビューにジェスチャレコグナイザを追加します。サンプルコード(参照用にそのコードを共有します)では、次のコード行を使用してジェスチャレコグナイザーをimageViewに追加します。
[self.imageView addGestureRecognizer:tapGestureRecognizer];
ジェスチャレコグナイザーをビューに追加した後、ジェスチャレコグナイザーのデリゲート、つまりすべてのジェスチャレコグナイザーを処理するクラスを設定します。サンプルコードでは、次のようになります。
tapGestureRecognizer.delegate = self;
注:ジェスチャ認識機能をビューに追加した後、デリゲートを割り当てます。それ以外の場合、アクションメソッドは呼び出されません。
これを試して:
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
}
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn:)];
[self.view addGestureRecognizer:gesture];
self.UserInteractionEnabled=TRUE;
このようにメソッドを追加します
- (void) tappedOn:(UIGestureRecognizer*)sender
{
}
これを試してください
正常に動作しているように見えますが、「ジェスチャー」の前でタイプを忘れていませんか?以下を参照し、コードの前に追加されたUITapGestureRecognizerに注意してください。
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];
詳細については、 ラベルをクリック可能にする方法に関するこの回答 を参照してください。
これが役立つかどうかはわかりませんが、タッチイベントを受信するには、setExclusiveTouch
を排他的に使用します。
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];
[self setExclusiveTouch:YES];
同様の苛立たしい問題がありました。解決策は、ビューの親ビューの「ユーザーインタラクションを有効にする」プロパティもtrueに設定されていることを確認することでした。これは、IBの[表示] => [インタラクション]で設定できます。
動作するはずです。ラベルサブクラスコード内にジェスチャーを追加したようです。 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];
}