问题一:
在我的工程中,label只是设置了userInteractionEnabled为yes,但没有添加tap点击手势。但是在把label添加到cell上时,点击label却不响应cell:
之前我以为把cell上的label设置userInteractionEnabled为yes时,就算不添加tap点击手势,当点击label时都不会响应父视图cell,因为在我的工程中一直都是这样。
但是最近看了另一个demo中label的userInteractionEnabled就算设置为yes,但是只要不添加tap手势,你点击lable时,还是会响应cell。
这让我百思不得其解,我不知道哪个是正常的,然后我又自己写了个demo,发现,果然label的userInteractionEnabled就算设置为yes,但是只要不添加tap手势,你点击lable时,点击动作还是会作用到label 的父视图上的,因为点击的传递是:当子视图不能响应点击事件时,就会传递给父视图响应。然后我给lable上加了longPress手势,然后再单击label,这时新写的demo中的label还是不会响应单击,而是会作用在父视图上。但是当长按时,lable会响应longPress手势,这是因为在label上添加了longPress手势。
所以综上所述,就是我的工程中的label有问题,所以才会导致只设置了userInteractionEnabled为yes,但没添加tap点击手势时也不会把点击手势传递给父视图。这个问题困扰了我好几天,最后研究发现,是因为我工程中有个lable的类别类,这个类别类中有个关键代码是这么写得:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if (!self.isTapAction) {
return;
}
}
上面的代码有问题,那就是,只要label的userInteractionEnabled为yes,那么touch这个动作就不会被传递到父视图上去,因为没有调用[super touchesBegan:touches withEvent:event];
改成:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if (!self.isTapAction) {
[super touchesBegan:touches withEvent:event];
}
}
就好了。
问题二:
当父视图是xib创建的时,引用的子视图也会走awakeFromNib方法,而不不会走initWithFrame方法
事情是这样的:视图中的cell是xib创建的,cell中的label也是xib拖的,为了给lable添加长按手势,我把cell中的label引用从UILabel换成了我自己封装的AKMLinkLabel,但是我发现,AKMLinkLabel不走init方法。后来才发现,当我把cell中的lable引用从UIlabel换为AKMLinkLabel时,其实AKMLinkLabel就是xib创建的了,所以他不会走init方法,而是会走awakeFromNib方法。
image image image
网友评论