[CATransaction begin];
[CATransaction setDisableActions:YES];
// your code …
[CATransaction commit];
@property CGRect bounds;
@property CGPoint position;
称为 "定位点" / "锚点", 它的取值范围是0 ~ 1, 默认值为0.5. 可以通过该属性修改position的含义
@property CGPoint anchorPoint;
layer.frame = CGRectMake(50, 50, 200, 200);
@property CGColorRef backgroundColor;
转换CGColor类型方法两种:
(__bridge CGColorRef _Nullable)([UIColor redColor]);
[UIColor redColor].CGColor;
redView.layer.borderColor = [UIColor whiteColor].CGColor;
redView.layer.borderWidth = 15;
阴影效果shadowColor、shadowOffset、shadowOpacity属性必须同时设置后才可以看到
self.demoView.layer.shadowColor = [UIColor yellowColor].CGColor;
self.demoView.layer.shadowOffset = CGSizeMake(5, 5);
redView.layer.shadowOffset = CGSizeZero;
self.demoView.layer.shadowOpacity = 1.0;
self.demoView.layer.shadowRadius = 10;
redView.layer.cornerRadius = 125;
redView.layer.masksToBounds = YES;
已知控件label有两层,imageView,Button,UIView默认就一层,直接设置圆角就可以裁掉,但是各控件加了图片就会变成两层,依然需要masksToBounds属性; masksToBounds方法告诉layer将位于它之下的layer都遮盖住,这样会使圆角不被遮,但是这样会导致阴影效果没有,可以再添加一个SubLayer,添加阴影。 此处可以和UIView的clipToBounds来比较记忆(clipToBounds为yes会使其上的内容包括子视图不能超出边界)
控件截图裁剪的三种方法:
photoView.clipsToBounds = YES ;
设置两边多余地方不裁剪
button.imageView.clipsToBounds = NO;
redView.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"header"].CGImage);
__bridge类型表达式的作用一般就是把 Core Foundation 中的数据类型转换成 Foundation 中的类型, 桥接的时候也会设置到一些所有权的转换等。
给UIView设置背景图片的三种方式
redView.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"header"].CGImage);
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"me"]];
[CATransaction begin];
[CATransaction setDisableActions:YES];
//your code …e.g.:
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];
@property CATransform3D transform;
(1) 平移(当没有3D旋转的时候z值没有效果)
CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
self.blueLayer.transform = CATransform3DTranslate(self.blueLayer.transform, 10, 10, 10);
(2) 缩放
CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
self.blueLayer.transform = CATransform3DScale(self.blueLayer.transform, 0.8, 0.8, 0.8);
(3) 旋转 以哪个轴的哪个点进行旋转,以一个轴旋转,轴上的任何点都一样,参数填1就可以
CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
self.blueLayer.transform = CATransform3DRotate(self.blueLayer.transform, M_PI_4 * 0.5, 1, 1, 1);
注意:上面属性如果同时使用非make方式,其中一个使用了make会导致动画只执行了make那个属性,其它属性不会再继续执行,可以通过KVC模式解决
[self.myLayer setValue:@(rotate) forKeyPath:@"transform.rotation"];
1、 创建自定义图层对象
+ (instancetype)layer;
2、 添加子图层
- (void)addSublayer:(CALayer *)layer;
3、将layer上的所有内容渲染到图形上下文中
CGContextRef ctx = UIGraphicsGetCurrentContext();
[redView.layer renderInContext:ctx];
4、添加动画、开始动画 一个layer中可以添加多个核心动画对象
- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key;
5、关闭动画、停止动画、移除动画(key值与开始动画的key对应)
- (void)removeAnimationForKey:(NSString *)key;
6、layer动画移动后回到原位置的解决办法:
// 设置layer执行完毕动画后,不要回去
anim1.removedOnCompletion = NO; // 当核心动画执行完毕后不要从layer中移除
anim1.fillMode = kCAFillModeForwards;
// 为animation对象设置代理
// 这里的代理没有协议, 叫做隐式代理,里面有两种方法可以选择实现
anim1.delegate = self;
// 动画结束执行
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
self.redView.center = CGPointMake(150, 250);
}
控件有两个图层: 展示图层, 在后台移动图层中的内容
- (id)presentationLayer;
模型图层, 就是移动前原本的图层位置,移动后presentationLayer会回到该图层位置
- (id)modelLayer;