web-dev-qa-db-ja.com

UITapGestureRecognizerがUIImageViewで機能しない

私は次のコードを持っていました:

UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)];
[showStoryTapRecognizer setDelegate:self];
[self.storyImageView_ addGestureRecognizer:showStoryTapRecognizer];
[showStoryTapRecognizer release];

ただし、これはshowNewsStoryをトリガーしません。なぜですか?画像ビューでuserInteractionを有効にしました。

27
xonegirlz
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;
52
user1503512

UIImageViewオブジェクトのユーザー操作を有効にする必要があります:

[self.storyImageView_ setUserInteractionEnabled:YES];

編集:

削除してみてください

[showStoryTapRecognizer setDelegate:self];

私が知る限り、UITapGestureRecognizerにはデリゲートメソッドはないと思います。

74
Kjuly

UIImageViewは、UIView内のUIKitの唯一のサブクラスであり、デフォルトではユーザー操作が無効になっています。

9

Swift3では、ターゲットも検索するジェスチャーレコグナイザーを追加していて、ターゲットが通常selfである場合、ジェスチャーレコグナイザーを追加するUIViewを、 lazy var。そうしないと、ジェスチャー認識機能が機能しません。これはSwift3のバグだと思います。理想的には、クラスが完全に初期化される前に変数のselfにアクセスしている場合、エラーがスローされるはずです。以下のコードはジェスチャー認識機能を検出しません。

let messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()

これを修正するには、lazy varを使用する必要があります

lazy var messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()
4
quantdaddy

多分... action:@selector(showNewsStory)の代わりにaction:@selector(showNewsStory:)。これをチェックしてください 。このコントローラに他のUITapGestureRecognizerはありますか?これを試して:

otherTapRecognizer.cancelsTouchesInView = NO;
4
Carina

objective-C ios 10

UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;

// Swift 3.0

   let oneTouch = UITapGestureRecognizer(target: self, action: #selector(self.OneTouchHandeler(_:)))

imageView.addGestureRecognizer(oneTouch)

imageView.isUserInteractionEnabled = true
2
dahiya_boy

既に設定している場合imageView.userInteractionEnabled = YES;しかし、アクションはまだ発生しません。おそらく、imageViewのスーパービューの1つがuserInteractionEnabledがNOだからです。

1
dopcn

2つの異なるジェスチャーを許可した場合は、以下のコードスニペットを追加する必要があります。たとえば、pickerViewを使用し、同じpickerViewのタップジェスチャを検出したいとします。

2人のジェスチャー認識機能が同時にジェスチャーを認識できるようにする必要があるかどうかをデリゲートに尋ねます。

目的C

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return true;
}

スウィフト

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
0
Emre Gürses