代码之家  ›  专栏  ›  技术社区  ›  T .

UITableView“反弹区域”中的浅灰色背景

  •  46
  • T .  · 技术社区  · 15 年前

    Screenshot of Contacts app showing light gray background

    我尝试设置UITableView的背景色,但这也会影响行。有人知道如何达到这个效果吗?我是否必须重写实现drawRect:还是有一种内置方式?

    15 回复  |  直到 10 年前
        1
  •  39
  •   gcamp    13 年前

    设置透明度对性能不利。您需要的是搜索栏上方的灰色区域,但在列表末尾之外,它仍应为白色。

    您可以将子视图添加到视图中 UITableView 而是生活在内容之上。

    CGRect frame = self.list.bounds;
    frame.origin.y = -frame.size.height;
    UIView* grayView = [[UIView alloc] initWithFrame:frame];
    grayView.backgroundColor = [UIColor grayColor];
    [self.listView addSubview:grayView];
    [grayView release];
    

    UISearchBar .

        2
  •  30
  •   Nick Farina    6 年前

    这是我最喜欢的把戏之一。

    UIView *topview = [[[UIView alloc] initWithFrame:CGRectMake(0,-480,320,480)] autorelease];
    topview.backgroundColor = [UIColor colorWithRed:226.0/255.0 green:231.0/255.0 blue:238.0/255.0 alpha:1];
    
    [self.tableView addSubview:topview];
    

    不要担心320x480像素的UIView对内存的影响,它不会消耗任何重要的内存,因为CALayer没有任何有意义的内容。

    注: 当“被接受”的答案如此简单时,为什么这个答案是相关的?为什么不直接设定 backgroundView 在桌面视图上?这是因为,对于原始问题中所示的联系人应用程序,表视图“上方”的区域有一个 不同的

    2018年1月编辑: 正如Tom在评论中指出的那样,这个答案非常古老,并且假设所有iOS设备都有相同的屏幕大小(看起来很疯狂,但2009年我回答这个问题时就是这样)。我在这里介绍的概念仍然有效,但是您应该使用 UIScreen.main.bounds 弄清楚 实际的 屏幕大小,或者你可以进入一些奇特的自动布局的东西(欢迎建议)。我不建议使用 tableView.bounds 正如在另一个答案中,因为通常在 viewDidLoad 视图的大小不一定是控制器调整大小后视图的大小。有时它们以0x0开头!

        3
  •  24
  •   Community Egal    7 年前

    HusseinB's suggestion :

    斯威夫特3

    let bgView = UIView()
    bgView.backgroundColor = UIColor.white
    self.tableView.backgroundView = bgView
    

    目标C

    UIView *bgView = [UIView new];
    bgView.backgroundColor = [UIColor whiteColor];
    [self.tableView setBackgroundView:bgView];
    
        4
  •  23
  •   HusseinB    10 年前

    从iOS 7开始,您可以通过更改tableview背景视图来修补此问题。

    [self.tableView setBackgroundView:view];
    

        5
  •  9
  •   Danny    8 年前

    此代码在中工作 敏捷的 UITableView :

    var frame = self.tableView.bounds
    frame.origin.y = -frame.size.height
    frame.size.height = frame.size.height
    frame.size.width = UIScreen.mainScreen().bounds.size.width
    let blueView = UIView(frame: frame)
    blueView.backgroundColor = UIColor.headerBlueColor()
    self.tableView.addSubview(blueView)
    
        6
  •  7
  •   user3903523 user3903523    9 年前

    在里面 敏捷的

        let backView = UIView(frame: self.tableView.bounds)
        backView.backgroundColor = UIColor.clearColor() // or whatever color
        self.tableView.backgroundView = backView
    
        7
  •  5
  •   Alcivanio    7 年前

    最简单的解决方案

    在表视图的反弹区域的底部和顶部创建不同颜色的最简单方法是设置键 tableHeaderBackgroundColor 表视图的一部分。这样做可以设置顶部颜色。我不确定,但可能有另一个键的页脚,看看。如果找不到任何内容,只需将表视图的背景设置为要在底部显示的颜色即可。在上面,您可以看到一个示例代码:

    self.table.setValue(UIColor.blue , forKey: "tableHeaderBackgroundColor")
    

    希望对你有帮助。如果是,请在回答中让其他人知道放弃的简单方法:)

        8
  •  4
  •   U62    15 年前

    我只找到了一种方法。您必须将UITableView的背景色设置为透明,将单元格contentView的背景色设置为您希望实际单元格的颜色,然后关键的是,您必须使UITableView后面显示浅灰色。最后一步,您可以通过设置UIWindow的背景色,或者设置包含的任何内容或tableViewController的背景色来完成。

    // sets the background of the table to be transparent
    self.tableView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0];
    // assuming we are inside a navigation or tab controller, set the background
    self.parentViewController.view.backgroundColor = [UIColor lightGrayColor];
    

    // set an opaque background for the cells 
    cell.contentView.backgroundColor = [UIColor whiteColor];
    
        9
  •  4
  •   Tom Susel    10 年前

    我自己也遇到了这个问题,并找到了解决办法。

    原因

    我曾经 Spark Inspector 检查表视图的布局-这确实有帮助。

    问题是,在此场景中,UITableView有3个子视图:

    1. UITableViewWrapperView
    2. UIView backgroundColor
    3. UISearchBar

    向下滑动tableview内容时,第二个子视图的高度将动态增加,以填充两个子视图之间的空间 UITableViewWrapperView UITableView 帧原点。

    解决方案

    设定 背景色 backgroundView 您需要做的是找到第二个视图并更改其颜色,如下所示:

    if (_tableView.subviews.count > 1) {
        _tableView.subviews[1].backgroundColor = THE_TARGET_COLOR;
    }
    

    在我的例子中,我需要所有的视图都是白色的,所以我使用了下面的方法,它不太容易在将来更改 UITableView 按Apple查看层次结构:

    for (UIView *subview in _tableView.subviews) {
        subview.backgroundColor = [UIColor whiteColor];
    }
    
        10
  •  3
  •   William Denniss    11 年前


    首先在interface builder中将表格视图的背景色设置为所需的背景色。
    然后响应UITableView委托 tableView:willDisplayCell:ForIndexPath: 方法 这样地

    - (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCelll*)cell forIndexPath:(NSINdexPath*)indexPath
    {
         [cell setBackgroundColor:[UIColor whiteColor]];
    }
    


    另一种方法是:
    ViewDidLoad 方法(或您喜欢的任何地方)设置 tableView 背景色以清除颜色,如下所示:

    self.tableView.backgroundColor = [UIColor clearColor];
    

    然后将superview颜色设置为白色

    self.tableView.superview.backgroundColor = [UIColor whiteColor];
    
        11
  •  1
  •   Simon Woodside    15 年前

    我认为你不想覆盖drawRect。您看到的很可能是另一个视图或窗口的背景色,它位于表视图的“后面”(即超级视图)。苹果的UI小部件中通常有相当复杂的UI视图层。探索GDB中的视图层次结构,查看[myView superview]和[someSuperView子视图],然后尝试在调试器中操纵它们的BG颜色,看看是否可以找到它是哪一种。但是,如果您以这种方式实现修复程序,请注意它可能将来不兼容。

        12
  •  0
  •   Jonah    15 年前

    如果使用的是tableviewcell,则可以将视图背景设置为不透明白色。然后使用

    self.tableView.backgroundColor = [UIColor grayColor];
    

    在视图中没有加载方法。

        13
  •  0
  •   tt.Kilew    15 年前

    我确信这就是[UITableView backgroundColor]。 您已经影响了行,因为行的backgroundColor==透明(或半透明)。 因此,如果您将行设置为非散列,那么一切都将正常工作。 这将是一个解决方案。

        14
  •  0
  •   petert    14 年前

    我遵循Peylow概述的技巧,为了获得UITableView,只需添加一个子视图。我对代码的唯一改变是,我用了一种更接近苹果应用程序中使用的颜色,另外,通过将框架原点y坐标减少一个像素,我使它更接近苹果的外观,即在UISearchbar上方有一条线:

    frame.origin.y = -frame.size.height - 1
    
        15
  •  0
  •   soheilpro    11 年前

    对于任何想知道如何对底部反弹区域执行相同操作的人:

    self.bottomView = [[UIView alloc] initWithFrame:CGRectOffset(self.tableView.frame, 0, self.tableView.frame.size.height)];
    self.bottomView.backgroundColor = whateverColorYouLike;
    
    [self.tableView.backgroundView addSubview:self.bottomView];
    

    然后在表视图的委托中:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGRect frame = self.bottomView.frame;
        frame.origin.y = self.tableView.contentSize.height - self.tableView.contentOffset.y;
        self.bottomView.frame = frame;
    }
    
        16
  •  0
  •   Andrea Leganza    4 年前

    在我的例子中,解决方案是为表格创建一个headerview并指定一种颜色,它解决了我的应用程序在黑暗模式下反弹区域的黑色背景。我对它的TableFooter视图也做了同样的操作。

     table.tableHeaderView = UIView()
     table.tableHeaderView!.backgroundColor = UIColor.white