繁体   English   中英

如何将 UILabel 上的触摸事件作为 UITableViewCell 的子视图处理?

[英]How to handle touch event on UILabel as subview of UITableViewCell?

我的应用程序有一个自定义UITableView 在其UIViewControllercellForRowAtIndexPath委托方法中,我将包含多个自定义 UILabel(实际上是OHAttributedLabel的子类)的自定义UITableViewCell对象实例化为内容视图的子视图。

我尝试在 label 上设置userInteractionEnabled = YES ,然后在视图 controller 中添加触摸事件,但这不起作用。

想法?

谢谢

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
      UITouch *touch = [[event allTouches] anyObject];
      if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])){
       //do whatever you want
     }
}

或者

UILabel *label = =[UILabel alloc]init];
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]     autorelease];
[label addGestureRecognizer:tapGesture];

OHAttributedLabel 中的问题。 这个 label 还可以处理点击链接。 因此,对于 label(不仅仅是链接)的任何点的手柄点击,您必须

self.textLabel.onlyCatchTouchesOnLinks = NO;

self.textLabel 是您的 OHAttributedLabel。 并且不要忘记 userInteractionEnabled。

UILabel 不是 UIControl,因此您不会在 UIControlEventTouchUpInside 或类似上获得事件。 为什么不使用按钮呢? 您可以让它看起来与 label 完全一样。

无论如何,您可能需要在 cellForRowAtIndexPath: 方法中的 UIButton 上设置 addTarget:action:forControlEvents: 和标签。 在该方法中,通过检查标记值来检测点击了哪个单元格的按钮。

如果您必须使用 UILabel,那么您需要对其进行子类化并拦截 touchesBegan/touchesEnded 方法(从 UIResponder 继承)来检测自己的 UIControlEventTouchUpInside。

我不知道是不是同样的问题,但是......我添加了一个 label 并且无法让它识别触摸,我最终意识到这是因为我将它添加为子视图,但它的框架在它之外父母的框架,因此触摸层次结构破裂

我只是在使用 static 表格单元格作为设置表格时遇到了问题,我希望整个单元格触发单元格文本字段的第一响应者。

在没有使用手势识别器进行任何触摸后,我最终在 label(触摸禁用)和文本字段后面添加了一个透明(自定义、空白标题)按钮。 我认为它应该以更优雅的方式工作,但它解决了现在的任务和有限的目的。 (您可以从按钮的默认操作中拖动连接)

有点丑。 再说一次,它只是描述了文本字段后面对触摸做出反应的区域。 毕竟这是本意。 所以也许它只是没有那么花哨。

将保留它,直到我找到识别器不触发的原因。

您可以使用TTTAttributedLabel来代替它。 这很容易。 当您初始化 UITableViewCell 时,您可以委托:TTTAttributedLabelDelegate,例如:

@interface MyTableViewCell : UITableViewCell<TTTAttributedLabelDelegate>{
    UILabel *nameLabel;
    TTTAttributedLabel *valueLabel;
}

初始时,您可以添加指向 label 的链接:

 [valueLabel addLinkToPhoneNumber:valueStr withRange:NSMakeRange(0, valueStr.length)];

所以,你可以做任何你想做的事:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithPhoneNumber:(NSString *)phoneNumber{
   //do anything you want.

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM