19

有容器视图和一个UITapGestureRecognizer就可以了。而且它还有一个子视图是哪一种TTTAttributedLabel

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

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called.

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

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

谢谢。

4

6 回答 6

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. 希望这对你有帮助

于 2014-03-12T07:50:15.403 回答
8

我尝试了@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;    
}
于 2016-01-12T21:58:44.517 回答
3

cancelsTouchesInView手势识别器的属性设置为 NO。

gestureRecognizer.cancelsTouchesInView = NO;
于 2016-08-09T10:25:11.123 回答
1

@Nitin 的回答在某种程度上是正确的,前提是如果用户点击您的标签的一部分(不是链接),您不希望点击手势起作用。如果您的标签包含除链接以外的文本,我建议您执行以下操作:

  • 在文件中创建一个新的委托方法(如“handleSingleTap”)TTTAttributedLabel.h@optional.

  • TTTAttributedLabel.m寻找touchesEnded方法。在这里你有一个if (self.activeLink)条件。

  • 为此条件创建一个else案例,如下所示:

    else {
    
        if ([self.delegate respondsToSelector:@selector(handleSingleTap)]) {
    
            [self.delegate handleSingleTap];            
        }
    }
    
  • 在您使用标签的类中覆盖这个新的委托方法。

这样,如果用户点击链接,则if负责处理链接选择。如果用户点击链接以外的文本,else则会调用您的类中的方法(这是您的目标方法tapGesture)。

此外,tapGesture从您的视图中删除,或使用@Nitin 的代码不处理标签上的点击,并让标签自己处理点击。

于 2014-03-12T08:19:57.567 回答
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 子句中处理这些点击。

于 2015-05-08T11:23:05.830 回答
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
于 2020-02-03T14:39:26.667 回答