OGeek|极客世界-中国程序员成长平台

标题: iphone - UICollectionView 框架与工具栏错误 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 12:56
标题: iphone - UICollectionView 框架与工具栏错误

我有一个 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:UICollectionViewScrollPositionCenteredHorizo​​ntally 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-推荐答案


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

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

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

关于iphone - UICollectionView 框架与工具栏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894301/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4