删除分组UITableViewCell上的重新排序控件旁边的白线

时间:2009-05-17 13:09:31

标签: iphone cocoa-touch uitableview

我为我的桌子构建了一个自定义UI,它有一个更暗的UI和一个自定义的accessoryView。当我将表格置于编辑模式时,重新排序控件左侧有一条白线,我似乎无法摆脱它。

tableView:accessoryTypeForRowWithIndexPath:似乎不适合摆脱它,因为我没有使用标准的UITableViewCellAccessoryType,所以我不知道我能做些什么才能得到它不要出现在我的细胞上

White Line Example
(来源:secondgearsoftware.com

5 个答案:

答案 0 :(得分:12)

当UITableViewCell显示重新排序控件时,它还会在其子视图数组中添加一个空的,1像素宽的白色UIView。

直言不讳:这是Apple应该修复的错误。

但是,您可以通过每次出现时查看恼人的视图并将其背景颜色设置为透明来解决问题。 快速提示:恼人的白色视图始终是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];
    }
}

修复这个问题的黑客是相当无害的,如果Apple将来修复这个bug(停止添加烦人的1像素视图),这段代码应该悄然停止做任何事情。

答案 1 :(得分:2)

这里没有快速回答,但你能确定哪一个具体的View负责这条白线吗?

我有时用来“调试”这类问题的一个技巧是改变可能是嫌疑人的视图的背景颜色。我可能会将TableViewCell的背景颜色及其contentView设置为红色或蓝色,看看是否可以更改线条的颜色。这至少可以为您提供有关问题性质的线索,也许还有一些关于如何解决问题的想法。

答案 2 :(得分: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];
        }                
    }
}

答案 3 :(得分: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
   }
  }
 }
}

答案 4 :(得分: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];
        }                
    }
}