我有一个 UICollectionViewController,它是导航 Controller 和标签栏 Controller 的一部分。在导航 Controller 的开头,我将 Interface Builder 设置为在 View 底部显示工具栏。对于导航 Controller 的第一个 View Controller ,我使用 [self.navigationController setToolbarHidden:YES animated:YES]; 来隐藏工具栏,然后在我的 UICollectionViewController 中使用
-(void)viewWillAppearBOOL)animated
{
[self.navigationController setToolbarHidden:NO animated:YES];
}
为了显示工具栏。这部分工作得很好,我的问题来 self 在 UICollectionView 中的 UICollectionViewCell。我希望它是 UICollectionView 的全尺寸,并且我正在使用 AutoLayout,所以我正在使用:
-(CGSize)collectionViewUICollectionView *)collectionView layoutUICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPathNSIndexPath *)indexPath {
return self.collectionView.frame.size;
}
但是,第一次加载 View 时,它返回了错误的值。第一次加载 View 和 CollectionView 时,返回 collectionView 的大小,包括 Toolbar 的高度,这会导致警告:
the item height must be less that the height of the UICollectionView
minus the section insets top and bottom values.
并且单元格没有加载。但是,当我在警告后强制执行 [self.collectionView reloadData]; 时,会为 self.collectionView.frame.size 返回正确的值并加载单元格。
对此我感到非常沮丧,并且非常感谢任何人可以提供的任何帮助。
编辑:
在阅读了 Mundi 的评论后,我最终将我的一些代码更改为:
-(void)viewWillAppearBOOL)animated
{
[self.navigationController setToolbarHidden:NO animated:YES];
[self.collectionView reloadData];
}
问题就解决了。但是,现在我有一个新的但相关的问题。当我添加 [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; (selectedIndexPath 是从第一个 View Controller 推送)到 viewWillAppear 时,我收到相同的警告关于 UICollectionView 项目的大小。如果我有这样的代码:
-(void)viewWillAppearBOOL)animated
{
[self.navigationController setToolbarHidden:NO animated:YES];
[self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
[self.collectionView reloadData];
}
我没有收到那个大小警告,但我的 collectionView 总是从索引 0 开始,而不是 selectedIndexPath 。如果我将顺序更改为:
-(void)viewWillAppearBOOL)animated
{
[self.navigationController setToolbarHidden:NO animated:YES];
[self.collectionView reloadData];
[self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}
我收到了那个大小警告,直到我调用一个方法来调用 reloadData,单元格才会加载。但是,它确实从正确的 indexPath 开始。
Best Answer-推荐答案 strong>
这个问题实际上是关于处理 View 生命周期。在 viewWillAppear 中,所有的 subview 都已经布置好了,所以也许你隐藏工具栏太晚了。
您在显示工具栏后调用 reloadData 的解决方案并没有那么糟糕,因为所有这些都发生在 View 出现之前。这是合乎逻辑的 - 几何形状已更改,您必须重新计算布局。
尝试使用 View Controller 的 hidesBottomBarWhenPushed 属性。也许这可以解决这个问题而无需编写任何代码。
关于iphone - UICollectionView 框架与工具栏错误,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/17894301/
|