iOS-CALayer (二)

上一篇 : iOS-CALayer (一)

前言:上一篇主要记录有关 CALayer 的基础相关知识,本章主要描述图层布局、视觉效果。

一、图层

1.1 布局-frame

UIView 布局属性:frame、bounds、center
CALayer 布局属性:frame、bounds、position、anchorPoint


iOS-CALayer (二)_第1张图片
坐标系

UIView的 frame 是虚拟属性,实际是根据 CALayer 的 bounds、position、transform 控制的。


iOS-CALayer (二)_第2张图片
旋转之后的 frame
1.2 锚点-anchorPoint

UIView 的 Center 属性和 CALayer 的 position 属性都指定 anchorPoint 相对父图层的位置。anchorPoint 和 position 控制 frame 的属性。anchorPoint 用于描述图层相坐标。


iOS-CALayer (二)_第3张图片
改变效果对比图
1.3 坐标系

图层的 position 依赖父图层的 bounds ,如果父图层发生移动,所有子图层也发生移动。


iOS-CALayer (二)_第4张图片
工具类方法
1.4 几何结构

UIView 是标准的二维坐标系,CLAyer 存在三维空间中。zPosition 和 anchorPointZ 描述图层位置的浮点类型。


iOS-CALayer (二)_第5张图片
x\y\z 轴
iOS-CALayer (二)_第6张图片
未设置前

使用xx.layer.zPosition = 1.0;属性可设置 Z轴属性。

iOS-CALayer (二)_第7张图片
设置后
1.5 Hit Testing

CALayer 不能响应任何响应链事件,不能直接处理触摸/手势。但提供方法处理事件:-containsPoint 和 hitTest。

  • containsPoint:传入图层坐标 CGPoint ,如果这点在图层 frame 呢 就返回 YES。可以用于判断被点击的图层。
  • hitTest:传入图层坐标 CGPoint ,返回图层本身,或者包含这个坐标点的叶子节点图层。如果在图层以外会返回 nil 。


    iOS-CALayer (二)_第8张图片
    判断被点击图层

zPosition 可以改变屏幕上图层的顺序,但不能改变事件传递的顺序。

1.6 自动布局

当使用视图时候,可利用 UIView 的类接口 UIViewAutoresizingMask 和 NSLayoutConstraint。
控制 CALayer 布局,简单方法使用 CALayerDelegate。例如:-(void)layoutSublayerOfLayer:(CALayer *)layer;,当图层的 bounds 发成改变,或者图层的 setNeedsLayout 方法被调用,layoutSublayerOfLayer就会被执行。可以手动重新调整图层位置或大小,但是不能自适应屏幕。

二、视觉效果

2.1 圆角

CALayer 属性 conrnerRadius 控制图层角的曲率。

高性能的给 UIImageView 加个圆角

2.2 边框

borderWidth 和 borderColor 定义图层的绘制样式。边框是绘制在图层里面的,在所有子内容之前。

  • borderColor 是 CGColorRef 类型 不是 UIColor,因为他不是 Cocoa 内置对象。边框是 Layer 的边界变化,不是 Layer 图层内容变化。要想控制内容变化就要使用 maskToBounds 属性。
iOS-CALayer (二)_第9张图片
无边框

iOS-CALayer (二)_第10张图片
添加边框
2.3 阴影

CALayer 属性 shadowOpacity 控制阴影。 取值在0-1之间的浮点数。shadowColor、shadowOffset、shadowRadius 控制阴影参数。

2.4 shadowPath

图层阴影不总是方的,是从图层内容形状集成而来的,实时计算阴影非常消耗资源,尤其有多个子图层。可以通过指定 shadowPath 来提高性能。

  • shadowPath 是 CGPathRef 类型。CGPath 是 Core Graphics 对象,用来指定任意矢量图形,可以指定单独于图层形状之外阴影形状。
- (void)createShadow{
    
    _clockView.layer.shadowOpacity = 0.5;
    //正方形
    CGMutablePathRef squarePath = CGPathCreateMutable();
    CGPathAddRect(squarePath, NULL, _clockView.bounds);
    _clockView.layer.shadowPath = squarePath;
    CGPathRelease(squarePath);
    //圆形
    CGMutablePathRef circlePath = CGPathCreateMutable();
    CGPathAddEllipseInRect(circlePath, NULL, _clockView.bounds);
    _clockView.layer.shadowPath = circlePath;
    CGPathRelease(circlePath);
}

如果是复杂的图形使用 UIBezierPath 更合适。

2.5 图层蒙版

CALayer 属性 mask 控制蒙版,是 CALayer 属性,类似于一个子图层。如果 mask 比父图层要小,只有 mask 内部才会被显示,此外都会被隐藏。


iOS-CALayer (二)_第11张图片
Image+Mask

iOS-CALayer (二)_第12张图片
mask 代码
2.6 拉伸过滤

View 显示原始图片(比例 1:1)原因:

  • 显示好的画质,像素没有压缩和拉伸
  • 更好内存存储
  • 最好性能表现,CPU 不需要额外计算
    view.layer.magnificationFilter = kCAFilterNearest;

CALayer 提供拉伸过滤方法:

  • kCAFilterLinear
  • kCAFilterNearest
  • kCAFilterTrilinear

① kCAFilterLinear
kCAFilterLinear采用双线性滤波算法,比如 minification(缩小图片) 和 magnification(放大图片)。双线性滤波算法通过对多个像素取样生成新的值,得到平滑不错的拉伸,但放大倍数比较大的图片就模糊了。

② kCAFilterTrilinear
kCAFilterTrilinear 与 kCAFilterLinear 相似,但采用三线性滤波算法,三线性滤波算法存储多个大小情况下的图片(多重贴图),并三维取样,同事结合大图和小图的存储进而得到最后的结果。从一系列接近最终大小的图片中得到想要的结果,不会对很多像素同步取样,提高性能也避免小概率因舍入错误引起的取样失灵问题。

③ kCAFilterNearest
kCAFilterNearest是一种比较武断的办法。最近过滤,取样最近的单像素点二不管其他颜色。速度快,也不会是图片模糊。明显效果是会更糟压缩图片,图片方法之后显的块状或者马赛克严重。

iOS-CALayer (二)_第13张图片
大图,双线性滤波和三线性滤波更佳

iOS-CALayer (二)_第14张图片
小图,最近过滤更佳
2.7 组透明

UIView 的 alpha 属性确定视图的透明度。
CALayer 的 opacity 来控制视图的透明度。
两个属性都是影响子层级的。

如果想设置图层透明度,希望包含整个图层树像整体一样的透明效果。
不建议采纳的方法:
Info.plist 设置UIViewGroupOpacity = YES,但是会影响整个应用。
建议方法:
设置 CALayer 的 shouldRasterize 属性来实现组效果,设置为 YES,在应用透明度之前,图层及其子图层都会被整个一个整体的图片。就不会有透明度混合的问题了。

下一篇:iOS-CALayer (三)

你可能感兴趣的:(iOS-CALayer (二))