在其超级视图中有一个UITapGestureRecognizer时,点击URL在TTTAttributedLabel中不起作用

pan*_*f07 16 objective-c ios uitapgesturerecognizer tttattributedlabel

有容器视图和UITapGestureRecognizer上面.它还有一个子视图TTTAttributedLabel.

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

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called.
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Nit*_*hel 15

用它gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch来检测你的事件.

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
      if ([touch.view isKindOfClass:[TTTAttributedLabel class]])
      {
           return FALSE;
      }
      else
      {

         return TRUE;
      }
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用 if ([touch.view isKindOfClass:[UIControl class]])所有UIControl,例如按钮甚至检测UIGestureRecognizer.希望这对你有帮助


Vin*_*det 7

我尝试了@Nitin的解决方案,但它有一个问题,因为@ n00bProgrammer指出.此外,用户体验变得非常糟糕.我不得不点击几次来激活在SuperView上添加的tapGesture.

在这里,您有更好的解决方案.TTTAttributedLabel有一个有用的实例方法,如下所示.

- (BOOL)containslinkAtPoint:(CGPoint)point
Run Code Online (Sandbox Code Playgroud)

这将返回是否在给定点找到NSTextCheckingResult.

因此,请使用以下代码段,然后只链接已添加的部分文本将作为可连接的链接工作,其余区域将根据需要激活您的tapGesture.用户体验也很出色.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([yourTTTAttributedLabel containslinkAtPoint:[touch locationInView:yourTTTAttributedLabel]])
        return FALSE;
    else
        return TRUE;    
}
Run Code Online (Sandbox Code Playgroud)