在我的应用程序中,我有一个使用 CALayer
来实现阴影的 UIView
:
@implementation MyUIView
- (instancetype) initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if(!self) return self;
self.layer.shadowColor = [UIColor colorWithWhite:0 alpha:.2].CGColor;
self.layer.shadowOffset = CGSizeMake(0, 2);
self.layer.shadowOpacity = 1;
self.layer.shadowRadius = 1;
return self;
}
@end
如果我想要任何接近合理性能的东西,我必须定义 CALayer
的 shadowPath
:
@implementation MyUIView
- (void) setFrame:(CGRect)frame {
[super setFrame:frame];
self.layer.shadowPath = CGPathCreateWithRect(self.bounds, NULL);
}
@end
每当我为这个 UIView
设置动画时,我注意到两件事:
如果我不使用
shadowPath
,阴影会随着旋转和帧大小的变化而很好地动画化。这里需要注意的是动画速度非常慢,并且普遍缺乏性能。如果我做使用
shadowPath
每当UIView
动画时动画是流畅和及时的,但是阴影的过渡本身与没有shadowPath
的情况相比,它更像 block (并且更不平滑)。
示例:
- 与
shadowPath
:https://gfycat.com/ColdBlissfulIndusriverdolphin (注意阴影如何表现得像一个变形不佳的矩形?) - 没有
shadowPath
(动画的缓慢在设备上更明显,但你明白了):https://gfycat.com/ActiveRemorsefulBandicoot
编辑:
值得注意的是,这些动画是隐式的——我自己并没有调用它们。它们是 UIViewController
随设备方向旋转的结果。阴影位于 UIView
上,在旋转期间会改变大小。
最佳答案
我试图重现您提供的两个 gif 中显示的行为,但没有成功(也许您可以使用动画代码编辑您的问题,例如 UIView animateWithDuration:animations:
)。
然而,在我脑海深处的某个地方,我记得我偶尔遇到过类似的问题,结果我不得不光栅化 View 以使其平滑。
所以我不能保证它能解决你的问题,但试一试:
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [[UIScreen mainScreen] scale];
关于ios - 为 CALayer 的 shadowPath 设置动画时的平滑动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787395/