自定义 UIView 在 iOS 开发中是比较常用的。在这篇文章中,将介绍如何通过 XIB 自定义 UITableViewHeaderFooterView。UITableViewHeaderFooterView 是用来定义 UITableView 的 header 或 footer 的。创建一个继承自 UITableViewHeaderFooterView 的子类的时候,Xcode 是不会自动创建一个 XIB 文件的。这个情况跟自定义 UIView 是一样的。所以,我们也就可以通过单独创建一个 XIB 文件来实现我们的目的了。

下面我们将以 CustomSectionView 为例,描述如何通过 XIB 实现自定义 UITableViewHeaderFooterView 的过程。

步骤

  1. 分别创建一个继承于 UITableViewHeaderFooterView 的类以及一个 XIB 文件(应该同名);

  2. 选中 XIB 文件后,继续选中 View,把 Class 改为 CustomSectionView

  3. 在 UITableView 的代理对象(一般是 ViewController)中注册 XIB 文件,并在实现其当中的代理方法;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    - (void)viewDidLoad {
    [super viewDidLoad];

    [self.homeTableView registerNib:[UINib nibWithNibName:@"CustomSectionView" bundle:nil]forHeaderFooterViewReuseIdentifier:@"customSectionView"];
    }

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 40;
    }

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    CustomSectionView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"customSectionView"];

    return headerView;
    }

需要注意的

经过上述 3 个步骤,一个通过 XIB 自定义 UITableViewHeaderFooterView 的过程就顺利完成了。
需要注意的是,上述的过程只是定义了一个 UITableView 的 header。事实上,不但能够定义 header 也可以定义 footer。在定义 footer 的时候,实现的代理方法只是变成了 viewForFooterInSection:
好了,现在运行一下看看,跟预想中的一样。然而,Xcode 在这里抛出了一个提示:

1
Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.

有这样的警告是因为 XIB 的 View 的 BackgroundColor 不是透明的。要去掉这个提示,就需要把它的 BackgroundColor 改为透明色的就可以了。

现在再运行一个看看,那个警告是不是没有了呢。

总结

UITableViewHeaderFooterView 在 UITableView 中的作用不仅仅是显示一个 title,更多的时候需要进行深度的自定义,例如加多一个 SubTitle。这个时候,自定义 UITableViewHeaderFooterView 就变得十分的有必要了,正如自定义 UITableViewCell 一样。而通过加入 XIB 使得这个自定义的过程变得可视化,所见即所得。