UITableView tableFooterView显示在UITableView的顶部 – 错误

我创build了一个非常简单的testing用例来重现这个问题。

我想以编程方式设置页脚视图到一个tableview。 请注意,我指的是在tableview的底部页脚 – 不是部分页脚(大多数堆栈溢出的答案混淆了他们)。

这是我非常简单的代码:

- (void)viewDidLoad { [super viewDidLoad]; UIView *footerContainer = [[UIView alloc] initWithFrame:CGRectZero]; footerContainer.backgroundColor=[UIColor greenColor]; footerContainer.translatesAutoresizingMaskIntoConstraints=NO; [footerContainer addConstraints:@[[NSLayoutConstraint constraintWithItem:footerContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:100 ], [NSLayoutConstraint constraintWithItem:footerContainer attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:[UIScreen mainScreen].bounds.size.width ]]]; self.mytableview.tableFooterView=footerContainer; [self.view setNeedsLayout]; [self.view layoutIfNeeded]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text=[NSString stringWithFormat:@"%ld",indexPath.row]; return cell; } 

但是,结果如下所示:

在这里输入图像说明

正如你注意到的,页脚显示在桌面上。 这是一个错误还是我错过了什么?

如果我将tableFooterView更改为tableHeaderView,那么它工作正常。 所以我也期待着同样的工作,但是事实并非如此。

dynamic大小的UITableView页眉和页脚视图并不总是与自动布局很好,所以你需要给它一点帮助。

这里是一个为页脚视图创build一个简单的UIView的例子,并添加了一个“扩展” UILabel (行数设置为零)。 页脚视图是用一个明确的CGRect为其框架创build的,并且标签被固定到四面都有自动布局的约束。

viewDidLayoutSubviews() ,我们告诉自动布局,根据其内容的约束来计算页脚视图的框架,然后我们更新框架值(特别是高度)。

 // // this assumes IBOutlet has been set for "theTableView" // - (void)viewDidLoad { [super viewDidLoad]; // standard stuff [_theTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"simpleCell"]; _theTableView.delegate = self; _theTableView.dataSource = self; // instantiate a view for the table footer // width doesn't matter (it will be stretched to fit the table by default) // set height to a big number to avoid a "will attempt to break constraint" warning UIView *footerContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1000)]; // give it a color so we can see it footerContainer.backgroundColor=[UIColor greenColor]; // set the footer view _theTableView.tableFooterView = footerContainer; // instantiate a label to add to the footer view UILabel *aLabel = [UILabel new]; // auto-sizing the height, so set lines to zero aLabel.numberOfLines = 0; // give it a color so we can see it aLabel.backgroundColor = [UIColor yellowColor]; // set the text to 8 lines for demonstration purposes aLabel.text = @"Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"; // standard, for auto-sizing aLabel.translatesAutoresizingMaskIntoConstraints = NO; // add the label to the footer view [footerContainer addSubview:aLabel]; // constraint the label to 8-pts from each edge... [aLabel.topAnchor constraintEqualToAnchor:footerContainer.topAnchor constant:8.0].active = YES; [aLabel.leftAnchor constraintEqualToAnchor:footerContainer.leftAnchor constant:8.0].active = YES; [aLabel.rightAnchor constraintEqualToAnchor:footerContainer.rightAnchor constant:-8.0].active = YES; [aLabel.bottomAnchor constraintEqualToAnchor:footerContainer.bottomAnchor constant:-8.0].active = YES; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // get a reference to the table's footer view UIView *currentFooterView = [_theTableView tableFooterView]; // if it's a valid reference (the table *does* have a footer view) if (currentFooterView) { // tell auto-layout to calculate the size based on the footer view's content CGFloat newHeight = [currentFooterView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; // get the current frame of the footer view CGRect currentFrame = currentFooterView.frame; // we only want to do this when necessary (otherwise we risk infinite recursion) // so... if the calculated height is not the same as the current height if (newHeight != currentFrame.size.height) { // use the new (calculated) height currentFrame.size.height = newHeight; currentFooterView.frame = currentFrame; } } } 

当试图使自动resize的表视图标题视图正常工作时,这也会很有帮助。

我已经在swift中尝试了明确的框架值,我达到了你所要求的行为,如果你认为它的罚款,尝试用明确的框架值。 如果不需要的话,删除布局约束。

  @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self let footerView = UIView(frame: CGRect.init(x: 0, y: 0, width: tableView.frame.width, height: 50)) footerView.backgroundColor = UIColor.green tableView.tableFooterView = footerView } extension ViewController: UITableViewDelegate, UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") cell?.textLabel?.text = "\(indexPath.row)" return cell! } 

}

在这里输入图像说明