我有一个 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 开始。