为了说明这个问题,我在Github上分享了一个非常小的Xcode项目(两个类,11KB下载大小)。点击这里查看代码片段或使用git clone git@gist.github.com:93982af3b65d2151672e.git。
请考虑以下情景。我有一个自定义视图,名为'容器视图',其中包含两个小正方形。如下截图所示:
蓝色正方形是一个22x22pt的UIView
实例,红色正方形是一个22x22pt的CALayer
实例。对于这个问题,我想让这两个正方形“粘”在外部视图的右下角,同时我要动画显示该外部视图的框架。
我在UIView
的类方法animateWithDuration:delay:options:animations:completion:
中更改了容器视图的框架,使用了类型为UIViewAnimationCurveEaseOut
的非默认缓动参数。
[UIView animateWithDuration:1.0 delay:0
options:UIViewAnimationCurveEaseOut
animations:^{ _containerView.frame = randomFrame; }
completion:nil];
注意: 蓝色UIView和红色CALayer的frame都在容器视图的重写setFrame:
方法中设置,但如果我将蓝色UIView的autoresizingMask
属性设置为UIView的左侧和顶部边距自适应,结果也将是相同的。在生成的动画中,蓝色正方形会像我期望的那样“粘”在角落上,但是红色正方形完全没有考虑动画的时间和缓动。我认为这是由于Core Animation的隐式动画特性造成的,这个特性在以前的许多情况下都对我有所帮助。
以下是一些动画序列中的截图,用于说明这两个正方形的非同步性:
![Three screenshots mid-animation where the red square is not in the 'right' place](https://istack.dev59.com/ryHp4.webp)
CALayer
或UIView
,但实际问题所在的项目有一个非常合法的原因,其中一个是CALayer,另一个是UIView。
CAMediaTimingFunction
中有一个小错别字)。您可以在gist项目中尝试它。 - epologee