以编程方式设置 UICollectionViewController 单元格内的 UIView 子视图的高度?

Posted

技术标签:

【中文标题】以编程方式设置 UICollectionViewController 单元格内的 UIView 子视图的高度?【英文标题】:Programmatically setting the height of a UIView subview inside a cell of a UICollectionViewController? 【发布时间】:2014-03-20 04:21:50 【问题描述】:

在我的单元格的可重用视图中,我有一个 UIView。

那么,我在控制器中有这个方法

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

    // .. set value for CGFloat backgroundHeight

    [cell addSubview:cell.backgroundView];

    CGRect f = cell.backgroundView.frame;
    f.size.height = backgroundHeight;
    cell.backgroundView.frame = f;


但 UIView 的高度与 Layout Rectangle 中指定的高度保持一致。

接下来我应该尝试什么?

【问题讨论】:

你能解决你的问题吗? 【参考方案1】:

您的问题在于您试图使用单元格的backgroundView

首先,您不能将单元格的backgroundView添加subview。您只需将 UIView 分配给它:

cell.backgroundView = yourView;

其次,如果您阅读docs,它会明确指出:

使用此属性为单元格分配自定义背景视图。背景视图位于内容视图的后面,并且它的框架会自动调整以填充单元格的边界。

这意味着,无论您尝试为backgroundView 设置什么frame,它都会自动调整并填充整个单元格。现在,我还没有真正尝试过,但是您可能可以通过子类化来覆盖它。不过,我会在这里提到,但我不确定。

回到你的问题,如果你真的想要一个可以控制的UIView,你需要创建一个UIView,然后将它添加为subview。使用单元格的backgroundView 不是解决方案。

【讨论】:

backgroundView 就是我命名的 UIView 的出口。您是在暗示存在命名冲突吗? 可能会。换个名字试试。 我记得曾经在子类UITableViewCell 中使用textLabel 作为UILabel 的名称,它确实发生了冲突。【参考方案2】:

这似乎没用,你用 UICollectionViewCell's backgroundView 接近的东西。 由文档

backgroundView 提供背景外观的视图。

@property (nonatomic, 保留) UIView *backgroundView;讨论 此属性中的视图(如果有)位于所有 其他内容并自动调整大小以填充整个边界 集合视图。背景视图不随 集合视图的其他内容。集合视图维护一个 对背景视图对象的强引用。

该属性默认为nil,显示背景颜色 集合视图。

backgroundView 只不过是单元格,所以你要做的就是不影响。 似乎直接改变了单元格的高度。

最好的解决方案是完全忽略 backgroundView 属性 一起。相反,使集合视图的背景清晰,并且 实现自己的视图;只是在后面放一个视图 集合视图。

请查看blog,这对您有帮助。

【讨论】:

【参考方案3】:

您可以使用 sizeForItemAtIndexPath 管理布局高度

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    return CGSizeMake(view.frame.size.width, view.frame.size.height);

here  you can manage spacing
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section

    return UIEdgeInsetsMake(5,5,0,5);

【讨论】:

单元格有一个 UIView 子视图。我想管理它的高度。【参考方案4】:

控制 UICollectionViewCells 与 UITableViewCell 相同。您需要做的是创建一个 UICollectionViewCell 子类。这些开始时可能看起来令人困惑,但设置起来非常简单。

第一件事是添加您可能需要的任何其他属性,例如额外的 UIImageViews、UILabels 等。现在,我们需要确保所有对象都被实例化,但只实例化一次,这样会发生在

- (id)initWithFrame:(CGRect)frame

除了实例化向 self.contentView 添加子视图之外,还可以设置任何全局或默认属性,例如字体、颜色等。但您不能设置相对于 self.contentView 的框架,因为在 layoutSubviews 之前 self.contentView 的大小为零.

现在,创建一个方法:

-(void)layoutSubviews

    [super layout subviews];
    ...

    [self.backgroundView setFrame: myFrame]; // in this case

[super layoutSubviews] 对通过委托单元格布局方法设置 self.contentView 的框架很重要。每当单元格进入视野或以任何方式发生变化时(通常如此),都会调用此方法。你现在需要做的是根据self.contentView.frame或者self.frame来设置事物的各种框架。此外,您可以设置任何条件属性,例如根据状态隐藏图标等。

要回答这个问题,您不需要添加 self.backgroundView,因为它已经存在。你需要做的是在 layoutSubviews 中设置框架,但你需要一个 UICollectionViewCell 子类才能做到这一点。

要使用自定义单元格,您只需包含新的 .h 文件并将 UICollectionViewCell 替换为您的新类名

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

类似的方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    cell.backgroundColor = [UIColor redColor];
    return cell;

【讨论】:

【参考方案5】:

像下面那样做,因为你不能只修改框架中的高度,你必须使用 CGRectMake 函数定义新框架,之后你还需要更改单元格高度,否则你的视图将只显示在那个部分.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    // .. set value for CGFloat backgroundHeight
    [cell addSubview:cell.backgroundView];
    CGRect frame = CGRectMake(cell.backgroundView.frame.origin.x, cell.backgroundView.frame.origin.y, cell.backgroundView.frame.size.width, backgroundHeight);
    cell.backgroundView.frame = frame;

【讨论】:

以上是关于以编程方式设置 UICollectionViewController 单元格内的 UIView 子视图的高度?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式打开 Android 设置

如何以编程方式设置 UITableView 的高度

为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?

以编程方式设置 UITabBar 标题

无法以编程方式将样式设置为 LinearLayout

如何以编程方式设置scrollview高度