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

问题描述 投票:7回答:5

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

tableView:accessoryTypeForRowWithIndexPath:似乎不适合摆脱它,因为我没有使用标准的UITableViewCellAccessoryType,所以我不知道我能做些什么来让它不显示在我的单元格上。

White Line Example (来源:secondgearsoftware.com

iphone cocoa-touch uitableview
5个回答
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像素视图),这段代码应该悄悄地停止做任何事情。


2
投票

这里没有快速回答,但您能否确定具体的View对此白线负责?

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


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];
        }                
    }
}

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
   }
  }
 }
}

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];
        }                
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.