更改从xib加载的UITableViewHeaderFooterView上的背景颜色表示使用contentView.backgroundColor代替

时间:2014-08-04 22:44:12

标签: ios objective-c uitableview uiview

creating a UITableViewHeaderFooterView from a xib file,几乎一切都正常。

现在的问题是,当我尝试更改背景颜色时(或者如果我在xib中配置了一个颜色),它会不断地将此消息输出到控制台:

  

不推荐在UITableViewHeaderFooterView上设置背景颜色。请改用contentView.backgroundColor。

这意味着我有两个问题:

  • 如果我不想看到那个警告,我必须摆脱xib文件中的背景颜色。(这是不可取的,因为这意味着我的xib不再反映视图在运行时的样子)。
  • 当我尝试通过代码更改背景颜色时,我得到了contentView.backgroundColor建议,但是当我尝试遵循该建议时,没有任何反应。 (这是因为contentViewnil。)

注意:此处有一个similar question,但这主要涉及将消息静音,而不是找到解决上述两个问题的替代解决方案。

更新:为了清楚起见,我想继续使用xib文件作为标题视图,并希望能够调用dequeueReusableHeaderFooterViewWithIdentifier:以便表格可以高效管理意见。

7 个答案:

答案 0 :(得分:18)

以下是我发现解决此问题的最佳方法:

  1. UITableViewHeaderFooterView的背景颜色重置为默认
  2. 直接在UITableViewHeaderFooterView的实例下添加一个视图,并将其命名为内容视图。 (这正是Apple对UITableViewCell所做的,我们只是模仿这种结构。)
  3. 您现在可以将内容视图的背景颜色更改为xib文件中的任何内容。
  4. 放置任何其他观看次数inside Content View
  5. 在扩展方法中重新定义contentView属性,并将IBOutlet添加到其定义中。 (见下面的代码。)
  6. 将属性与您创建的内容视图相关联,就像使用任何IBOutlet一样。
  7. 您现在可以在代码中使用contentView.backgroundColor更改背景颜色,就像错误消息所示。
  8. .h文件:

    @interface ABCHeaderView : UITableViewHeaderFooterView
    @end
    

    .m文件:

    @interface ABCHeaderView ()
    
    @property (nonatomic, readwrite, retain) IBOutlet UIView *contentView;
    
    @end
    
    @implementation ABCHeaderView
    
    @synthesize contentView;
    
    @end
    

    此层次结构与Apple's documentation

    一致
      

    如果要显示自定义内容,请创建内容的子视图,并将其添加到contentView属性中的视图。

答案 1 :(得分:9)

要消除警告,您不能设置背景颜色。问题是当您以这种方式创建TableHeader时,IB不会为此提供特殊对象。 删除源代码中的背景颜色将极好地解决所描述的问题,只需点击一下即可。

  1. 在Xcode中找到标题.xib
  2. 右键单击 - 打开为 - >源代码
  3. 查找颜色键:Cmd-F - “高建群”
  4. 删除它。在我的情况下,这是线: <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  5. 现在您可以更改背景,如:

    override func awakeFromNib() {
    
        backgroundView = UIView()
        backgroundView?.backgroundColor = UIColor.whiteColor()
    }
    

答案 2 :(得分:2)

这对我有用:

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
    {

        UITableViewHeaderFooterView *headerView=(UITableViewHeaderFooterView *)view;
        [headerView.backgroundView setBackgroundColor:[[UIColor blackColor]colorWithAlphaComponent:0.4]];
    }

答案 3 :(得分:2)

  

在UITableViewHeaderFooterView上设置背景颜色   弃用。请改用contentView.backgroundColor。

如果您在单独的xib文件中设计标题并在其中设置主UIView的背景,则会发生这种情况。

要解决这个问题,请将UIView背景颜色恢复为InterfaceBuilder中的默认颜色,并在viewForHeaderInSection:section方法中设置背景颜色。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderXibFileName") as! CustomHeader
    header.contentView.backgroundColor = UIColor.blueColor
}

如您所见,我们使用的是header.contentView.backgroundColor而不是header.backgroundColor(这是xib文件实际执行的操作)。

答案 4 :(得分:0)

尝试下面的扩展代码,

extension UITableViewHeaderFooterView {
    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundView?.backgroundColor ?? UIColor.clear
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

并分配如下背景颜色,

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   guard let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderView") as? CustomHeaderView else {
      return UITableViewHeaderFooterView()
   }

   headerView.backgroundColor = .orange

   return headerView
}

答案 5 :(得分:-1)

在willAppear委托回调中设置contentView.backgroundColor:

- (void)tableView:(UITableView *)tableView
willDisplayHeaderView:(UIView *)view
       forSection:(NSInteger)section

- (void)tableView:(UITableView *)tableView
willDisplayFooterView:(UIView *)view
       forSection:(NSInteger)section

答案 6 :(得分:-1)

如何使用代码创建自定义标头并放置它?

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section {

      UIView * myHeader = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 320, 40)];
      [myHeader setBackgroundColor:[UIColor grayColor]];

      UILabel * TitleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10, 5, 320, 20)];
      TitleLabel.text = @"My Title";

      [myHeader addSubview:TitleLabel];


      return myHeader;
}