【问题标题】:UICollectionView Frame Wrong With ToolbarUICollectionView 框架与工具栏错误
【发布时间】:2013-07-27 04:39:34
【问题描述】:

我有一个 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 的高度 减去部分插入顶部和底部值。

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

【问题讨论】:

    标签: iphone ios interface-builder uicollectionview uicollectionviewlayout


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以,我认为我解释得不好,但是您的误解导致了解决方案!当我说“强制reloadData”时,我实际上是在谈论调用一个执行reloadData 的方法。但是,根据您所说,我将[self.collectionView reloadData]; 添加到-(void)viewWillAppear 并且现在可以正常工作。非常感谢。
    • 我会的,但截至目前,它产生了一个不同但相关的问题(请参阅我的编辑)
    猜你喜欢
    • 2011-03-04
    • 2011-08-31
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多