我有一个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开始。
答案 0 :(得分:1)
这个问题实际上是关于处理视图生命周期。在viewWillAppear
中,所有子视图都已经布局,所以也许你太迟了隐藏工具栏。
显示工具栏后调用reloadData
的解决方案并不是很糟糕,因为所有这些都会在视图出现之前发生。这是合乎逻辑的 - 几何已经改变,你必须重新计算布局。
尝试尝试使用视图控制器的hidesBottomBarWhenPushed
属性。也许这可以解决这个问题,而无需编写任何代码。