Iphone UIApgestureRecognitor在UIImageView中不工作

Iphone UIApgestureRecognitor在UIImageView中不工作,iphone,objective-c,ios,ipad,uiimageview,Iphone,Objective C,Ios,Ipad,Uiimageview,我有以下代码: UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)]; [showStoryTapRecognizer setDelegate:self]; [self.storyImageView_ addGestureRecognizer:showStoryTapRecogniz

我有以下代码:

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

然而,这并不会引发新闻秀,这是为什么?我已经在图像视图中启用了用户交互。

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

[self.storyImageView_ setUserInteractionEnabled:YES];

编辑: 试着把它去掉

[showStoryTapRecognizer setDelegate:self];
据我所知,
uitagesturerecognizer
没有委托方法。
UIImageView
默认情况下禁用了用户交互,这与UIKit中的大多数其他
UIView
子类不同。

可能<代码>操作:@selector(showNewsStory)而不是
操作:@selector(showNewsStory:)
。 请检查一下。 此控制器中是否有其他
UITapgestureRecognitor
? 试试这个:

otherTapRecognizer.cancelsTouchesInView = NO;
目标-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

如果您已经设置了
imageView.userInteractionEnabled=YES但操作仍然没有启动。可能是因为imageView的其中一个超级视图userInteractionEnabled不是

我还注意到,在swift3中,如果您添加的手势识别器也会查找目标,并且目标通常是
self
,那么您必须将要添加手势识别器的UIView设置为
lazy var
。否则,手势识别器将无法工作。我认为这是swift3中的一个bug。理想情况下,如果在类完全初始化之前访问变量中的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
}()

如果您允许两种不同的手势,则应添加以下代码段。例如,您使用pickerView,还希望检测同一pickerView的点击手势

询问学员是否允许两个手势识别器同时识别手势

目标C

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

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}


storyImageView.isUserInteractionEnabled=true

@xonegirlz事实上,我认为你给出的代码很好(除了我上面指出的代码)。可能其中一个子视图涵盖了
storyImageView.
@Kjuly[self.storyImageView.\uuuSetUserInteractionEnabled:YES];这很有帮助。但是UIGestureRecognizer是UIAccestureRecognizer的超类,所以我们可以在需要UIGestureRecognizerDelegate时设置委托。这才是真正的答案。除此之外,其余的都不适用于我。@voghDev很高兴它有帮助:)没关系,如果选择器错误,它将导致EXC_BAD_访问崩溃。ImageView在tableview中吗?UILabel也禁用了它。在这方面浪费了很多时间。非常感谢。该复选框隐藏得很好;)这是一个非常有用的观察!我想这是因为调用此方法时,
self
还不存在,所以手势识别器没有目标。谢谢!是的,我们应该使用
lazy var
而不是
let
,以确保点击时
self
确实存在。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
    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")
    }