UITableViewCell 选择区域 - 如何填充分组 UITableView 部分的顶部/底部单元格的整个单元格?
Posted
技术标签:
【中文标题】UITableViewCell 选择区域 - 如何填充分组 UITableView 部分的顶部/底部单元格的整个单元格?【英文标题】:UITableViewCell Selection Area - How to fill entire cell for top/bottom cells of a Grouped UITableView section? 【发布时间】:2012-04-21 01:51:28 【问题描述】:我有一个分组样式的 UITableView。在 tableView 中,我将行排列成部分,因为这些部分具有可变数量的行。但是,我选择将所有部分放在一起(出于 UI 原因),这样它们看起来就像一个包含多个(可扩展)行的大部分。
我遇到的问题是我希望每个部分的顶行和底行的选择区域填充整个单元格 - 换句话说,不要有圆角。
我知道一个普通的表格视图可以完全选择单元格,但是我不能从一个分组的表格视图更改为一个普通的表格视图,因为这会产生其他不需要的后果。
如果单元格的 selectedBackground 还没有圆角,我知道如何将其遮盖为圆角,但我无法找到一种方法来“取消”部分顶部和底部单元格的角.我为每个部分的底部行创建了虚拟行,这似乎很有效,尽管它很乏味;但我不能为顶行做一个虚拟行,因为它使分隔线太粗。
是否可以在分组的 UITableView 中“取消环绕”顶部/底部部分行的选择区域?
编辑添加答案: 以下代码适用于我的自定义背景视图:
cell.selectedBackgroundView.bounds = cell.bounds;
无论每个部分的顶部或底部单元格的“形状”如何,由自定义背景视图确定,选择样式与使用上述代码的“形状”相匹配。这并不一定会消除圆角本身,但如果我将部分中的顶部或底部单元格设置为“中间样式”单元格背景视图(无角),则确实会根据需要选择整个单元格。
【问题讨论】:
【参考方案1】:将 QuartzCore 框架导入您的项目。 #import 到您的 tableViewController 并使用以下代码...
>>>已编辑..
myTableView.layer.cornerRadius=0.0;
//或使用你的tableView:cellForRowAtIndexPath:
cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];
Square corner tableview
Sample code and tutorial for Square corner in grouped tableview
希望对你有所帮助...
【讨论】:
感谢您的回答,但这并没有改变任何选择。不过感谢答案。 我尝试了您编辑的答案,但这并没有改变单元格的 selectedBackground 区域。另外,我查看了链接,似乎他正在添加圆角而不是删除它们;我可以用蒙版去除圆角,但不知道如何将缺失的角重新添加进去。 谢谢,我尝试了新代码。不幸的是,我正在使用自定义视图单元 cell.backgroundView 并使用它只是覆盖它。我尝试设置 cell.selectedBackgroundView ,而完成的是将所选视图设置为实际的单元格背景视图(即它没有将颜色更改为蓝色,仅更改了选定的文本颜色)。再次感谢您在这方面与我合作。【参考方案2】:可能有点晚了,但这是我所做的:
首先根据需要设置单元格的背景视图,然后设置单元格的选定背景视图(与单元格背景的边界相同)
你可以指定cornerRadius
属性,这样你就可以根据需要设置圆角,我在我的例子中省略了这个属性
这是两者的代码:
UIView *bg = [[UIView alloc] initWithFrame:cell.bounds];
bg.backgroundColor = [UIColor colorWithRed:0.980 green:0.988 blue:0.984 alpha:1];
bg.layer.borderColor = [UIColor colorWithRed:0.827 green:0.827 blue:0.835 alpha:1].CGColor;
bg.layer.borderWidth = kCellBorderWidth;
// bg.layer.cornerRadius= kCellBorderRadius;
cell.backgroundView = bg;
// to make cell selection square and not round (which is by default)
UIView *bg_selected = [[UIView alloc] initWithFrame:cell.bounds];
bg_selected.backgroundColor = [UIColor lightGrayColor];
bg_selected.layer.borderColor = [UIColor colorWithRed:0.827 green:0.827 blue:0.835 alpha:1].CGColor;
bg_selected.layer.borderWidth = kCellBorderWidth;
cell.selectedBackgroundView = bg_selected;
【讨论】:
【参考方案3】:您也许可以创建一个自定义 UITableViewCell,将其设置为不剪切子视图,并覆盖单元格的“setSelected:animated”方法以显示您自己的选择区域。这是我唯一能想到的。为什么不能使用普通的 UITableView?
【讨论】:
@Michael_Frederick 我有几个原因不能使用普通的 tableview,但我现在能想到的主要原因是分隔线超出了分组 tableview 的区域,并且要摆脱它们,我需要将 separatorStyle 设置为 none,实际上我需要一个分隔符样式。我知道我可以使用自定义绘制的 selectedBackgroundView - 我正在使用自定义绘制的 selectedBackground - 但就性能和尝试保持标准选择样式而言,我希望尽可能填充整个单元格。以上是关于UITableViewCell 选择区域 - 如何填充分组 UITableView 部分的顶部/底部单元格的整个单元格?的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell didSelectRowAt:按下单元格中的 UIButton 区域时未调用
将 UIPickerView 选择设置为 UITableViewCell 内的 UITextField
iOS 增加 UITableViewCell 中 UIButton 的触控区域