5

我有一个UICollectionView和两个子类UICollectionViewFlowLayout。当一个单元格被选中时,我调用setCollectionViewLayout:animated:在布局之间切换。过渡完成后,选定的单元格居中,这很好。

可以在不实际选择单元格的情况下完成相同的居中行为吗?我试图调用setContentOffset:animated:不同的方法,但没有成功。或者,我可以contentOffset为要显示的布局指定一个自定义项吗?

更清楚地说,我想在不修改单元格selected属性的情况下拥有这样的东西:在此处输入图像描述

编辑#1

这是我已经拥有的:

[self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView setCollectionViewLayout:layout animated:YES];

看起来不错:https ://www.dropbox.com/s/9u6cnwwdbe9vss0/17249646-0.mov


但如果我跳过selectItemAtIndexPath

[self.collectionView setCollectionViewLayout:layout animated:YES];
[self.collectionView scrollRectToVisible:targetFrame animated:YES];

这不是很好(一种挥舞动画):https ://www.dropbox.com/s/s3u2eqq16tmex1v/17249646-1.mov

4

1 回答 1

0

编辑(进一步澄清后更改答案)

我在这里对表格视图做了类似的处理。基本上,您调用scrollRectToVisible:animated:计算一个矩形,它将您的滚动视图定位在您希望它结束​​的位置。对于精确定位,我认为您只需要计算与您的视图大小相同的矩形。请注意,如果内容大小将发生变化,则应以预期的最终内容大小计算矩形。

原始答案

您可以通过使用以下内容覆盖来修改超类生成的布局layoutAttributesForElementsInRect:rect

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *poses = [super layoutAttributesForElementsInRect:rect];
    if (<test whether we want to modify poses>) {
        UICollectionViewLayoutAttributes *pose = poses[<index of pose to be modified>];
        pose.frame = <some other frame>;//modify the frame, for example
    }
    return poses;
}

您还需layoutAttributesForItemAtIndexPath要用类似的逻辑覆盖。下一步是在您希望更改发生时使布局无效或替换。您还需要传递一些信息。布局需要知道要做什么,因此您可以将相关数据传递给它或扩展UICollectionViewDelegateFlowLayout1

于 2013-06-22T15:48:32.960 回答