ios - 为 UICollectionView 设置新的 collectionViewLayout 给出空白屏幕

标签 ios uicollectionview

我开始尝试自定义 UICollectionView 布局。我的 UIViewController 中有一个 UICollectionView 符合 UICollectionViewDataSource 和 UICollectionViewFlowLayout 协议(protocol)。每个单元格只是一个图像和一个标签。我有一个按钮可以执行此操作:

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

PinchLayout 是直接从 Apple 的示例代码复制的。当调用 switchLayout: 方法时,我的 collectionView 消失了。我不明白为什么。我认为它会动画到新的位置。或者在这种情况下,不执行任何操作,而是为新布局添加手势支持。然后,当我再次按下按钮时,我会看到一个新的布局,其中所有 Collection View 单元格都缩小了其原始大小的版本。这是 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];
}

我看着我的所有 Collection View 单元格都从屏幕移到顶部。不知道他们为什么这样做。

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

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); 

最佳答案

我的项目中遇到了这个问题,据我所知,这是 UICollectionView 中的一个错误,其中 contentOffset 在调用 setCollectionViewLayout 后莫名其妙地发生了变化。由于您不需要为过渡设置动画,因此我认为您可以在调用 setCollectionViewLayout 后立即将 contentOffset 设置回其原始值。我已经在我的项目中对此进行了测试并且有效。然而,使用 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;
}

关于ios - 为 UICollectionView 设置新的 collectionViewLayout 给出空白屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716825/

相关文章:

ios - 核心数据一对多关系在获取新对象后失去关系

ios - 更改 UIView 高度和 subview y 位置 [Swift]

ios - 使用 UICollectionViewController 时如何为 UICollectionView 添加居中的 UIActivityIndi​​cator?

ios - 如何为与设备大小无关的 UICollectionView 单元格绘制网格线?

ios - 无法在@interface或@protocol内声明变量,移动会导致其他地方崩溃

ios - 如何知道 UITableView 是手动(手动)滚动还是以编程方式滚动?

ios - TableView 和 CollectionView 与 Swift 在同一个 ViewController 中

ios - 使用自动调整单元格设置 UICollectionView 后出现异常

ios - 在 UICollectionView 中,顺序会自动更改

iphone - 如何传递 UIscrollview 以供委托(delegate)类使用