layer实现点击

本文介绍了iOS中UIView与CALayer的区别,包括响应事件的能力、内容管理和动画效果。同时,详细解析了事件响应的流程,如hitTest和pointInside方法在触摸事件处理中的作用,以及如何通过重写这些方法来扩大或缩小UI元素的点击区域。此外,还探讨了视图不响应事件的常见原因。
摘要由CSDN通过智能技术生成

区别:
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

好像有超纲了😮‍💨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值