Core Animation(一)之常用属性

UILayer:概念上和UIView类似,最大区别是不能够响应事件。每个UIView都有一个关联的UILayer。屏幕上显示的绘图、动画、布局灯,实际上是在UILayer上,UIView实际上是对UILayer操作的封装,还有提供iOS类似处理触摸的功能。

UIView没有暴露出来的UILayer的功能
• 阴影,圆角,带颜色的边框
• 3D变换
• 非矩形范围
• 透明遮罩
• 多级非线性动画

寄宿图,对CALayer的content属性赋值一张图片
CALayer常用属性:
contentsGravity:类似ContentMode,设置内容在图层的边界如何对齐
contentsScale:类似ContentScaleFactor,不过很少用到,主要是用在设置retain里
masksToBounds:类似clipsToBounds,
contentsRect:显示部分内容
contentsCenter:全面拉伸定义的范围,只有在contentsGravity发生改变,即发生伸缩时有效果。

除了对content属性赋值一张照片之外,还可以使用Core Graphics给寄宿图绘制一张图片
调用drawRect( )

UIView和CALayer的布局
1.补充:frame:根据bounds,position和transform来计算的,所以frame并不是固定的,如图3.2所示

2.补充:锚点anchorPoint:anchorPoint并没有在UIView里面暴露出来,anchorPoint决定了position得位置,如图3.3所示

坐标轴:
UIView描绘的是二维坐标世界,而CALayer描绘的是三维坐标,与UIView相比除了多了anchorPoint和position属性之外,还多了zPosition和anchorPointZ属性。现在我们来讲一下zPosition属性:
zPosition属性通常是用来定义图层显示的顺序。
由于CALayer并不关心响应链,因此也不能辨别响应事件和手势事件。不过CALayer提供两个方法来帮我们处理事件containsPoint和hitTest
containsPoint 接受一个在本图层坐标系下的 CGPoint ,如果这个点在图层 frame 范围内就返回 YES
因此我们往往需要把touchPoint的坐标系转化成需要判断的图层的坐标系,CALayer提供了一个 convertPoint:fromLayer/toLayer:的方法来帮助我们在图层之间转化坐标系。
hitTest:接收CGPoint参数后判断该point位于哪个图层并且返回该图层
因此我们只需要判断hitTest返回的图层是否是我们需要判断的图层即可。

CALayer常用的属性:
conrnerRadius:设置圆角
borderWidth、borderColor:设置边框宽度,边框颜色
shadowOpacity:设置阴影,常与shadowColor(颜色)、shadowRadius(半径)、shadowOffest(偏移值)一起使用。
设置阴影偏移值shadowOffest时,偏移的方向默认是按照x轴y轴的正方向(如果数值为正数)。跟Mac OS的y轴方向相反。
ps. 大一些的阴影位移和角半径会增加图层的深度即视感
补充:
shadowPath:设置阴影路径,除了常规的利用shadowOffest之外,我们还可以设置shadowPath指定任意阴影形状。
- (IBAction)shadowPath:(id)sender {
UIImage *image = [UIImage imageNamed:@”005”] ;
self.puper.layer.contents = (__bridge id)image.CGImage ;
self.puper.layer.contentsGravity = kCAGravityCenter ;
self.puper.layer.contentsScale = 2 ;
self.puper.layer.shadowColor = [UIColor grayColor].CGColor ;
self.puper.layer.shadowOpacity = 0.8 ;
CGMutablePathRef path = CGPathCreateMutable() ;
CGPathAddRect(path, nil, self.puper.bounds) ;
self.puper.layer.shadowPath = path;
}
运行效果:(如果想要更加复杂的效果,可以使用UIBezierPath设置path)

图层蒙板
通过 masksToBounds 属性,我们可以沿边界裁剪图形;通过 cornerRadius 属性,我们还可以设定一个圆角。
CALayer有一个属性mask,该属性返回一个CALayer对象。
mask属性重新为CALayer设置了一个轮廓,例如:

/**
* 图层模板
*/
- (IBAction)imageMask:(id)sender {
CALayer *maskLayer = [CALayer layer] ;
UIImage *maskImage = [UIImage imageNamed:@”004”] ;
maskLayer.contents = (__bridge id)(maskImage.CGImage) ;
maskLayer.frame = self.maskImage.bounds ;

self.imageView1.layer.mask = maskLayer ;
self.imageView1.layer.contentsGravity = kCAGravityCenter ;

}

拉伸过滤
为什么要是使用拉伸过滤,当我们不需要原图的大小,想要显示自定义大小的时候,使用了拉伸过滤(通过原图的像素重新计算自定义图片的像素)算法可以显示最好的画质,使用更好的内存,体现更好地性能。
CALayer使用拉伸过滤算法主要涉及两个属性。minificationFilter和magnification

• kCAFilterLinear:双线性滤波算法,通过对多个像素取样最终生成新值
• kCAFilterTrilinear:三线性滤波算法,存储各种大小的图片,最后取得新值。
• kCAFilterNearest:最近过滤算法,速度快,取最近像素点,不管其他颜色,图片放大容易块状或者马赛克。

view.layer.magnificationFilter = kCAFilterNearest; // 当图片变大的时候
view.layer.minificationFilter = kCAFilterNearest; // 当图片变小的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值