UITapGestureRecognizer无法在UIImageView中运行

xon*_*rlz 25 iphone objective-c uiimageview ipad ios

我有以下代码:

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

然而这并没有触发showNewsStory,为什么会这样呢?我在图像视图中启用了userInteraction.

Kju*_*uly 74

您应该为UIImageView对象启用用户交互:

[self.storyImageView_ setUserInteractionEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

编辑:

尝试删除

[showStoryTapRecognizer setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

UITapGestureRecognizer据我所知,我认为它没有代表方法.


小智 53

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

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;
Run Code Online (Sandbox Code Playgroud)

  • 但是,不要忘记设置`imageView.userInteractionEnabled = YES;` (88认同)

Rad*_*lin 9

UIImageView是默认情况下禁用用户交互的UIView内部唯一子类UIKit.

  • UILabel也禁用了它. (5认同)
  • 浪费了很多时间在这上面.谢谢.那个复选框很好地隐藏了;) (2认同)

qua*_*ddy 5

我还注意到,在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
}()
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您必须使用 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
}()
Run Code Online (Sandbox Code Playgroud)