2

我有一个 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 的大小,包括 Toolbar 的高度,这会导致警告:

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

并且单元格不加载。但是,当我在警告后强制 a 时[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 开始。

4

1 回答 1

1

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

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

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

于 2013-07-27T07:57:53.677 回答