将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell

Posted

技术标签:

【中文标题】将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell【英文标题】:Passing a UITapGestureRecognizer touch onto an underlying UITableViewCell 【发布时间】:2014-01-24 21:53:58 【问题描述】:

我有一个包含 UITextView 的 UITableViewCell。我希望 UITextView 中的某些字符可以点击 - 我正在使用 TextKit 来实现。我在我的 UITextView 上设置了一个 UITapGestureRecognizer,但我正在使用它来确定我的文本容器中的哪些字形已被选中。

我遇到的问题是,如果点击了不相关的字形,我想将点击传递到底层 UITableViewCell 上。实现这一目标的最佳方法是什么?

NSLayoutManager *layoutManager = textView.layoutManager;
CGPoint location = [recognizer locationInView:textView];
location.x -= textView.textContainerInset.left;
location.y -= textView.textContainerInset.top;

NSUInteger characterIndex;
characterIndex = [layoutManager characterIndexForPoint:location
                                       inTextContainer:textView.textContainer
              fractionOfDistanceBetweenInsertionPoints:NULL];

if (characterIndex < textView.textStorage.length)

    NSRange range;
    id value = [textView.attributedText attribute:@"applicableCharacters" atIndex:characterIndex effectiveRange:&range];
    if(value)
    
         // Handle this tap, don't pass to the UITableViewCell
    
    else
    
        // Don't handle this tap, let the UITableView call tableView:didSelectRowAtIndexPath:
    

【问题讨论】:

如何为您的子类单元格提供一个包含其 indexPath 的公共属性。然后在单元格上有一个委托协议,当数据源接收到委托调用时,它可以简单地执行[self didSelectRowAtIndexPath:receivedCell.indexPath 【参考方案1】:

根据我自己的评论,但没有必要跳过委托部分。

单元子类的公共属性:

@property (nonatomic, strong) NSIndexPath *indexPath;

在为 indexPath 返回单元格时从数据源中设置此项...

在你的 else 中:

UITableView *tableView = (UITableView *) self.superview;
[tableView.delegate didSelectRowAtIndexPath:self.indexPath];

【讨论】:

以上是关于将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

将 NSDictionary 作为参数传递给 UITapGestureRecognizer

将 UITapGestureRecognizer 添加到 UIControl

将 UITapGestureRecognizer 连接到 UIView

将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell

将 UITapGestureRecognizer 添加到 XIB

将 UITapGestureRecognizer 添加到 UILabel 的特定部分的最佳方法是啥?