区别:
1 UIView继承自UIResponder类; CALayer直接继承 NSObject,这决定着layer不能响应事件;
2 View和CALayer的Frame映射及View如何创建CALayer.
一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性。
3 .UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。
4 在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会。
layer相当于图层,UIView相当于合成的图片; UIView至少有一个layer ,UIView管理layer并响应事件;
layer可以点击吗? layer不可响应事件 但是可以通过其他方法对layer的区域添加事件响应;
举个🌰:
convertPoint和hitTest:
-(void)test3{
self.layer1= [[CALayer alloc]init];
self.layer1.frame = CGRectMake(100, 300, 100, 100);
self.layer1.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.layer1];
self.layer2 = [[CALayer alloc]init];
self.layer2.frame = CGRectMake(250, 300, 100, 100);
self.layer2.backgroundColor = [UIColor greenColor].CGColor;
[self.view.layer addSublayer:self.layer2];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
CGPoint point = [[touches anyObject] locationInView:self.view];
CGPoint layer1Point = [self.layer1 convertPoint:point fromLayer:self.view.layer];
if ([self.layer1 containsPoint:layer1Point]) {
NSLog(@"----====layer的convertPoint 点击方式===-----" );
}
CALayer *layer = [self.view.layer hitTest:point];
if (layer == self.layer2) {
NSLog(@"----====layer的hitTest 点击方式===-----" );
}
}
通过对layer添加点击事件,了解一下:pointInside: 和 hitTest:
-
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
-
(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
-
iOS事件响应需要进行上面两个方法判断:
1 hitTest 在视图的层次结构中寻找一个最适合的 view 来响应触摸事件。
该方法会被系统调用,调用的时候,如果返回为nil,即事件有可能被丢弃,否则返回最合适的view 来响应事件;
2 触摸的point是否在view的frame范围内(例子:超出父视图无法点击就是通过pointInside:判断的,通过扩大point 可以实现扩大热区)
扩大缩小button的热区: 通过重写- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
以改变按钮的有效点击区域;
//事件响应离不开上面的两个方法:
hitTest 的调用顺序 touch -> UIApplication -> UIWindow -> UIViewController.view -> subViews -> …-> 合适的view
事件传递顺序与hitTest 的调用顺序: view -> superView …- > UIViewController.view -> UIViewController -> UIWindow -> UIApplication -> 事件丢弃
常见的视图不响应事件不外乎如下几种情况
1、view.userInteractionEnabled = NO;
2、view.hidden = YES;
3、view.alpha < 0.05
4、view 超出 superview 的 bounds
好像有超纲了😮💨