Ios 点击URL不';当其superview上有UITapGestureRecognitor时,无法在TTtatAttributedLabel中工作

Ios 点击URL不';当其superview上有UITapGestureRecognitor时,无法在TTtatAttributedLabel中工作,ios,objective-c,uitapgesturerecognizer,tttattributedlabel,Ios,Objective C,Uitapgesturerecognizer,Tttattributedlabel,有一个容器视图和一个UITapGestureRecognizer。它还有一个子视图,它是一种tttatAttributedLabel 当我从容器视图中删除手势识别器时,tttatAttributedLabelDelegate的委托方法 - (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called. 当我在容器视图上添加手势识别器时。只调用它的action方法

有一个容器视图和一个
UITapGestureRecognizer
。它还有一个子视图,它是一种
tttatAttributedLabel

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

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called.
当我在容器视图上添加手势识别器时。只调用它的action方法。将不会调用
tttatAttributedLabelDelegate
的委托方法

现在,我需要在点击
tttatAttributedLabel
中的链接时调用delegate方法,在点击容器视图的其他区域时调用action方法


谢谢。

使用此
手势识别器:(UIGestureRecognitzer*)手势识别器应接收触摸
以检测您的事件

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

         return TRUE;
      }
}

您也可以使用
如果([touch.view Iskindof class:[UIControl class]])
用于所有UIControl,例如按钮甚至可以使用
uigesturecognizer检测。希望本帮助的您

@Nitin的回答是正确的,前提是如果用户点击标签的一部分(不是链接),您不希望点击手势起作用。如果您的标签上有文本而不仅仅是链接,我建议您执行以下操作:

  • tttatAttributedLabel.h
    文件中创建一个新的委托方法(如“handleSingleTap”),作为
    @可选

  • tttatAttributedLabel.m
    中找到
    touchesedend
    方法。这里有一个
    if(self.activeLink)
    条件

  • 为这种情况创建一个
    else
    案例,如下所示:

    else {
    
        if ([self.delegate respondsToSelector:@selector(handleSingleTap)]) {
    
            [self.delegate handleSingleTap];            
        }
    }
    
  • 在使用标签的类中重写此新委托方法

这样,如果用户点击链接,
if
将处理链接选择。如果用户点击链接以外的文本,
else
将调用类中的方法(这是
点击手势的目标方法)


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

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)
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
如果让触摸=触摸。首先作为?UITouch{
如果touch.view!==self.mytttatAttributedLabel{
//手柄容器视图分接头
}
}
super.touchsbegind(touchs,withEvent:event)
}

您还必须从容器视图中删除手势识别器,并在上面的if子句中处理这些点击。

我尝试了@Nitin的解决方案,但正如@n00bProgrammer所指出的,它有一个问题。此外,用户体验变得非常糟糕。我必须点击几次才能启动添加到superView上的TapPassent

这是一个更好的解决方案。TTtatAttributedLabel有一个有用的实例方法,如下所示

- (BOOL)containslinkAtPoint:(CGPoint)point
这将返回是否在给定点找到NSTextCheckingResult

因此,使用下面的代码片段,那么只有文本中添加的链接部分将用作可点击链接,其余部分将根据需要触发点击手势。用户体验也非常好

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

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

gestureRecognizer.cancelsTouchesInView = NO;
这是我的解决办法

gr是我视图的手势,lblContent(TTTAttributedLabel)是我单击标签时的标签,这两个手势同时工作(标签的手势和视图的手势),所以我用上面的代码解决了这个问题

我以前尝试过的解决方案


我很晚才找到你的答案。不幸的是花了5个小时才找到它。谢谢你,伙计!
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
    }
}
cancelsTouchesInView = false
isUserInteractionEnabled = true