我正在尝试为从屏幕底部向上滑动的视图实现可中断/可擦除的动画,其方式与this WWDC video from 2017相同。我将UIViewPropertyAnimator绑定到一个手势识别器,在该手势识别器中,平移手势会创建并立即暂停(如果该动画不存在的话)该动画制作器,并将fractionComplete属性绑定到滑动的翻译上。
在我尝试中断动画之前,一切都很好。暂停时,由于某种原因,我返回的线性fractionComplete值通常(但并非总是)不正确(动画器的scrubsLinearly属性为true,这意味着暂停时fractionComplete会自动转换为线性进度)。
这意味着当我在飞行途中捕捉到视图并尝试将其平移时,它会不稳定地跳跃,因为fractionComplete值被设置回了我刚刚阅读的“错误”值+翻译。例如,当视图在线性范围内约为50%时,在暂停动画后,我通常会获得约0.1的fractionComplete值,而不是预期的〜0.5。
我已经将其范围缩小到与约束相关的某种程度,因为删除我的一个视图可以解决问题。
我的视图层次结构如下:
主容器视图固定在左侧,右侧和底部边缘,并具有高度限制。高度限制是我在开始动画之前立即更改的内容,动画块由view.layoutIfNeeded()调用组成。
手柄只是视觉装饰。它固定在容器的左侧,右侧和顶部,并具有固定的高度。
标题视图固定在超级视图的左侧和右侧以及手柄的底部。两行标签之间以及页眉的顶部/底部之间存在垂直约束,从而使页眉视图具有明确的高度。我已突出显示顶部标签以尝试显示我的意思-该标签及其下方的标签封装在标题视图中。
如果我删除表格视图,则大多数情况下都会正常运行,尽管存在一些稍微不稳定的行为,其中pauseAnimation()上从曲线到线性级数的转换将以固定的0.125增量(在大多数情况下)达到0.25-0.875 -我无法确定到底是什么引起的)。但是,无论我尝试什么,在当前的表格视图下都无法使其正常运行。
我尝试给表视图一个较低的内容拥抱和抗压缩优先级,给表一个固定的高度,给标题视图一个固定的高度。我还尝试将对layoutIfNeeded()的调用添加到动画层次结构中视图的每个排列中,但都没有成功。
任何见识将不胜感激。