ibireme / YYText

Powerful text framework for iOS to display and edit rich text.
MIT License
8.86k stars 1.7k forks source link

点击事件不被触发 #286

Closed wfkbyni closed 8 years ago

wfkbyni commented 8 years ago

// 1. 创建一个属性文本 NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Some Text, blabla..."];

        // 2. 为文本设置属性
        text.yy_font = [UIFont boldSystemFontOfSize:30];
        text.yy_color = [UIColor blueColor];
        [text yy_setColor:[UIColor redColor] range:NSMakeRange(0, 4)];
        text.yy_lineSpacing = 10;

        // 3. 赋值到 YYLabel 或 YYTextView
        YYLabel *label = [YYLabel new];
        label.frame = CGRectMake(20, 2, self.moreView.frame.size.width - 40, 36);
        label.attributedText = text;
        [self.moreView addSubview:label];

        [text yy_setTextHighlightRange:NSMakeRange(0, text.length) color:[UIColor redColor] backgroundColor:[UIColor greenColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {

        }];

text的tapAction不会被触发!!!!

ibireme commented 8 years ago

为什么要加这么多叹号。。。。

可以检查下 Label 或 TextView 的触摸事件是否被禁用了、是否有其它手势(尤其是 TapGesture)阻碍了触摸流程。

yishuiliunian commented 8 years ago

在UIScrollView中使用YYLabel,触摸事件很容易走到

而非预期的- (void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event 去触发tapAction,为何这样?

ibireme commented 8 years ago

注意 UIScrollView 的 delaysContentTouches 和 canCancelContentTouches 这两个属性。

yishuiliunian commented 8 years ago

这两个属性,调整之后,对上述问题,没有影响。

ibireme commented 8 years ago

YYLabel 是继承自 UIView,然后重写了 UIResponder 的 touchesBegan touchesMoved touchesEndedtouchesCancelled 这四个方法来监听触摸事件的。这里没有做其他多余的处理,所以可以很容易验证触摸事件响应顺序。

UIScrollView 自带一个 PanGesture,而这个 Gesture 会优先拦截触摸事件,并在识别到 Pan 动作时取消掉其他触摸流程,这时 YYLabel 就会走到 touchesCancelled 去了。如果设置一下 UIScrollView 的属性,delaysContentTouches = YES, canCancelContentTouches = NO 这样就不会进入touchesCancelled 了,但这会产生一些副作用(手指落到 Label 后不动,0.5 秒后再滑动就没效果了)。

如果你测试这两个属性不起作用,看看整个视图层级中是否还有其他 Gesture 或触摸拦截操作(比如 TableView/Cell 由苹果内嵌的一些自定义 Gesture 也会有影响)。