如何正确地动画化分页 UICollectionView 的大小变化

How to correctly animate change of size of a paged UICollectionView

我有一个类似于 iPad Keynote 的 iPad 应用程序,左侧是一个狭窄的概述,右侧是我的 "slides" 的分页 UICollectionView。集合视图使用默认的 FlowLayout。其中一些幻灯片是标准 PDF,一些是嵌入的 UIViewControllers,已缩放(使用 CGAffineTransform)并嵌入到单元格中。我想在屏幕外平滑地动画概述侧边栏并将当前页面单元格缩放到全屏。集合视图应该允许以任何大小进行分页滑动。我正在使用故事板和自动布局。

我想我需要同时为三件事制作动画:

我有一些工作正常(单个嵌入式视图控制器 "slide" 可以正确缩放)但无法使 collectionView/cell 调整大小舞蹈正常工作。调整单元格大小的动画不稳定,或者以错误的偏移结束,或者对最左边的单元格有效但对其他单元格无效。

我已经尝试了 this question 答案中的大部分建议,但没有令人信服的成功。我不敢相信这是不可能的,但在这一点上,我正在考虑为静态幻灯片设置动画并在动画完成后将其隐藏的烟雾和镜子方法。附带的视频 - 忽略小故障 - 说明了我所追求的那种效果:

值得注意的是,经过仔细检查,Keynote 在编辑模式下在幻灯片之间滑动时有些作弊,并手动管理屏幕上的下一张幻灯片滑动,因此可能不使用 UICollectionView

有没有人做过类似的事情,或者对尝试的事情有什么建议?

我设法解决了这个问题。有一个 proof-of-concept GitHub 回购 here.

有几个活动部分:

  • 有两段UIView缩放代码。我怀疑这些可以与合适的委托引用结合使用,因为嵌入了嵌套视图控制器。创建 Collection View 单元格时,第一部分会(静态)正确缩放。第二个是当侧边栏大小改变时的动画 scale/translate。

  • 我添加了一个 FlowLayout 子类来消除闪烁,因为集合的布局在缩放期间无效。

  • top-levelVC中的sidebar-related变换使用了本书中的大部分技巧-invalidateLayout(),performBatchUpdates(...), layoutIfNeeded() 等以及将 contentOffset 动画化为正确的值。需要对正确的 page/slide 进行一些手动跟踪。

  • 刚开始调整大小的时候偶尔会有轻微的闪烁。这可能不是我的特定 colour-scheme 的问题,它将在深灰色上显示为黑色。如果有人可以建议如何追踪或缓解它,加分。