为了说明这个问题,我在 Github 上提供了一个非常小的 Xcode 项目(两个类,11kb 下载)。看看这里的要点或使用git clone git@gist.github.com:93982af3b65d2151672e.git。
请考虑以下情况。我的一个自定义视图,称为“容器视图”,包含两个小方块。在此屏幕截图中说明:
蓝色方块是 22x22 ptUIView
实例,红色方块是 22x22 ptCALayer
实例。出于这个问题的目的,我希望这两个正方形“粘”到外视图的右下角,同时我为该外视图的框架设置动画。
UIView
我在 a的 class method中更改了容器视图的框架animateWithDuration:delay:options:animations:completion:
,并使用了 type 的非默认缓动参数UIViewAnimationCurveEaseOut
。
[UIView animateWithDuration:1.0 delay:0
options:UIViewAnimationCurveEaseOut
animations:^{ _containerView.frame = randomFrame; }
completion:nil];
注意:蓝色 UIView 和红色 CALayer 的框架都是在容器视图的重写方法中设置的,但是如果我将蓝色 UIView 的属性设置为 UIView 灵活的左边距和上边距setFrame:
,结果将是相同的。autoresizingMask
在生成的动画中,蓝色方块按照我的意图“粘”在角落,但红色方块完全忽略了动画的时间和缓动。我认为这是因为 Core Animation 的隐式动画特性,这个特性在很多场合都对我有帮助。
以下是动画序列中的一些屏幕截图,说明了两个方块的异步性:
关于这个问题:有没有办法同步两个帧的变化,使红色的 CALayer 和蓝色的 UIView 都以相同的动画持续时间和缓动曲线移动,就像它们是一个视图一样粘在一起?
PS 当然,两个正方形粘在一起所需的视觉效果可以通过多种方式实现,例如让两个图层都变为CALayer
s 或UIView
s,但真正问题所在的项目有一个非常正当的原因一个是 CALayer,另一个是 UIView。