CameronL's Blog

不积跬步,无以至千里

0%

shadowPath和autoLayout问题分析

前提

前一段时间在开发的过程中,遇到了一个坑,当我给某个View添加阴影效果的时候,因为这个View的Size是动态的,然后动态改变View的size的时候,阴影没有随着改变,用了半天才把这个问题解决,最后总结的时候觉得是自己对阴影效果理解不透彻,所以在此记录一下,以便加深印象,下面附上代码分析:

代码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// shadowColor阴影颜色
view.layer.shadowColor = [UIColor blackColor].CGColor;

// shadowOffset阴影偏移,x向右偏移4,y向下偏移4,默认(0, -3)
view.layer.shadowOffset = CGSizeMake(4,4);

// 阴影透明度,默认0
view.layer.shadowOpacity = 0.3;

// 阴影半径,默认3
view.layer.shadowRadius = 4;

// shadowPath阴影路径
view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];

注意
shadowPath可以提前告诉 CoreAnimation 你要渲染的view的形状的Shape,可以减少离屏渲染的计算时间,大大的提高性能,防止低性能设备的卡顿出现

然而!!!但是!!!意外发生了。。。

因为设置了shadowPath,当因为屏幕的不一样,autolayout会改变view的size,或者某些的操作改变了view的size,shadowPath没有随着改变,导致阴影的位置对不上,一开始没有往这方面想,以为是分辨率不一样要不同的处理,弄了半天。。。

最后发现解决问题的方向搞错了,网上终于找了真正的原因,下面是个人觉得比较好的解决方式,上代码!

1
2
3
4
- (void)layoutSubviews {
[super layoutSubviews];
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath;
}

新建一个UIView的子类,重写layoutSubviews方法,当view改变大小会调用此方法,然后相应的改变shadowPath,完美解决!!!

end

CameronL 微信

微信

CameronL 支付宝

支付宝