• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iphone - UICollectionView 框架与工具栏错误

[复制链接]
菜鸟教程小白 发表于 2022-12-12 12:56:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap