为UICollectionView设置一个新的collectionViewLayout给出空白屏幕 [英] Setting a new collectionViewLayout for UICollectionView giving blank screen

查看:78
本文介绍了为UICollectionView设置一个新的collectionViewLayout给出空白屏幕的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm starting to experiment with custom UICollectionView layouts. I have a UICollectionView in my UIViewController that conforms to the UICollectionViewDataSource and UICollectionViewFlowLayout protocols. Each cell is just an image and a label. I have a button that does this:

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

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

The PinchLayout is copied straight from Apple's sample code. When the switchLayout: method is called, my collectionView disappears. I don't understand why. I thought it would animate to the new positions. Or in this case, not do anything but add gesture support for the new layout. Then when I hit the button again, I see a new layout where all my collection view cells are shrunken down versions of their original size. Here's the 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];
}

有什么想法吗?谢谢!

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

If I change the action method to

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

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

I watch as all my collection view cells go off the screen to the top. Not sure why they do that.

编辑2:我记录了属性和cellAttributes,看起来框架总是在屏幕的边界,所以我仍然不知道为什么细胞会从屏幕上移到顶部。这是日志:

Edit 2: I logged the attributes and cellAttributes and it looks like the frames are always in the bounds of the screen so I'm still not sure why the cells go off screen to the top. Here's the log:

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 设置回原始值C $ C>。我在我的项目中对此进行了测试,但它确实有效。然而,使用动画:YES 标记,单元格会以不稳定的动作移动,然后才能在正确的位置休息。

I have this problem in my project and, as far as I can tell, it is a bug in UICollectionView where the contentOffset inexplicably changes after a call to setCollectionViewLayout. Since you don't need to animate the transition, I think you can simply set the contentOffset back to its original value immediately after calling setCollectionViewLayout. I've tested this in my project and it worked. With the animated:YES flag, however, the cells move in a jerky motion before coming to rest in the correct position.

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

For your project, I would try something like this:

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

这篇关于为UICollectionView设置一个新的collectionViewLayout给出空白屏幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆