UICollectionView框架错误与工具栏

时间:2013-07-27 04:39:35

标签: iphone ios interface-builder uicollectionview uicollectionviewlayout

我有一个UICollectionViewController,它是导航控制器和标签栏控制器的一部分。在导航控制器的开头,我将Interface Builder设置为在视图底部显示工具栏。对于导航控制器的第一个视图控制器,我使用[self.navigationController setToolbarHidden:YES animated:YES];来隐藏工具栏,然后在我的UICollectionViewController中,我使用

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
}

以显示工具栏。这部分工作得很好,我的问题来自于我在UICollectionView中的UICollectionViewCell。我希望它是UICollectionView的完整大小,我正在使用AutoLayout,所以我正在使用:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}

但是,第一次加载视图时,它会返回错误的值。第一次加载视图和CollectionView时,它返回collectionView的大小,包括工具栏的高度,然后导致警告:

  

项目高度必须小于UICollectionView的高度   减去该部分的顶部和底部值。

细胞无法加载。但是,当我在警告后强制[self.collectionView reloadData];时,会为self.collectionView.frame.size返回正确的值并加载单元格。

我对此感到非常沮丧,并且非常感谢任何人都可以提供的任何帮助。

修改 在阅读了Mundi的评论之后,我最终将我的一些代码更改为:

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView reloadData];
}

问题解决了。但是,现在我有一个新的但相关的问题。当我将[self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];(selectedIndexPath从第一个视图控制器推送)添加到viewWillAppear时,我收到有关UICollectionView项大小的相同警告。如果我有这样的代码:

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    [self.collectionView reloadData];
}

我没有得到那个大小的警告,但我的collectionView总是从索引0而不是selectedIndexPath开始。如果我改变了这个顺序:

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView reloadData];
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}

我得到那个大小的警告,并且在我调用一个方法来调用reloadData之前,单元格不会加载。但是,它确实从正确的indexPath开始。

1 个答案:

答案 0 :(得分:1)

这个问题实际上是关于处理视图生命周期。在viewWillAppear中,所有子视图都已经布局,所以也许你太迟了隐藏工具栏。

显示工具栏后调用reloadData的解决方案并不是很糟糕,因为所有这些都会在视图出现之前发生。这是合乎逻辑的 - 几何已经改变,你必须重新计算布局。

尝试尝试使用视图控制器的hidesBottomBarWhenPushed属性。也许这可以解决这个问题,而无需编写任何代码。