UITableViewCellSeparatorStyleNone 在 UITableView 中选择时不隐藏蓝色分隔线
Posted
技术标签:
【中文标题】UITableViewCellSeparatorStyleNone 在 UITableView 中选择时不隐藏蓝色分隔线【英文标题】:UITableViewCellSeparatorStyleNone does not hide blue separator line when selecting in UITableView 【发布时间】:2010-05-10 02:18:38 【问题描述】:在描述问题之前,让我先指出这是与this question 不同的问题。
问题
This screenshot 在 tableView:didSelectRowAtIndexPath: 处设置了一个中断,正如您在模拟器中看到的(图像的最右侧),在所选单元格的底部有一条单像素蓝线。这不是客户要求的设计,也不是这个应用程序过去的行为方式:不应该有分隔符,即使在选择时也是如此。
我是怎么到这里的 我最初使用带有相应 nib (.xib) 文件的自定义 UITableViewCell 类设计了这个表格视图,并且选择没有问题:分隔符根据需要隐藏。可以预见的是,由于视图层次结构的所有开销,滚动很慢,所以我重新设计了自定义单元格以使用 Loren Brichter 的fast scrolling solution。现在滚动速度要快得多,但我终生无法摆脱分隔符。
我的尝试
在上面截图的时候……
表格视图在 IB 中有“分隔符 [无]”。 包含表格视图的 UIViewController 在 viewDid Load 中有这一行:self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
正如您在屏幕截图中看到的,我插入了一些未使用的行来证明 separatorStyle 已按需要设置。其他测试确认 tableView 和 self.tableView 是同一断点处的等效指针。
我还尝试将 tableView.separatorColor 设置为黑色并清除,所有结果都相同:在进行选择之前,单元格看起来是正确的。
Manjunath:这是我用来根据单元格是否被触摸来绘制交替背景的代码。您可以在屏幕截图中看到差异(动画时不那么细微)。
if(self.highlighted)
textColor = [UIColor blackColor];
UIImage *bg = [UIImage imageNamed:@"image-cell-background_highlighted.png"];
[bg drawAtPoint:CGPointMake(0.0, 1.0)];
else
UIImage *bg = [UIImage imageNamed:@"image-cell-background.png"];
[bg drawAtPoint:CGPointMake(0.0, 0.0)];
这在 UIImageCell.m 中的 drawContentView:
中被调用,该方法继承自 Brichter 先生的 ABTableViewCell 超类。
【问题讨论】:
【参考方案1】:克里斯,
钻研 ABTableViewCell,我明白了:
- (void)setFrame:(CGRect)f
[super setFrame:f];
CGRect b = [self bounds];
b.size.height -= 1; // leave room for the seperator line
[contentView setFrame:b];
由于单元格的高度比实际单元格短 1 个像素,因此当单元格被选中时,该 1 像素线将渗入选择颜色的颜色。看起来像是分隔符,但实际上是选择颜色。
要进行测试,请尝试将上面的那条线更改为两个像素或更短,看看会发生什么。
更新:
通过对 FastScrollingExample 项目的 -rootViewController
进行此更改:
- (void)viewDidLoad
self.title = @"Fast Scrolling Example";
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[super viewDidLoad];
并注释掉:
// if(self.selected)
//
// backgroundColor = [UIColor clearColor];
// textColor = [UIColor whiteColor];
//
//
在-drawContentView
中模拟如果你没有显示选择颜色会发生什么,然后我得到一个这样的屏幕截图:
alt text http://files.me.com/mahboud/7k656q
看起来很眼熟?
您将如何解决这个问题?如果您不需要选择单元格,则禁用单元格选择。否则,如果您正在选择单元格,那么您应该使矩形更大,这样当您在-drawConentRect
中使用自己的选择颜色进行绘制时,默认选择颜色不会显示出来。
【讨论】:
啊,谢谢,Mahboud!我一直在寻找我或 Apple 的原因,但它在 ABTableViewCell 中。注释掉这一行就成功了!// b.size.height -= 1; // leave room for the seperator line
【参考方案2】:
试试这个: [单元格 setSelectionStyle:UITableViewCellSelectionStyleNone];
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = NSLocalizedString(@"Cell",@"");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (nil == cell)
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
【讨论】:
UITableViewCellSelectionStyleNone 有副作用,所以我的绘图代码中的 if 语句永远不会评估为 YES。 (请参阅上面的附加代码块。)虽然我更喜欢此处未篡改的图形,但您的解决方案至少提供了 UITableViewCellSelectionStyleGray 形式的不那么突兀的选择覆盖。谢谢,Manjunath!以上是关于UITableViewCellSeparatorStyleNone 在 UITableView 中选择时不隐藏蓝色分隔线的主要内容,如果未能解决你的问题,请参考以下文章