以编程方式设置 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 子视图的高度?的主要内容,如果未能解决你的问题,请参考以下文章