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")
}