视图:cell交互性
一、当一个控件不能接收时间时一般有以下几种情况
- 1.不接收用户交互
userInteractionEnabled = NO - 2.当一个控件隐藏时
Hidden = YES - 3.当一个控件为透明白时
注意:UIImageView,以及它的子控件默认是不能接收触摸事件的
二、事件的响应
用户点击屏幕产生的一个触摸事件,经过一系列的传递过程后,会找到一个最适合的视图来处理事件.找到最合适的视图控件后,就会调用控件的touches方法来作具体的时间处理.touches的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者处理。
三、系统是如何寻找最合适的View
- 1.先判断自己是否能接收触摸事件
- 2.再判断触摸的当前点在不在自己身上
- 3.如果在自己身上,它会从后往前遍历子控件,遍历出每一个控件后,重启前两步
- 4.如果没有符合条件的子控件,那么自身就是最合适的View
在寻找最合适View的过程中,系统会调用一以下2个方法:
//作用:寻找最适合的View
//什么时候调用:当事件传递给当前View时就会调用这个方法
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *fitView = [super hitTest:point withEvent:event];
NSLog(@"%@",fitView);
return fitView;
}
//作用:判断触摸点在不在当前的View上.
//什么时候调用:在hitTest方法当中会自动调用这个方法.
//注意:point必须得要跟当前View同一个坐标系.
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return YES;
}
四、举个例子
如上图cell交互性图片所示,当点击cell展开的时候关闭交互性,cell关闭的时候开启交互性。
if (spokenList.isExpand) {
self.playProgress.hidden = NO;
self.userInteractionEnabled = NO;
}else{
self.playProgress.hidden = YES;
self.userInteractionEnabled = YES;
}
当想要点击cell上的3个按钮响应时间的话,代码如下:
//父视图不可交互 父视图上的子视图可交互
//作用:寻找最适合的View
//什么时候调用:当事件传递给当前View时就会调用这个方法
//当触摸点在按钮上的时候,才让按钮去响应事件.
//把当前点转换成按钮坐标系上的点.
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
CGPoint btnA = [self convertPoint:point toView:self.singlePrimaryPlay];
CGPoint btnB = [self convertPoint:point toView:self.singleRecording];
CGPoint btnC = [self convertPoint:point toView:self.singlePlayBack];
if ( [self.singlePrimaryPlay pointInside:btnA withEvent:event]) {
return self.singlePrimaryPlay;
}else if ([self.singleRecording pointInside:btnB withEvent:event]){
return self.singleRecording;
}else if ([self.singlePlayBack pointInside:btnC withEvent:event]){
return self.singlePlayBack;
}else{
return [super hitTest:point withEvent:event];
}
}