我正在尝试在我构建的这个简单的自定义TUIScrollView类(来自TwUI开源项目,非常类似于UIScrollView)上创建调整大小切换动画。它被称为TUILayout,支持水平布局以及垂直,动画插入和删除,并且具有更多声明性的方式向我的单元格提供数据,而不是委托。它回收类似于TUITableView或UITableView的视图。无论如何,如果你想跟随它,它只是一个类而且就在这里。
https://github.com/mrjjwright/TUILayout
在示例代码中,用户单击左下方的蓝色按钮,所有行平滑缩小到用户可以重新排序和删除某些行的大小(右键单击示例中的行以查看此操作)等等...然后用户再次单击蓝色按钮将行切换回原始大小。
在setObjectHeight:animated
中执行此调整大小时,我首先调整表示行的模型对象,重新计算并在TUIScrollView上设置contentSize,循环显示所有新视图(再说10个视图将适合缩小视图)所以dequeueReusableView和addSubview被调用10次)最后我将所有视图的帧设置为layoutSubviews中的大小和位置的动画。
结果是,scrollview正确缩小到滚动条不再显示的大小,屏幕上的视图平滑动画缩小到缩小的大小,但新添加的子视图现在可以放入visibleRect动画中了很多后来作为一个子视图块。
因此,所有新添加的子视图都落后于屏幕上的视图,我无法弄清楚为什么动画并非全部一起发生。我尝试了许多不同的组合,没有运气,包括CATransactions。我想知道它是否与CAScrollLayer的工作方式有关,或者是否有人可以帮助我思考这个问题。
更普遍的问题是如何在回滚视图的滚动视图上顺利处理动画调整大小,我已经在iOS世界中查看了其他几个网格并获得了一些灵感,但我正在寻找更多。
谢谢!
答案 0 :(得分:1)
我想我可能已经在这里解决了我自己的问题(因为我今天早上正在铺床,它击中了我)。我强制当前的runloop在所有必要的子视图中循环后运行,并且非常重要的是不设置scrollview的contentSize,直到运行循环完成并添加动画所需的子视图。为了让运行循环起火,我使用了来自this SO question的技巧:
skipLayout = YES;
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
skipLayout = NO;
如果skipLayout
设置为TUILayout
,则只返回layoutSubviews,以便回收布局代码不会立即删除刚刚添加的视图。强制运行循环运行确保所有子视图都在动画的屏幕上。在此之后我执行了调整大小的动画布局。如果有兴趣的话,我在github上更新了代码。我会暂时搁置这个问题以获得进一步的见解。