在我的单元格的可重用视图中,我有一个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中指定的高度相同。
我接下来应该尝试什么?
答案 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;
}