Mar*_*arc 21 core-animation objective-c uikit ios uicollectionview
UICollectionView当用户滚动列表时(我正在使用子类UICollectionViewFlowLayout),我希望我的动画可以查看.
我在布局管理器中指定了位置,我希望能够做的是指定一个初始变换,并在正确的时间(当单元格首次出现在屏幕上时)应用于动画中.要查看我的意思,请查看iOS上的Google Plus应用.理想情况下,根据细胞的位置不同的变换.
我似乎无法找到一个方法来找出显示单元时(没有相应的willDisplayCell上仍然有UITableView),或者去哪里这方面的任何指针.
有什么建议?
您可以在此屏幕截图中在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要在更复杂的布局上为不同位置设置动画的单元格,以及为框架设置其他属性的动画,或应用变换.
您需要initialLayoutAttributesForAppearingItemAtIndexPath:在集合视图布局中覆盖.在这里,您可以在布局属性项(包括转换)上设置任何属性,该属性将在单元格出现后设置为实际属性.
如果标准布局属性对象没有为您提供足够的选项,则可以对其进行子类化,添加额外的属性,并覆盖applyLayoutAttributes:单元格以获取额外的属性.
这仅在将单元格添加到集合视图时才有效.
要在向下滚动集合视图时将变换应用于单元格,我cellForItem会将它们直接应用于单元格(at ...)或布局属性,也许是一个名为的属性initialTransform.将布局属性应用于单元格时,您需要检查initialTransform,应用它,然后将其设置为标识,然后触发动画转到标识转换,这样只有在单元格首次滚动到屏幕上时才会应用它.我没有实现这样的任何东西,它只是猜测我将如何做到这一点.