2

我开始尝试自定义 UICollectionView 布局。我的 UIViewController 中有一个符合 UICollectionViewDataSource 和 UICollectionViewFlowLayout 协议的 UICollectionView。每个单元格只是一个图像和一个标签。我有一个按钮可以做到这一点:

- (IBAction)switchLayout:(id)sender {
    PinchLayout *pinchLayout = [[PinchLayout alloc] init];
    [self.collectionView setCollectionViewLayout:pinchLayout];
}

PinchLayout 直接从 Apple 的示例代码中复制而来。当调用 switchLayout: 方法时,我的 collectionView 消失了。我不明白为什么。我认为它会动画到新的位置。或者在这种情况下,除了为新布局添加手势支持外,什么也不做。然后,当我再次按下按钮时,我看到了一个新布局,其中我的所有集合视图单元格都缩小了其原始大小的版本。这是 PinchLayout.m

-(void)applyPinchToLayoutAttributes:(UICollectionViewLayoutAttributes*)layoutAttributes
{
    if ([layoutAttributes.indexPath isEqual:self.pinchedCellPath])
    {
        layoutAttributes.transform3D = CATransform3DMakeScale(self.pinchedCellScale, self.pinchedCellScale, 1.0);
        layoutAttributes.center = self.pinchedCellCenter;
        layoutAttributes.zIndex = 1;
    }
}

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray* allAttributesInRect = [super layoutAttributesForElementsInRect:rect];

    for (UICollectionViewLayoutAttributes* cellAttributes in allAttributesInRect)
    {
        [self applyPinchToLayoutAttributes:cellAttributes];
    }

    return allAttributesInRect;
}

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewLayoutAttributes* attributes = [super layoutAttributesForItemAtIndexPath:indexPath];

    [self applyPinchToLayoutAttributes:attributes];

    return attributes;
}

-(void)setPinchedCellScale:(CGFloat)scale
{
    _pinchedCellScale = scale;
    [self invalidateLayout];
}

- (void)setPinchedCellCenter:(CGPoint)origin {
    _pinchedCellCenter = origin;
    [self invalidateLayout];
}

有任何想法吗?谢谢!

编辑:如果我将操作方法​​更改为

- (IBAction)switchLayout:(id)sender {
    PinchLayout *pinchLayout = [[PinchLayout alloc] init];
    [self.collectionView setCollectionViewLayout:pinchLayout animated:YES];
}

我看着我所有的收藏视图单元格从屏幕上移到顶部。不知道他们为什么这样做。

编辑2:我记录了属性和cellAttributes,看起来框架总是在屏幕的范围内,所以我仍然不确定为什么单元格会离开屏幕到顶部。这是日志:

2012-12-04 21:54:40.808 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7516450> index path: (<NSIndexPath 0xe111180> 2 indexes [0, 4]); frame = (297.2 100; 50 50); 
2012-12-04 21:54:40.809 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7611df0> index path: (<NSIndexPath 0x76236e0> 2 indexes [0, 0]); frame = (50 100; 50 50); 
2012-12-04 21:54:40.812 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76235e0> index path: (<NSIndexPath 0x7623700> 2 indexes [0, 1]); frame = (111.8 100; 50 50); 
2012-12-04 21:54:40.812 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76263c0> index path: (<NSIndexPath 0x76263a0> 2 indexes [0, 2]); frame = (173.6 100; 50 50); 
2012-12-04 21:54:40.813 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7623910> index path: (<NSIndexPath 0x7626440> 2 indexes [0, 3]); frame = (235.4 100; 50 50); 
2012-12-04 21:54:40.813 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76239a0> index path: (<NSIndexPath 0x7626460> 2 indexes [0, 4]); frame = (297.2 100; 50 50); 
2012-12-04 21:54:40.813 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7623ff0> index path: (<NSIndexPath 0x7623a40> 2 indexes [0, 5]); frame = (359 100; 50 50); 
2012-12-04 21:54:40.814 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76240a0> index path: (<NSIndexPath 0x7624070> 2 indexes [0, 6]); frame = (420.8 100; 50 50); 
2012-12-04 21:54:40.853 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7624150> index path: (<NSIndexPath 0x7624120> 2 indexes [0, 7]); frame = (482.6 100; 50 50); 
2012-12-04 21:54:40.853 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7624200> index path: (<NSIndexPath 0x76241d0> 2 indexes [0, 8]); frame = (544.4 100; 50 50); 
2012-12-04 21:54:40.853 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76242d0> index path: (<NSIndexPath 0x7623a20> 2 indexes [0, 9]); frame = (606.2 100; 50 50); 
2012-12-04 21:54:40.854 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7624380> index path: (<NSIndexPath 0x7624350> 2 indexes [0, 10]); frame = (668 100; 50 50); 
2012-12-04 21:54:40.854 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7624430> index path: (<NSIndexPath 0x7624400> 2 indexes [0, 11]); frame = (729.8 100; 50 50); 
2012-12-04 21:54:40.854 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76244e0> index path: (<NSIndexPath 0x76244b0> 2 indexes [0, 11]); frame = (50 160; 50 50); 
2012-12-04 21:54:40.855 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x76427e0> index path: (<NSIndexPath 0xe1112f0> 2 indexes [0, 6]); frame = (420.8 100; 50 50); 
2012-12-04 21:54:40.855 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7517f80> index path: (<NSIndexPath 0xe1113a0> 2 indexes [0, 7]); frame = (482.6 100; 50 50); 
2012-12-04 21:54:40.855 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7149030> index path: (<NSIndexPath 0xe111450> 2 indexes [0, 8]); frame = (544.4 100; 50 50); 
2012-12-04 21:54:40.855 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7149210> index path: (<NSIndexPath 0xe111230> 2 indexes [0, 9]); frame = (606.2 100; 50 50); 
2012-12-04 21:54:40.856 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7518220> index path: (<NSIndexPath 0xe111020> 2 indexes [0, 2]); frame = (173.6 100; 50 50); 
2012-12-04 21:54:40.856 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7518510> index path: (<NSIndexPath 0xe1110d0> 2 indexes [0, 3]); frame = (235.4 100; 50 50); 
2012-12-04 21:54:40.856 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7518760> index path: (<NSIndexPath 0xe111180> 2 indexes [0, 4]); frame = (297.2 100; 50 50); 
2012-12-04 21:54:40.856 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7518ac0> index path: (<NSIndexPath 0xe111250> 2 indexes [0, 5]); frame = (359 100; 50 50); 
2012-12-04 21:54:40.857 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7642bf0> index path: (<NSIndexPath 0xe110e00> 2 indexes [0, 0]); frame = (50 100; 50 50); 
2012-12-04 21:54:40.857 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7518d40> index path: (<NSIndexPath 0xe110f80> 2 indexes [0, 1]); frame = (111.8 100; 50 50); 
2012-12-04 21:54:40.857 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0xe111600> index path: (<NSIndexPath 0xe1115d0> 2 indexes [0, 10]); frame = (668 100; 50 50); 
2012-12-04 21:54:40.858 Animations[2079:c07] attributes: <UICollectionViewLayoutAttributes: 0x7642dd0> index path: (<NSIndexPath 0xe111680> 2 indexes [0, 11]); frame = (50 160; 50 50); 
2012-12-04 21:54:41.161 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76240a0> index path: (<NSIndexPath 0x7643bf0> 2 indexes [0, 0]); frame = (50 100; 50 50); 
2012-12-04 21:54:41.162 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7623ff0> index path: (<NSIndexPath 0x7644e90> 2 indexes [0, 1]); frame = (111.8 100; 50 50); 
2012-12-04 21:54:41.162 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76239a0> index path: (<NSIndexPath 0x7645310> 2 indexes [0, 2]); frame = (173.6 100; 50 50); 
2012-12-04 21:54:41.162 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7623910> index path: (<NSIndexPath 0x7642bb0> 2 indexes [0, 3]); frame = (235.4 100; 50 50); 
2012-12-04 21:54:41.163 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76263c0> index path: (<NSIndexPath 0x761ab30> 2 indexes [0, 4]); frame = (297.2 100; 50 50); 
2012-12-04 21:54:41.163 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76235e0> index path: (<NSIndexPath 0x7642170> 2 indexes [0, 5]); frame = (359 100; 50 50); 
2012-12-04 21:54:41.163 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7611df0> index path: (<NSIndexPath 0x7642190> 2 indexes [0, 6]); frame = (420.8 100; 50 50); 
2012-12-04 21:54:41.163 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7642070> index path: (<NSIndexPath 0x7642230> 2 indexes [0, 7]); frame = (482.6 100; 50 50); 
2012-12-04 21:54:41.164 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7642ea0> index path: (<NSIndexPath 0x76422f0> 2 indexes [0, 8]); frame = (544.4 100; 50 50); 
2012-12-04 21:54:41.164 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7645d00> index path: (<NSIndexPath 0x7641d30> 2 indexes [0, 9]); frame = (606.2 100; 50 50); 
2012-12-04 21:54:41.164 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76469b0> index path: (<NSIndexPath 0x7642470> 2 indexes [0, 10]); frame = (668 100; 50 50); 
2012-12-04 21:54:41.164 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7646cb0> index path: (<NSIndexPath 0x7642490> 2 indexes [0, 11]); frame = (729.8 100; 50 50); 
2012-12-04 21:54:41.165 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x76470b0> index path: (<NSIndexPath 0x7646d30> 2 indexes [0, 11]); frame = (50 160; 50 50); 
2012-12-04 21:54:41.165 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7517e40> index path: (<NSIndexPath 0x7517e10> 2 indexes [0, 0]); frame = (50 100; 50 50); 
2012-12-04 21:54:41.165 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7517f00> index path: (<NSIndexPath 0x7517ed0> 2 indexes [0, 1]); frame = (111.8 100; 50 50); 
2012-12-04 21:54:41.166 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7517fb0> index path: (<NSIndexPath 0x7517f80> 2 indexes [0, 2]); frame = (173.6 100; 50 50); 
2012-12-04 21:54:41.166 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518060> index path: (<NSIndexPath 0x7518030> 2 indexes [0, 3]); frame = (235.4 100; 50 50); 
2012-12-04 21:54:41.166 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518110> index path: (<NSIndexPath 0x75180e0> 2 indexes [0, 4]); frame = (297.2 100; 50 50); 
2012-12-04 21:54:41.166 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x75181d0> index path: (<NSIndexPath 0x75181b0> 2 indexes [0, 5]); frame = (359 100; 50 50); 
2012-12-04 21:54:41.167 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518280> index path: (<NSIndexPath 0x7518250> 2 indexes [0, 6]); frame = (420.8 100; 50 50); 
2012-12-04 21:54:41.167 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518330> index path: (<NSIndexPath 0x7518300> 2 indexes [0, 7]); frame = (482.6 100; 50 50); 
2012-12-04 21:54:41.167 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x75183e0> index path: (<NSIndexPath 0x75183b0> 2 indexes [0, 8]); frame = (544.4 100; 50 50); 
2012-12-04 21:54:41.167 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x75184b0> index path: (<NSIndexPath 0x7518190> 2 indexes [0, 9]); frame = (606.2 100; 50 50); 
2012-12-04 21:54:41.168 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518560> index path: (<NSIndexPath 0x7518530> 2 indexes [0, 10]); frame = (668 100; 50 50); 
2012-12-04 21:54:41.168 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x7518610> index path: (<NSIndexPath 0x75185e0> 2 indexes [0, 11]); frame = (729.8 100; 50 50); 
2012-12-04 21:54:41.168 Animations[2079:c07] cellAttributes: <UICollectionViewLayoutAttributes: 0x75186c0> index path: (<NSIndexPath 0x7518690> 2 indexes [0, 11]); frame = (50 160; 50 50); 
4

3 回答 3

2

我的项目中有这个问题,据我所知,这是 UICollectionView 中的一个错误,在contentOffset调用setCollectionViewLayout. 由于您不需要为过渡设置动画,我认为您可以contentOffset在调用setCollectionViewLayout. 我已经在我的项目中对此进行了测试并且它有效。然而,有了animated:YES旗帜后,细胞会以不平稳的运动移动,然后才能停在正确的位置。

对于您的项目,我会尝试这样的事情:

- (IBAction)switchLayout:(id)sender {
    CGPoint originalContentOffset = self.collectionView.contentOffset;
    PinchLayout *pinchLayout = [[PinchLayout alloc] init];
    [self.collectionView setCollectionViewLayout:pinchLayout animated:NO];
    self.collectionView.contentOffset = originalContentOffset;
}
于 2012-12-08T07:04:07.583 回答
0

我已经发布了解决此问题的方法,其中包括此处的动画: Dynamically setting layout on UICollectionView 导致莫名其妙的 contentOffset 变化

于 2012-12-28T20:24:27.663 回答
0

- (void)invalidateLayout在设置新布局之前打电话怎么样..?文档

于 2014-09-03T07:12:17.840 回答