将大于 cellHeight 的子视图添加到 UITableViewCell?
Posted
技术标签:
【中文标题】将大于 cellHeight 的子视图添加到 UITableViewCell?【英文标题】:Adding a subview larger than cellHeight to a UITableViewCell? 【发布时间】:2011-02-20 00:58:44 【问题描述】:我正在尝试向 UITableViewCell 添加一个子视图,而我的设计要求这个特定的子视图(图像)需要大于实际的 UITableViewCell,从而部分重叠其兄弟姐妹。
所以我已经设置了我的表格单元格,生成了我的图像并将其添加到单元格的 contentView 中:
// rowHeight for the UITableView is 45.0f
UIImage *image = [self createCellThumbnail: someImage];
UIImageView *thumbView = [[UIImageView alloc] initWithFrame: CGRectMake(150, -5, 55,55)];
thumbView.transform = CGAffineTransformMakeRotation(0.1f);
thumbView.image = image;
cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;
[cell.contentView addSubview: thumbView];
虽然图像会“溢出”到其下方的单元格中,但图像的顶部总是被剪裁,如下所示:
有谁知道我现在的做法是否可行?
或者我应该想办法在绘制完所有单元格后将这些图像绘制到 UITableView 上(它是一个不可滚动的 tableview,所以它可以工作并且相当容易)。
更新:
也尝试添加以下内容,但无济于事:
cell.opaque = NO;
cell.contentView.opaque = NO;
cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;
cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;
【问题讨论】:
仅供参考,表格视图单元格中的 contentView 是只读属性。 【参考方案1】:我似乎 tableView 从下到上呈现其单元格,因此一个单元格上方的单元格与该一个单元格重叠。为避免这种情况,您必须将所有单元格的 backgroundColor
设置为 +[UIColor clearColor]
,这样您就不会看到这些重叠问题。
但是将backgroundColor
设置为清除-tableView:cellForRowAtIndexPath:
没有任何意义。 UIKit 在绘制之前对单元格做了很多事情,所以它会重置单元格的backgroundColor
属性。
我们需要做的是将backgroundColor
设置为稍后的状态。幸运的是,我们可以像这样实现 -[UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:]
:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
cell.backgroundColor = [UIColor clearColor];
现在我们在绘制单元格之前设置backgroundColor
,结果证明这是有效的。
【讨论】:
这对我有用。有点奇怪的是,当您在创建 UITableViewCell 时明确设置 backgroundColor 时,UIKit 随后会说“当然,但不是今天,我会将其设为不透明颜色。”。 添加了一个对我有用的答案,可能对某人有所帮助 - 可能需要结合这两个答案 更新了我的答案 - 通过更改单元格视图的 z 顺序,我们不需要使用透明单元格... willDisplayCell 成功了。看起来在界面构建器中设置单元格背景是不够的。当它是一个重复使用的单元格时,看起来单元格背景颜色会再次设置,这将覆盖它顶部/后面的单元格。 ios9,使用这种方法成功地在单元格外为 uilabel 设置动画。【参考方案2】:更新:
所以我做了更多的实验,以下解决方案仍然有效,而无需将单元格的背景设置为透明,这涉及移动被覆盖单元格的 z 顺序。这适用于突出显示和选择另一个单元格(通过相关回调),如果两个单元格的背景是不同的颜色。解决方法如下(didHighlight
和didSelect
方法对你来说不重要,你可以忽略它们):
(请注意,“覆盖行”是我们试图使其内容保持可见的行,在我的情况下,它的内容会稍微进入上面的行,它正在剪裁它)
-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
[cell.superview bringSubviewToFront:cell];
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
[cell.superview bringSubviewToFront:cell];
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.section == 0 && indexPath.row == COVERED_ROW)
[cell.superview bringSubviewToFront:cell];
cell.contentView.superview.clipsToBounds = NO;
注意:您还应该将内容的背景颜色设置为清除,否则它将采用单元格其余部分的 bgcolor,因此当您设法将内容带到覆盖单元格的前面时,它将带上背景颜色并在另一个单元格中留下一个令人讨厌的块(在我的情况下,我唯一的内容是detailTextLabel
和textLabel
):
// in cellForRowAtIndexPath:
[cell setBackgroundColor:[UIColor redColor]]; //using red for debug
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.backgroundColor = [UIColor clearColor];
我希望这对尝试这个的其他人有所帮助....
原文:
对我来说,解决方案是使用:
self.contentView.superview.clipsToBounds = NO;
我的单元格已经是透明的,但我的内容仍然被剪切。在我的例子中,我使用了一个自定义单元格,它将其内容向上移动到layoutSubviews
。所以layoutSubviews
我的自定义单元格如下:
-(void)layoutSubviews
[super layoutSubviews];
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, -11);
self.contentView.superview.clipsToBounds = NO;
我不知道如果上面的单元格是不透明的,这是否会起作用,或者如果单元格在按下时会突出显示,这是否会掩盖我的内容。
但是,我没有需要在 viewWillDisplayCell
回调方法中再次使单元格透明 - 在正常的 cellForRowAtIndexPath
中这样做就足够了 p>
【讨论】:
【参考方案3】:我遇到了这个问题,我确保我的自定义 tableviewcell 的主背景检查了剪辑子视图,它解决了这个问题。这是从 xib 加载的自定义 tableview 单元格。不完全相同但类似的情况。
【讨论】:
【参考方案4】:实际上我昨天正好相反,我创建了一个自定义表格单元格,但由于某种原因,我得到了一个我不想有的溢出。我的解决方案是将以下代码添加到我的视图控制器类中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
return 175;
当它与表格单元格的高度匹配时,没有重叠;当它太小时有重叠。请注意,我的行为非常迅速,所以我不确定这样做是否是个好主意。
【讨论】:
这会修改表格单元格的实际高度,在我的例子中,它已经设置为 45.0f(首选高度)。此外,修改它只会将单元格“扩展到底部”,而我的问题存在于单元格的顶部。以上是关于将大于 cellHeight 的子视图添加到 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 addSubview: with autolayout 添加一个尺寸不好的子视图?
将 UIView 添加到已添加到 MainView 的子视图中