【问题标题】:Size of UICollectionView is sometimes wrongUICollectionView 的大小有时是错误的
【发布时间】:2015-08-27 20:03:07
【问题描述】:

这是我的问题:我正在 iOS (http://forum.kodi.tv/showthread.php?tid=235973) 上开发 Kodi Remote,一切运行良好(经典开发),但我的行为无法解释。

我有多个视图控制器;在其中一个(包含 UICollectionView 的 UIViewController)中,我实现了这个委托方法:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CGSize originalSize = [(UICollectionViewFlowLayout *)collectionViewLayout itemSize];
    CGSize collectionViewSize = [collectionView frame].size;

    CGFloat interItemSpacing = [(UICollectionViewFlowLayout *)collectionViewLayout minimumInteritemSpacing];

    UICollectionViewFlowLayout *collectionViewFlowLayout = (UICollectionViewFlowLayout *)[[self collectionView] collectionViewLayout];
    UIEdgeInsets sectionInset = [collectionViewFlowLayout sectionInset];

    CGFloat usableWidth = (collectionViewSize.width - ((kColumns - 1) * interItemSpacing) - sectionInset.left - sectionInset.right);
    CGFloat width =  usableWidth / kColumns;
    CGFloat height = width * originalSize.height / originalSize.width;

    return CGSizeMake(width, height);
}

我得到了集合视图框架(边界是相同的,当然,我不需要原点)并且效果很好。我在 iPhone 5 模拟器上安装了 288 宽度的任何高度。

但是,在情节提要中视图控制器的复制粘贴中,我得到了 304 宽度。最奇怪的行为是使用 FLEX,在渲染之后,集合视图的尺寸为 288 像素。

“唯一”的区别是第一个视图控制器只是被推送,第二个包含在 UITabBarController 中。

PS:我说的第一个屏幕是第三和第四个屏幕截图。

如果有人对此有解释,我会接受;)

更新 1:

如果我在 - (void)viewDidLayoutSubviews 中使集合视图布局无效,则项目被正确绘制但就像一个闪光,因为整个集合视图被重绘(下面的标题和项目)。

【问题讨论】:

  • 如何定义collectionViewLayout的itemSize?
  • 用上面的方法。我在情节提要中定义了一个大小(100 像素宽,160 像素高)只是为了有一个比例。
  • 尝试使viewWillAppear中的布局无效。
  • 不工作。我已经试过了。我只是找到了一种方法:(我删除了集合视图上的约束边距,并在标题中添加了部分插入和边距。像魅力一样工作。
  • 16pts 将是 2 个布局边距。看起来您发现了这一点,但几乎只需删除您对边距的任何布局。

标签: ios objective-c iphone uicollectionview


【解决方案1】:
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
      return CGSizeMake(self.collectionView.frame.size.width,
                        self.collectionView.frame.size.height);
}

并取消选中“限制到边距”并单击所有带虚线的红色限制 所以 -8 填充将在 iPhone 6+ 中消失

【讨论】:

    【解决方案2】:

    故事板

    当您使用Storyboard 解决问题时,这很有意义。首先,您将清楚地了解您正在设计的内容。其次,您可以用 0 行代码构建您的应用程序,从而导致 0 个错误。

    UITabBarController 和一组UINavigationController 是一种常见的设计模式,只有当您按照以下方式实现它时,您才能获得正确的UI 行为。

    代码

    您不必使用Storyboard 来创建上面的层次结构。您可以以编程方式将每个 UIViewController 嵌入到 UINavigationController 中。


    ► 在GitHub 上查找此解决方案,在Swift Recipes 上查找更多详细信息。

    【讨论】:

    • 这与问题有什么关系?您提供的链接与原始问题没有任何关系。我使用 UINavigationController 检查了您的 UITabBarController 和嵌入式 UIViewController 的架构,但在您的示例中找不到 UICollectionView
    • 查看 Booby69 的评论“每个 UIViewController 必须有一个 UINavigationController 作为父级而不是 UITabBarController。之后,一切正常”
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多