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 在 vi​​ewDid 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 中选择时不隐藏蓝色分隔线的主要内容,如果未能解决你的问题,请参考以下文章