【问题标题】:Tap gesture recognizer interferes with URL taps in UITextView点击手势识别器会干扰 UITextView 中的 URL 点击
【发布时间】:2014-01-29 16:54:20
【问题描述】:

我有一个禁用的文本视图,上面附加了一个轻击手势识别器。问题是这个手势识别器拦截了所有的点击,包括那些在自动检测到的 URL 上的点击(文本视图打开了数据检测器)。有什么方法可以防止它发生,所以当用户点击一个 URL 时,它由文本视图本身处理(在 Safari 中打开),当用户点击其他地方时,我的手势识别器会被调用?

【问题讨论】:

    标签: ios iphone objective-c uitextview


    【解决方案1】:

    最好的方法是如果您可以访问数据检测器使用的手势识别器(然后通过使用委托的gestureRecognizer:shouldRequireFailureOfGestureRecognizer: 等指定您的点击识别器的优先级应该低于那个),但我没有认为这是可能的(如果我错了,任何人都可以在这里纠正我)。

    相反,您可以尝试将委托添加到文本视图并检查是否在手势识别器的活动期间调用了textView:shouldInteractWithURL:inRange:(然后仅在UITextView 未处理时才运行您的处理程序)。

    【讨论】:

    • 我尝试了 shouldInteractWithURL: 但只有在 URL 突出显示时长按后才会调用它。如果用户只是快速点击 URL,则不会调用此方法。也许这是一个“功能”,即如果你想打开一个 URL 点击更长的时间,否则你将开始编辑。我实际上开始喜欢这种行为。当您想要编辑长 URL 而不是打开它时,它可能很有用。无论如何谢谢:)
    【解决方案2】:

    有点hacky,但它有效:

    if let recognizers = yourTextView.gestureRecognizers {
        for recognizer in recognizers {
            if recognizer.name == "UITextInteractionNameLinkTap" {
                myCustomTapGestureRecognizer.require(toFail: recognizer)
            }
        }
    }
    

    检测链接的识别器名称为“UITextInteractionNameLinkTap”

    【讨论】:

    • 在我看来一点也不 hacky!辛苦了,谢谢
    【解决方案3】:

    请确保您的文本视图不是其他视图的子视图。 如果是子视图,那么为顶视图添加UITextViewDelegate,然后在viewDidLoad中添加这个:

     - (void)viewDidLoad
    {
        [super viewDidLoad];
        yourTextview.delegate = self;
        yourTextview.editable = NO;
        yourTextview.selectable = YES;
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      相关资源
      最近更新 更多