很遗憾,无法使用自动布局调整表头视图的大小。您可以对标题内的元素使用自动布局,但您必须通过显式设置其框架来指定标题的大小。如果标题的高度是静态的并且在编译时已知,则可以使用 IB。但是,如果高度是动态的或取决于设备(如您的情况),则必须在代码中设置它。
一个非常灵活的解决方案是创建UITableView 的自定义子类,并在layoutSubviews 方法中调整标题的框架。这样,当表格视图调整大小时,标题的大小会自动调整。但是,您必须小心,仅在实际需要更改以避免无限循环时才重新应用标头的框架。
这是在 Objective-C 中的样子:
@interface MyTableView : UITableView
@end
@implementation MyTableView : UITableView
- (void)layoutSubviews {
[super layoutSubviews];
if (self.tableHeaderView) {
UIView *header = self.tableHeaderView;
CGRect rect = CGRectMake(0, 0, self.bounds.size.width,
self.bounds.size.height / 2);
// Only adjust frame if needed to avoid infinite loop
if (!CGRectEqualToRect(self.tableHeaderView.frame, rect)) {
header.frame = rect;
// This will apply the new header size and trigger another
// call of layoutSubviews
self.tableHeaderView = header;
}
}
}
@end
Swift 版本如下所示:
class MyTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
if let header = tableHeaderView {
let rect = CGRectMake(0, 0, bounds.size.width, bounds.size.height / 2)
// Only adjust frame if needed to avoid infinite loop
if !CGRectEqualToRect(header.frame, rect) {
header.frame = rect
// This will apply the new header size and trigger
// another call of layoutSubviews
tableHeaderView = header
}
}
}
}
注意,上面的 sn-ps 使用 table view 的 bounds 而不是屏幕大小来计算 header 大小。
更新:请注意,有时需要在设置 tableHeaderView 属性后额外调用 layoutIfNeeded。我遇到了一个问题,即在没有调用 layoutIfNeeded 的情况下将部分标题绘制在标题视图上方。