【问题标题】:Tapping URL doesn't work in TTTAttributedLabel while there is a UITapGestureRecognizer on its superview在 TTTAttributedLabel 的超级视图上有 UITapGestureRecognizer 时,点击 URL 不起作用
【发布时间】:2014-04-16 04:48:39
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: ios objective-c uitapgesturerecognizer tttattributedlabel


    【解决方案1】:

    使用此gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch 检测您的事件。

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

    您还可以对所有 UIControl 使用 if ([touch.view isKindOfClass:[UIControl class]]),例如 Button,甚至使用 UIGestureRecognizer 进行检测。希望对你有帮助

    【讨论】:

      【解决方案2】:

      @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 的代码不处理标签上的点击,让标签自己处理点击。

      【讨论】:

        【解决方案3】:

        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 子句中处理这些点击。

        【讨论】:

          【解决方案4】:

          我尝试了@Nitin 的解决方案,但正如@n00bProgrammer 指出的那样存在问题。此外,用户体验变得非常糟糕。我必须点击几次才能触发添加到 superView 上的 tapGesture。

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

          - (BOOL)containslinkAtPoint:(CGPoint)point
          

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

          因此,使用下面的代码 sn-p 然后只有链接添加的部分文本将用作可点击链接,其余区域将根据需要触发您的 tapGesture。用户体验也很好。

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

          【讨论】:

            【解决方案5】:

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

            gestureRecognizer.cancelsTouchesInView = NO;
            

            【讨论】:

            • 很晚才找到答案。不幸的是花了5个小时才找到它。谢谢大佬!
            【解决方案6】:

            这是我的解决方案

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-04
              • 2013-07-17
              • 1970-01-01
              • 2011-06-06
              相关资源
              最近更新 更多