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

时间:2014-03-20 04:21:51

标签: ios uiview subview uicollectionviewcell

在我的单元格的可重用视图中,我有一个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中指定的高度相同。

我接下来应该尝试什么?

5 个答案:

答案 0 :(得分:4)

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

首先,您不能添加单元格backgroundView作为subview。您只需使用以下内容为UIView分配:

cell.backgroundView = yourView;

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

  

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

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

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

答案 1 :(得分:2)

这似乎毫无用处,你用UICollectionViewCell's backgroundView接近了什么。 通过Doc

  

backgroundView提供背景外观的视图。

     

@property(非原子,保留)UIView * backgroundView;讨论   此属性中的视图(如果有)位于所有的下方   其他内容和大小自动填充整个范围   集合视图。背景视图不会滚动   集合视图的其他内容。集合视图维护一个   强烈引用背景视图对象。

     

默认情况下,此属性为nil,显示背景颜色   集合视图。

backgroundView只是单元格,所以你要做的就是不起作用。似乎直接改变了Cell的高度。

  

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

请检查此blog,这对您有所帮助。

答案 2 :(得分:1)

  

您可以使用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);
}

答案 3 :(得分:1)

控制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;
}

答案 4 :(得分:1)

如下所示,因为你不能仅修改框架中的高度,你必须使用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;
}