我在监视触摸事件的 UITableViewCell 中有一个 UILabel,如何将一些事件传递给单元格,将其他事件传递给标签?

Posted

技术标签:

【中文标题】我在监视触摸事件的 UITableViewCell 中有一个 UILabel,如何将一些事件传递给单元格,将其他事件传递给标签?【英文标题】:I have a UILabel in a UITableViewCell that monitors touch events, how do I pass some events to the cell and others to the label? 【发布时间】:2014-12-19 18:19:44 【问题描述】:

我有一个 UILabel 子类,它监视其 touchesBegan 事件以允许选择标签内的链接(点击标签中的链接会在 web 视图中打开它)。

现在它也将触摸事件传递给UITableViewCell,导致它被选中,这并不理想。

但是,在他们不点击链接的情况下,我确实希望将其传递给单元格,以便他们可以选择单元格以转换到下一个视图控制器。这就像 Tweetbot 或 Twitterrific 等中的行为。

那么我将如何几乎“选择性地”传递触摸事件?在我的脑海中,这几乎是“如果您点击链接,请不要将触摸传递给单元格,但如果您不点击链接,则此行为很好”。

【问题讨论】:

如果您的标签正在处理触摸,则不应将此触摸传递给单元格。当我尝试这个时,我没有看到它通过。如果用户触摸标签而不是链接的单词,您是否希望传递触摸?你是如何实现链接的? @rdelmar 我正在使用 TextKit 进行标签渲染,因此我可以使用它来查找我点击的字符,然后检查该字符的属性,它被定义为链接。打开userInteractionEnabled 以获取标签上的触摸处理。进一步阅读,这不是pointInside:withEvent 的用途吗? 或者hitResult? 我确实让它与 textView 一起工作,尽管我不确定这是最好的方法。在 textview 的 touchesBegan 覆盖中,我向上搜索子视图以获取单元格和表格视图,以便进行选择。如果您认为这对您有用,我会发布答案。 @rdelmar 向上搜索视图层次结构似乎有点笨拙。特别是考虑到我希望它在表格视图单元格以外的情况下工作。 【参考方案1】:

我记得我在UILabel 中创建可点击链接时遇到了一些问题(尽管场景与你的不同)。我通过使用不可编辑的UITextView 并设置它的attributedText 解决了这个问题。只要记住在需要的地方设置NSLinkAttributeName。我做了一个简单的测试,它没有通过点击链接到它后面的UIButton

【讨论】:

我不能使用UITextView 有很多原因,即在文本视图上观看着陆的困难/不可能。但这很有趣,谢谢。当您在NSLinkAttributeNames 之外点击时,它会按应有的方式将其传递给按钮吗? 是的,它确实将点击传递给按钮。您究竟想通过跟踪触摸事件来实现什么?长按UITextView 中的链接后,它会显示“打开/复制/添加到阅读列表”菜单,也许这足以满足您的需求。 我还发现了这个库,它的作者声称它支持类似 Tweetbot 的行为:github.com/choefele/CCHLinkTextView 有趣,我一定要看看那个。但我确实知道 UILabel 是可能的,因为 OHAttributedLabel 使用它,看似通过 hitTest,但我似乎无法复制它。我对文本视图的主要问题是它们“吃掉”touchesEnded 方法,并且难以使用长按手势识别器。【参考方案2】:

我将使用UITextView 发布此答案,以防您没有更好的工作。这实际上适用于非常少的代码。在 Apple 的文档中,他们说在 super 上调用 touchesBegan 等,而不是在 nextResponder 上调用它,但后者是有效的。文本视图设置为selectable,但不是editable。滚动也被禁用。在表格视图控制器中,我设置了属性文本,并将链接属性用于我想成为链接的任何单词。这是自定义文本视图代码,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    [self.nextResponder touchesBegan:touches withEvent:event];



-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

    [self.nextResponder touchesEnded:touches withEvent:event];



-(BOOL)canBecomeFirstResponder 
    return NO;

canBecomeFirstResponder 设置为NO,将禁用所有文本视图编辑器功能,因此双击、长按或点击半(是的,有一个点击半手势识别器)不会执行任何操作。

在表格视图控制器中,我需要设置文本视图的委托(响应链接点击),所以我这样做,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textView.attributedText = self.theData[indexPath.row];
    cell.textView.delegate = self;
    return cell;
 

【讨论】:

能发一下对应的项目吗?

以上是关于我在监视触摸事件的 UITableViewCell 中有一个 UILabel,如何将一些事件传递给单元格,将其他事件传递给标签?的主要内容,如果未能解决你的问题,请参考以下文章

将 UICollectionView 触摸事件传递给其父 UITableViewCell

如果 UITableViewCell 有多个按钮,那么处理触摸事件的最佳位置在哪里

Objective c - 为自定义 UITableViewCell 的按钮处理按钮触摸事件的最佳实践

在复合 UIView 中的触摸事件上突出显示 UITableViewCell

Swift:禁用对 UITableViewCell 的触摸

将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell