动画在UICollectionView偏移的滚动视图的/的UITableView导致过早消失细胞(A

2019-07-04 04:03发布

我们有一个自定义布局非常类似的UITableView(它垂直滚动)一个UICollectionView。 所述UICollectionView同时仅显示3细胞,用其中之一是当前活动的细胞:

[ 1 ]
[*2*]
[ 3 ]

(这里的活动单元格是#2。)将细胞大致280点高,所以只有活动小区是在屏幕上完全可见。 用户不直接滚动到导航视图,相反,她挥笔水平活动单元格前进到下一个单元格。 然后,我们做一些花哨的动画和滚动UICollectionView所以下一个单元是在“主动”地位,从而使其成为一个活跃的,移动旧的路程,把队列中的下一个单元格:

[ 2 ]
[*3*]
[ 4 ]

这里的问题是设置UICollectionView的偏移。 目前,我们将其设置在一个UIView动画块( self.collectionView.contentOffset = targetOffset;与其他三个动画特性,这主要是工作很大沿,而导致所述第一小区(以前的活动之一,在后者的情况下,#2)尽快消失作为动画开始运行时,延迟时间完成之前就。 这绝对是不理想的。

我想过一些解决方案,但不能找出最好的一个:

  1. 荒谬扩大UICollectionView的框架,以适应五个格,而不是三个,从而迫使它使细胞保持在内存中,即使它们是屏幕之外。 我已经试过这和它的作品,但它听起来像是一个非常肮脏的黑客。

  2. 就拿消失细胞的呈现内容的快照,把它放在一个UIImageView,加入的UIImageView作为滚动视图的子视图的细胞去之前远去的老细胞完全相同的位置,一旦动画结束时删除它。 听起来比前一个选项(内存明智的,至少)少苏茨基,但还是有点哈克。 我也不知道做到这一点的最好办法,请点我在正确的方向。

    1. 切换到UIScrollView的setContentOffset:animated: 。 实际上,我们曾经有过这一点,它解决了这一消失的电池问题,但在并行与其他的UIView动画显然是竞争的主线程的注意运行此,从而创造单核设备上非常波涛汹涌的动画(iPhone 3GS / 4)。 它也不会允许我们改变动画的持续时间或宽松,所以感觉不同步的其余部分。 仍是一个选项,如果我们能找到一种方法,使其在协调工作与UIView的块动画。

    2. 切换到UICollectionView的scrollToItemAtIndexPath:atScrollPosition:animated: 。 没有试过,但它有一个很大的弊端:只需要3个可能的常数(适用于这种情况下,至少)目标滚动位置: UICollectionViewScrollPositionTopUICollectionViewScrollPositionCenteredVerticallyUICollectionViewScrollPositionBottom 。 活动单元格可能会改变其高度,但它总是必须是35分从窗口的顶部,而这些选项都无法提供足够的控制来完成设计。 它也可能是一样的3.1问题。 仍是一个选项,因为有可能是一个办法绕过去滚动位置的事情,我不知道,它可能不会有同样的问题与主线程,这似乎不太可能。

任何帮助将不胜感激。 如果你需要澄清,请询问。 非常感谢!

Answer 1:

我去与#2。 下面是确实的渲染和存储的片段:

UIGraphicsBeginImageContext(theCell.bounds.size);
[theCell.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *renderedCellImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

该方法的其余部分是相当多的,因为我如上所述,有一点需要注意:这必须做的是实际使用,并在后台线程上的图像之前,因为渲染可能需要长达1整秒在iPhone 4,希望这帮助别人。



Answer 2:

我得到的细胞通过设置内容在动画块偏移后,立即重装他们留下可见。

UIView.animateWithDuration(0.3) { 
    self.collectionView.contentOffset = newOffset
    self.collectionView.reloadItemsAtIndexPaths(willDisappearIndexPaths)
}


Answer 3:

远射:尝试设置的UIView动画块选项UIViewAnimationOptionBeginFromCurrentState。

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{ }
                 completion:^(BOOL  completed){ } ];


文章来源: Animating the offset of the scrollView in a UICollectionView/UITableView causes prematurely disappearing cells