2011-12-04 213 views
0

我想在这个简单的自定义TUIScrollView类(从TwUI开源项目和非常类似于UIScrollView),我已经建立一个调整大小切换动画。它被称为TUILayout,并支持水平布局以及垂直,动画插入和删除,并且有更多的声明性方式将数据提供给它的单元格,我更喜欢委派。它回收类似于TUITableView或UITableView的视图。无论如何,如果你想跟随,这只是一个类,并在这里。在滚动视图上调整动画

https://github.com/mrjjwright/TUILayout

在示例代码中,用户单击左下角的蓝色按钮,所有行平滑缩小到用户可以重新排序和删除某些行的大小(在示例中的某一行右键单击以查看此内容操作)等等,然后用户再次单击蓝色按钮将行切换回原始大小。

虽然这样调整在setObjectHeight:animated我第一次调整是代表行我的模型对象,重新计算并设置contentSize的TUIScrollView,循环中的所有新的观点(比如说10多个视图将适合在收缩视图,以便dequeueReusableView和addSubview被调用10次),最后我将所有视图的框架设置为layoutSubviews中的大小和位置。

其结果是scrollview正确缩小到滚动条不再显示的大小,屏幕上的视图平滑地缩小到缩小的大小,但新添加的子视图现在可以放入visibleRect动画中很久以后作为一个子视图块。

因此,所有新添加的子视图滞后于屏幕上的视图,我无法弄清楚为什么动画并非全部一起发生。我已经尝试了很多不同的组合,包括CATransactions。我想知道是否必须如何CAScrollLayer的工作,或者如果有人可以帮助我通过这个想法。

更普遍的问题是如何顺利处理滚动视图上调整大小的动画,以回收视图,并且我已经查看了iOS世界中的其他几个网格,并且获得了一些灵感但仍在寻找更多。

谢谢!

回答

1

我想我可能已经在这里解决了我自己的问题(因为我今天早上让我的床在打我)。我强制当前的runloop在所有必要的子视图中循环后运行,并且非常重要的是在运行循环完成并且为动画添加所需子视图之前不设置scrollview的contentSize。为了获得运行循环火我用的伎俩从this SO question

skipLayout = YES; 
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 
skipLayout = NO; 

如果skipLayout设置TUILayout刚刚从layoutSubviews退回,使得刚刚添加的意见没有立即被回收利用布局代码删除。强制运行循环运行确保所有子视图都在动画的屏幕上。在此之后,我执行了调整大小的动画布局。我更新了github上的代码,如果有人感兴趣。我将把这个问题留待一段时间,以获得一些进一步的见解。

相关问题