层是核心动画的核心。层不仅管理引用程序的视觉内容,还提供修改样式和内容的选项。iOS应用的层是自动开启的,切始终启用,每个视图是由一层支持的。
获取或修改视图所在层
- 获取视图所在的层
获取视图所在的层,我们可以调用
+ (Class) layerClass;
这个方法获取。
eg:UIView所在的层是CALayer
NSLog(@"%@",[UIView layerClass]);
// CALayer
- 修改视图所在的层
修改视图所在的层是通过重写
+ (Class) layerClass;
这个方法实现的。
+ (Class) layerClass {
return [CAMetalLayer class];
}
一共有这么多层
在这所有的层中,它们的基础都是CALayer。
使用图像的图层内容
图像分配给层显示,必须是CGImageRef类型的。
在我的《【iOS】CoreImage原生二维码生成(二)一个方法生成带logo的二维码》就使用过这个。
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(10, 220, 100, 100)];
myView.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1"].CGImage);
[self.view addSubview:myView];
使用layer.contents我们就可以把一个CGImageRef对象显示在一个视图上面。
调整层的视觉风格和外观
- 背景和边界层
改变视图的背景和边界层,在是实际项目中是使用频率比较高的。
// 设置一个边框
myImageView.layer.backgroundColor = [UIColor greenColor].CGColor;
myImageView.layer.borderColor = [UIColor blackColor].CGColor;
myImageView.layer.borderWidth = 1.0;
- 层支持圆角半径
设置圆角就比较简单了。
// 设置圆角
myImageView.layer.cornerRadius = 8.0;
- 层支持内置阴影
这个CALayer类包含用于配置阴影效果的几个性质。一个影子增加深度层使它看起来好像是浮在上面的基本内容。这是另一种类型的视觉装饰,你可能会发现有用的在特定情况下,你的应用程序。层,你可以控制阴影的颜色,位置相对于层的内容,不透明度,和形状。
// 设置阴影
myImageView.layer.shadowOffset = CGSizeMake(5, 5);;
myImageView.layer.shadowOpacity = 0.5;
- 视图不超出边界
使视图不超出边界这个在实际做项目中使用是比较多的,例如我们设置一个UIImageView对象为圆角是,我们会把视图的clipsToBounds这属性设置为YES,有了层后我们还有一个层的属性masksToBounds,同样把它设置为YES。
// 不超出边界
myImageView.clipsToBounds = YES;
myImageView.layer.masksToBounds = YES;
调整显示内容
在UIView里面有这个一个属性
@property(nonatomic) UIViewContentMode contentMode; // default is UIViewContentModeScaleToFill
有了这个属性,我们可以设置一些视图的显示模式,最为明显的一点使用就是在使用UIImageView对象时,我们可以设置这个属性为不同的值就能看见图片的不同显示效果。
contentMode的可选值:
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill, // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};
但是在层里面也有一个类似的属性:
/* A string defining how the contents of the layer is mapped into its
* bounds rect. Options are `center', `top', `bottom', `left',
* `right', `topLeft', `topRight', `bottomLeft', `bottomRight',
* `resize', `resizeAspect', `resizeAspectFill'. The default value is
* `resize'. Note that "bottom" always means "Minimum Y" and "top"
* always means "Maximum Y". */
@property(copy) NSString *contentsGravity;
这个是是基于重力的位置。
contentsGravity的可选值:
/** Layer `contentsGravity' values. **/
CA_EXTERN NSString * const kCAGravityCenter
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTop
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottom
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityLeft
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityRight
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTopLeft
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTopRight
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottomLeft
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottomRight
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResize
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResizeAspect
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResizeAspectFill
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
上面两个属性他们之间的可选值基本是对应的,都可以达到相同的使用效果,但是layer的是基于硬件的,使用效率上会比前者高。
该表效果图:
// 调整显示模式
// 方式一
myImageView.layer.contentsGravity = kCAGravityResizeAspectFill;
// 方式二
myImageView.contentMode = UIViewContentModeScaleToFill;
实际Demo显示效果:
总结
上面所列举的属性和方法在实际项目是使用比较多的。
Demo下载地址:请点击我!