有容器视图和UITapGestureRecognizer
。它还有一个TTTAttributedLabel
。
当我从容器视图中删除手势识别器时,TTTAttributedLabelDelegate
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called.
当我在容器视图上添加手势识别器时。只调用其action方法。 TTTAttributedLabelDelegate
的委托方法不会被调用。
现在我需要在点击TTTAttributedLabel
中的链接时调用委托方法,并在点击容器视图的其他区域时调用action方法。
感谢。
答案 0 :(得分:15)
使用此gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch
来检测您的活动。
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isKindOfClass:[TTTAttributedLabel class]])
{
return FALSE;
}
else
{
return TRUE;
}
}
您也可以使用if ([touch.view isKindOfClass:[UIControl class]])
进行所有UIControl,例如Button甚至可以使用UIGestureRecognizer
进行检测。希望这有助于你
答案 1 :(得分:7)
我尝试了@Nitin的解决方案,但它有一个问题,因为@ n00bProgrammer指出。此外,用户体验变得非常糟糕。我不得不点击几次来激活在SuperView上添加的tapGesture。
这里有更好的解决方案。 TTTAttributedLabel有一个有用的实例方法,如下所示。
- (BOOL)containslinkAtPoint:(CGPoint)point
返回是否在给定点找到NSTextCheckingResult。
因此,请使用以下代码段,然后只链接已添加的部分文本将作为可连接的链接工作,其余区域将根据需要激活您的tapGesture。用户体验也很出色。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([yourTTTAttributedLabel containslinkAtPoint:[touch locationInView:yourTTTAttributedLabel]])
return FALSE;
else
return TRUE;
}
答案 2 :(得分:2)
将手势识别器的cancelsTouchesInView
属性设置为NO。
gestureRecognizer.cancelsTouchesInView = NO;
答案 3 :(得分:1)
@Nitin的答案有点正确,前提是如果用户点击标签的一部分(不是链接),则不希望点击手势有效。如果您的标签上的文字不仅仅是链接,我建议您执行以下操作:
在TTTAttributedLabel.h
文件中创建一个新的委托方法(如“handleSingleTap”)@optional
。
在TTTAttributedLabel.m
中找到touchesEnded
方法。这里有一个if (self.activeLink)
条件。
为此条件创建else
案例,如下所示:
else {
if ([self.delegate respondsToSelector:@selector(handleSingleTap)]) {
[self.delegate handleSingleTap];
}
}
在您使用标签的班级中覆盖此新的委托方法。
这样,如果用户点击链接,if
负责处理链接选择。如果用户点击了链接以外的文字,else
会调用您班级中的方法(这是tapGesture
的目标方法)。
另外,从您的视图中移除tapGesture
,或使用@Nitin的代码来处理标签上的点按,并让标签自行处理点按。
答案 4 :(得分:0)
Nitin的建议对我不起作用(不确定原因),但这样做:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
if touch.view !== self.myTTTAttributedLabel {
// Handle container view tap
}
}
super.touchesBegan(touches, withEvent: event)
}
您还必须从容器视图中移除手势识别器,并在上面的if子句中处理这些点击。
答案 5 :(得分:0)
这是我的解决方法
override func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if touch.view == self.lblContent {
gr?.isEnabled = false
return false
}
else {
gr?.isEnabled = true
return true
}
}
gr 是我的视图手势,而 lblContent(TTTAttributedLabel)是我的标签,当我单击标签时,两个手势同时起作用(标签的手势和视图的手势),所以我有用上面的代码解决了这个问题
在解决方案之前我尝试过什么
cancelsTouchesInView = false
isUserInteractionEnabled = true