点击URL在TTTAttributedLabel中不起作用,而其superview上有UITapGestureRecognizer

时间:2014-03-12 07:42:15

标签: ios objective-c uitapgesturerecognizer tttattributedlabel

有容器视图和UITapGestureRecognizer。它还有一个TTTAttributedLabel

的子视图

当我从容器视图中删除手势识别器时,TTTAttributedLabelDelegate

的委托方法
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called.

当我在容器视图上添加手势识别器时。只调用其action方法。 TTTAttributedLabelDelegate的委托方法不会被调用。

现在我需要在点击TTTAttributedLabel中的链接时调用委托方法,并在点击容器视图的其他区域时调用action方法。

感谢。

6 个答案:

答案 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