UICollectionView的大小有时是错误的

时间:2015-08-27 20:03:08

标签: ios objective-c iphone uicollectionview

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

我有多个视图控制器;在其中一个(包含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:我正在谈论的第一个屏幕是第3个&第4个截图。

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

更新1:

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

2 个答案:

答案 0 :(得分: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 +中消失

enter image description here

答案 1 :(得分:0)

故事板

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

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

Storyboard with 1 Nav controller per tab

代码

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

►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。