【问题标题】:UICollectionView inside a container view容器视图中的 UICollectionView
【发布时间】:2016-12-31 04:29:43
【问题描述】:

描述:

我有一个视图控制器,其中包含一个包含 7 个单元格的集合视图。当我显示此控制器时,一切正常并且显示完美(控制器 A)。 在另一个控制器(控制器 B)上,我有一个嵌入控制器 A 和集合视图的容器视图。

问题:

当运行应用程序并进入控制器 B(嵌入控制器 A)时,控制器 A 的所有子视图看起来都不错,除了集合视图。在这种情况下,我没有看到我的 7 个单元格,而是只看到 6 个单元格,在点击其中一个单元格后,最后一个单元格出现在单元格行中,现在看起来不错(?!)。 就像集合视图正在重绘,我找不到原因或如何解决它。

感谢任何帮助。

编辑

这是我的流程布局,我从 viewDidLoad 调用:

-(void) setFlowLayout {
    BOOL isIphone = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad);
    float baseWidth = [[UIScreen mainScreen] bounds].size.width;
    int width;

    width = floor(baseWidth / 7.0);
    float space = baseWidth - (width * 7.0f);
    space /= 7.0;

    UICollectionViewFlowLayout * flow = [[UICollectionViewFlowLayout alloc] init];

    if(isIphone) {
        flow.itemSize = CGSizeMake(width, kCellHeight);
    }
    else{
        flow.itemSize = CGSizeMake(width, kCellSizeIpad);
    }

    flow.minimumInteritemSpacing = space;
    flow.headerReferenceSize = CGSizeMake(_collectionDays.frame.size.width, kSpacing);
    flow.footerReferenceSize = CGSizeZero;
    flow.scrollDirection = UICollectionViewScrollDirectionVertical;

    [_collectionDays setCollectionViewLayout:flow];
}

我也使用它来将单元格放置在集合视图的中间:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    CGFloat cellSpacing = ((UICollectionViewFlowLayout *) collectionViewLayout).minimumInteritemSpacing;
    CGFloat cellWidth = ((UICollectionViewFlowLayout *) collectionViewLayout).itemSize.width;
    NSInteger cellCount = [collectionView numberOfItemsInSection:section];
    CGFloat inset = (collectionView.bounds.size.width - (cellCount * (cellWidth + cellSpacing))) * 0.5;
    inset = MAX(inset, 0.0);

    return UIEdgeInsetsMake(0.0, inset, 0.0, inset);
}

【问题讨论】:

  • 分享你源代码的相关部分
  • 分享一些代码和图片。

标签: ios objective-c uicollectionview uicontainerview redraw


【解决方案1】:

所以到目前为止没有答案,但我找到了解决它的方法。 我一直在尝试解决它,我认为这与容器在绘制时调整大小有关。

我使用从其父视图控制器调用集合视图的 layoutIfNeeded 来修复它,在 viewDidLayoutSubviews 中。

所以如果有人遇到它,这是修复它的一种方法。

希望听到更好的方法\解释。

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [_collectionDays layoutIfNeeded];
    [_collectionDays reloadData];
}

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 2023-03-10
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多