UIView三个重要的布局属性:frame,bounds,center
CAlayer与之对应的属性:frame,bounds,position
- frame代表图层的外部坐标(相对于自己的父图层)
- bounds是内部坐标({0,0}通常是图层的左上角)
- center和position都代表了相对于父图层anchorPoint所在的位置
视图的frame,bounds和center属性仅仅是存取方法,当操作视图的frame,实际上是改变位于视图下方CALayer的frame,不能够独立于图层之外改变视图的frame
视图或者图层的frame是根据bounds,position和transform计算而来
旋转之后的视图和图层的frame
锚点(anchorPoint)
anchorPoint是CGPoint的属性,是图层的相对坐标默认坐标是(0.5,0.5)
改变anchorPoint的效果
坐标系
使用过UIView的相对坐标变换的方法,你就很容易理解与其对应的CALayer在不同图层的坐标系中相互转换的方法,这些方法可以把定义在一个图层坐标系下的点或者矩形转换成另一个图层坐标系下的点或者矩形.
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
翻转的几何结构(geometryFlipped)
在iOS中,图层的布局坐标系的原点是在图层的左上角。在iOS上通过设置geometryFlipped为YES,以为这它的子图层将会被垂直翻转,也就是将会沿着底部排版而不是通常的顶部
如果父视图使用了翻转变换,它的子视图内容(以及它对应的图层)将会被颠倒,设置子图层的geometryFlipped属性为YES可以修正。不推荐使用
Z坐标轴(zPosition和anchorPointZ)
CALayer存在于一个三维空间中,zPositon和anchorPointZ都是在Z轴上描述图层位置的浮点类型。zPosition最实用的功能是改变图层的显示顺序。
以我们的视角来看,zPosition越大就越靠近我们,就显示在上层
Hit Testing
CALayer不关心任何响应链事件,但是我们可以通过:-containsPoint:和-hitTest:
- containsPoint接收一个在图层坐标系下的CGPoint,如果点在图层的frame范围内则返回YES
- hitTest接收CGPoint,但是返回的不是BOOL类型而是返回点击的图层本身
- hitTest返回的图层是按照图层树中的图层顺序,如果改变了zPosition从而改变了屏幕上图层显示的顺序,则返回的图层可能是被遮挡的其他图层
conrnerRadius
conrnerRadius设置图层角的曲率和maskToBounds配合使用
borderWidth和borderColor
borderWidth是绘制在图层边界里边的,而且在所有子视图之前,默认0
borderColor默认黑色
阴影
- shadowColor :阴影的颜色
- shadowOpacity:0-1之间的浮点数,可以理解为阴影的透明度
- shadowOffset:CGSize类型,宽度控制阴影横向的位移,高度控制纵向的位移,默认值为(0,-3),意味着相对于Y轴向上位移三个点(为什么要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(可以认为是为iOS创建的私有动画框架),但是呢,它却是在Mac OS上面世的,前面有提到,二者的Y轴是颠倒的。这就导致了默认的3个点位移的阴影是向上的。在Mac上, shadowOffset 的默认值是阴影向下的,这样你就能理解为什么iOS上的阴影方向是向上的了)
- shadowRadius:控制阴影的模糊度,数值越大,边界线看上去就会更加的模糊和自然
- shadowPath:CGPathRef类型(一个指向CGPaht的指针),可以通过这个属性单独于图层形状之外指定阴影的形状
----注----
- 图层的阴影继承自内容的外形
- 阴影通常在Layer之外,如果开启maskToBounds属性,则会将阴影剪切掉,如果想要得到效果,单独创建一个绘制阴影的外图层
- 如果事先知道了阴影的形状,可以使用shadowPath来提高性能
mask
mask:CALayer类型,定义父图层的部分可见区域,CALayer蒙板图层真正厉害的地方在于蒙板图不局限于静态图,任何有图层构成的都可以作为mask属性,这意味着你的蒙版可以通过代码甚至是动画实时生成
minificationFilter和magnificationFilter
设置layer的contents数据缩放拉伸时的描绘方式,minificationFilter用于缩小,magnificationFilter用于放大
- kCAFilterLinear:默认值,缩放平滑,但容易产生模糊效果
- kCAFilterTrilinear:基本和kCAFilterLinear相同
- kCAFilterNearest:速度快不会产生模糊,但会降低质量并像素化图像
#######线性过滤保留了形状,最近过滤则保留了像素的差异
opacity
UIView通过alpha属性确定视图的透明度,CALayer有一个等同的属性opacity。两个属性都将影响子层级的透明度。
如果你设置了图层的透明度,你希望它包含的整个图层树想一个整体一样透明,你可以通过下列方法达到效果:
1.设置Info.plist文件中的UIViewGroupOpacity为YES,缺点是会影响到整个应用
2.设置CALayer的一个shouldRasterize属性,如果它被设置为YES,在应用透明度更改之前,图层及其子图层会被整合成一张整体的图片,为了启用shouldRasterize属性,我们设置了图层的rasterizationScale**属性,默认情况下是1,使用shouldRasterize时需要设置,防止出现Retina屏幕像素化的问题(shouldRasterize可以缓存图层内容,可以优化性能)
网友评论