CoreAnimation编程指南(二)设置层对象

层是核心动画的核心。层不仅管理引用程序的视觉内容,还提供修改样式和内容的选项。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下载地址:请点击我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值