UICollectionVIew:滚动时为单元格设置动画

Mar*_*arc 21 core-animation objective-c uikit ios uicollectionview

UICollectionView当用户滚动列表时(我正在使用子类UICollectionViewFlowLayout),我希望我的动画可以查看.

我在布局管理器中指定了位置,我希望能够做的是指定一个初始变换,并在正确的时间(当单元格首次出现在屏幕上时)应用于动画中.要查看我的意思,请查看iOS上的Google Plus应用.理想情况下,根据细胞的位置不同的变换.

我似乎无法找到一个方法来找出显示单元时(没有相应的willDisplayCell上仍然有UITableView),或者去哪里这方面的任何指针.

有什么建议?

您可以在此屏幕截图中在Google Plus中制作动画: Google Plus应用中的示例

另外,在iPad上查看iPhoto.我不知道他们是否正在使用UIcollectionView(可能不是,因为它在iOS5上运行),但这是我正在寻找的效果,照片似乎从右边飞入.

Cez*_*zar 36

您可以独立于自定义布局来实现此效果.

动画代码应该进入内部 collectionView:cellForItemAtIndexPath:

当单元格出列时,frame它将设置为布局中指定的单元格.您可以将其存储在临时变量中作为frame单元格的最终变量.然后,您可以将其设置为cell.frame屏幕外的初始位置,然后设置为所需的最终位置.有点像:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

    CGRect finalCellFrame = cell.frame;
    //check the scrolling direction to verify from which side of the screen the cell should come.
    CGPoint translation = [collectionView.panGestureRecognizer translationInView:collectionView.superview];
    if (translation.x > 0) {
        cell.frame = CGRectMake(finalCellFrame.origin.x - 1000, - 500.0f, 0, 0);
    } else {
        cell.frame = CGRectMake(finalCellFrame.origin.x + 1000, - 500.0f, 0, 0);
    }

    [UIView animateWithDuration:0.5f animations:^(void){
        cell.frame = finalCellFrame;
    }];

    return cell;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将UICollectionView根据滚动方向为屏幕顶部和任意一侧的水平单元格设置动画.您还可以检查当前indexPath要在更复杂的布局上为不同位置设置动画的单元格,以及为框架设置其他属性的动画,或应用变换.

  • 我明白你的意思.在Google +中,可能发生的事情是,当新内容插入到CollectionView数据源中时,它们会动画化.为了防止在滚动时再次动画,我想你需要存储一个标志数组,并为每个已设置动画的indexPath设置它们的值.当为给定的indexPath出列单元格时,您将检查该数组以查看是否应该设置动画. (2认同)

jrt*_*ton 5

您需要initialLayoutAttributesForAppearingItemAtIndexPath:在集合视图布局中覆盖.在这里,您可以在布局属性项(包括转换)上设置任何属性,该属性将在单元格出现后设置为实际属性.

如果标准布局属性对象没有为您提供足够的选项,则可以对其进行子类化,添加额外的属性,并覆盖applyLayoutAttributes:单元格以获取额外的属性.

这仅在将单元格添加到集合视图时才有效.

要在向下滚动集合视图时将变换应用于单元格,我cellForItem会将它们直接应用于单元格(at ...)或布局属性,也许是一个名为的属性initialTransform.将布局属性应用于单元格时,您需要检查initialTransform,应用它,然后将其设置为标识,然后触发动画转到标识转换,这样只有在单元格首次滚动到屏幕上时才会应用它.我没有实现这样的任何东西,它只是猜测我将如何做到这一点.

  • 根据文档,这个方法在数据更改时调用,或者在集合视图需要重绘时调用,而不是在滚动时调用 - 除非我做错了什么?您可以确认在滚动时触发此回调吗?引用"**当集合视图中的数据发生更改并且要插入或删除项目时,集合视图会要求其布局对象更新布局信息.**"来自http://developer.apple.com/library/ IOS /文档/ UIKit的/参照/ UICollectionViewLayout_class /参考/的reference.html (2认同)