移除分组UITableViewCell中重新排序控件旁边的白线

7
我为我的表格构建了一个自定义UI,具有较暗的UI和自定义的accessoryView。当我将表格放入编辑模式时,似乎无法摆脱重排控件左侧的白线。
使用tableView:accessoryTypeForRowWithIndexPath:不适合消除它,因为我没有使用标准的UITableViewCellAccessoryType,所以我不确定我能做什么来使它不显示在我的单元格上。 White Line Example
(来源:secondgearsoftware.com)
5个回答

12

UITableViewCell 显示重排控件时,会将一个空的、宽度为1像素的白色 UIView 添加到其子视图数组中。

简单来说:这是一个苹果应该修复的 bug。

但是,您可以通过每次出现时查找该令人恼火的视图并将其背景颜色设置为透明来解决它。小提示:令人恼火的白色视图始终是 UITableViewCell 子视图数组中的最后一个,而且宽度始终为 1 像素。我们将利用这一点来找到它。

当您为表格打开编辑模式时,请将所有可见的令人恼火的 1 像素视图设置为透明。因此,切换表格“编辑”模式的操作方法可能如下所示:

- (IBAction)edit:(id)sender
{
    [tableView setEditing:!tableView.editing animated:YES];

    for (UITableViewCell *cell in [tableView visibleCells])
    {
        if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0)
        {
            ((UIView *)[cell.subviews lastObject]).backgroundColor =
                [UIColor clearColor];
        }
    }
}

并在所有新视图变为可见时继续执行此操作,通过在您的UITableViewDelegate中实现此操作:

- (void)tableView:(UITableView *)tableView
    willDisplayCell:(UITableViewCell *)cell]
    forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0)
    {
        ((UIView *)[cell.subviews lastObject]).backgroundColor =
             [UIColor clearColor];
    }
}

这个修复问题的Hack相当无害,如果苹果在将来修复了这个错误(停止添加令人厌烦的1像素视图),这段代码应该会悄悄地停止工作。


这真的很有效。谢谢Matt。我同意,这并不是可取的行为,所以我会向苹果公司报告一个bug。 - Justin Williams
尝试在Xcode 3.2.4和iOS SDK 4.1中执行此操作时,该对象是倒数第二个元素,而不是最后一个。这并没有起作用。 - chrish

2

在尝试了@matt-gallagher和@bryce的解决方案之后,我将两者结合起来,并创建了setEditing的一个覆盖。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    [super setEditing:editing animated:animated];

    for (UIControl *control in self.subviews) {
        if (control.frame.size.width == 1.0f) {
            control.backgroundColor = [UIColor clearColor];
        }                
    }
}

2

这里没有快速的答案,但你能确定哪个具体的视图导致了这条白线吗?

我有时候使用的一个技巧是“调试”这种问题的方法是改变可能出现问题的视图的背景颜色。我可能会将TableViewCell和它的contentView的背景颜色设置为红色或蓝色,然后看看是否可以改变线条的颜色。这至少会给你一些关于问题性质的线索,也许会提供一些解决问题的想法。


1

实际上,您可以在单元格转换为编辑状态时捕获视图并对其进行修改。将此方法覆盖添加(并自定义)到您的自定义UITableViewCell中。

- (void)didTransitionToState:(UITableViewCellStateMask)state
{
//modified from comments here:
//http://www.erasetotheleft.com/post/overriding-the-drag-reorder-control-in-uitableviewcell/

 if(state == UITableViewCellStateEditingMask)
 {
  for (UIControl *control in self.subviews)
  {
   // Find the Reorder Control
   if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellReorderControl")] && [control.subviews count] > 0)
   {
    // Do something with the control
   }
  }
 }
}

谢谢!我一直在寻找这个重新排序控件。 - Dimitris
在尝试使用Xcode 3.2.4和iOS SDK 4.1时,该行仍然会在第一次显示。之后它就会隐藏。 - chrish

0

我曾经遇到过类似的问题,但是发生在UITableViewStylePlain上。

感谢@chrish和@matt-gallagher提供的解决方案:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    for (UIView *control in cell.subviews) 
    {
        if (control.frame.size.width == 1.0f) 
        {
            control.backgroundColor = [UIColor clearColor];
        }                
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接