UICollectionView Bounds Width 始终为 600

Posted

技术标签:

【中文标题】UICollectionView Bounds Width 始终为 600【英文标题】:UICollectionView Bounds Width is always 600 【发布时间】:2016-01-25 16:25:05 【问题描述】:

我有一个自定义UIViewCustomView,它有一个UICollectionView 作为它的子视图。我在 UITableView Prototype Cell 中添加了这个 customView,并用TableViewCell.contentView 将所有四个(顶部、底部、左侧、右侧)边缘固定到标准距离。

现在我想设置UICollectionView 部分昆虫。在这种方法- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 中,当我得到UICollectionView.bounds.width 时,无论我是在4s、5s、6 或6 plus 还是iPad 上运行它,我总是得到600。这很烦人,我无法为UICollectionView 部分昆虫设置正确的insect。任何帮助都会很棒。谢谢

这是我的代码。

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 

  NSInteger number = [self collectionView:collectionView numberOfItemsInSection:section];
  NSIndexPath *firstIndexPath = [NSIndexPath indexPathForItem:0 inSection:section];
  CGSize firstSize = [self collectionView:collectionView layout:collectionViewLayout sizeForItemAtIndexPath:firstIndexPath];
  NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:number - 1 inSection:section];
  CGSize lastSize = [self collectionView:collectionView layout:collectionViewLayout sizeForItemAtIndexPath:lastIndexPath];
  UIEdgeInsets  insect =  UIEdgeInsetsMake(0, (collectionView.bounds.size.width - firstSize.width) / 2,
                                           0, (collectionView.bounds.size.width - lastSize.width) / 2);

  return insect;


这是我的 CustomView 的初始化,其中 collectionView 作为子视图

- (void) initilize 
  UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc ] init];
  flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
  self.collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout: flowLayout];
  self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  [self.collectionView registerClass:[PickerCollectionViewCell class] forCellWithReuseIdentifier:@"PickerCollectionViewCell"];
  self.collectionView.delegate = self;
  self.collectionView.dataSource = self;
  self.collectionView.backgroundColor = [UIColor clearColor];
  self.collectionView.showsHorizontalScrollIndicator = NO;
  self.collectionView.allowsMultipleSelection = YES;
  [self addSubview:self.collectionView ];
  self.backgroundColor = [UIColor clearColor];

附上我的故事板的两张图片。

在第二张图片 pickerView 中是我的 CustomView,其中包含 UICollectionView

任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

宽度等于 600,因为你在 UIView 更新当前屏幕的约束之前取了它。您可以在- (void)viewDidLayoutSubviews 方法中检查 UICollectionView 框架,您将收到实际值。 这里有两个选择: 1) 您可以独立于 UICollectionView 框架进行昆虫计算 或者 2) 您可以在viewDidLayoutSubviews 触发后重新计算集合视图布局并重绘 UICollectionView(我宁愿第一个)

【讨论】:

以上是关于UICollectionView Bounds Width 始终为 600的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 不重用单元格

UICollectionView 无法显示所有内容

UICollectionView - 如何增加要分配的单元格数量

UICollectionView:删除单元格之间的空间(每行 7 个项目)

UICollectionView 的补充视图或装饰视图的 indexpath 是啥?

collectionView代理方法快速设置cell大小上下左右间隔