我在监视触摸事件的 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
有很多原因,即在文本视图上观看着陆的困难/不可能。但这很有趣,谢谢。当您在NSLinkAttributeName
s 之外点击时,它会按应有的方式将其传递给按钮吗?
是的,它确实将点击传递给按钮。您究竟想通过跟踪触摸事件来实现什么?长按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 的按钮处理按钮触摸事件的最佳实践