32

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

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

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

4

10 に答える 10

78

UIImageViewオブジェクトのユーザーインタラクションを有効にする必要があります。

[self.storyImageView_ setUserInteractionEnabled:YES];

編集:

削除してみてください

[showStoryTapRecognizer setDelegate:self];

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

于 2012-07-19T00:14:48.923 に答える
62
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;
于 2012-07-19T10:56:38.963 に答える
14

UIImageViewUIViewUIKitの他のほとんどのサブクラスとは異なり、デフォルトではユーザーインタラクションが無効になっています。

于 2012-07-19T00:52:05.627 に答える
7

また、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
}()
于 2017-06-21T21:30:51.050 に答える
4

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

otherTapRecognizer.cancelsTouchesInView = NO;
于 2012-07-19T01:23:18.217 に答える
2

Objective-C ios 10

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

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;

//迅速な3.0

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

imageView.addGestureRecognizer(oneTouch)

imageView.isUserInteractionEnabled = true
于 2016-12-12T05:21:14.583 に答える
2

すでに設定しているimageView.userInteractionEnabled = YES;のに、アクションが実行されない場合。imageViewのスーパービューの1つでuserInteractionEnabledがNOであることが原因である可能性があります。

于 2017-06-21T03:18:57.247 に答える
1

追加

storyImageView.isUserInteractionEnabled = true;

于 2021-04-26T22:17:25.110 に答える
0

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

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

Objective C

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

迅速

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
于 2018-11-01T08:23:08.277 に答える
0
    use lazy var instead of let . Here is an example.

    lazy var loginSignUpView: LoginSignUpView = {
            let lsv = LoginSignUpView()
            lsv.loginRegisterButton.addTarget(self, action: #selector(handleLoginRegistrationButton), for: .touchUpInside)
            lsv.segmentedControlForLoginRegister.addTarget(self, action: #selector(handleSegmentedControlForLoginRegister), for: .valueChanged)
            lsv.profileImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))

            return lsv
        }()


@objc func handleSelectProfileImageView() {
        print("Image tapped")
    }
于 2020-04-17T09:44:23.217 に答える