如何使页脚视图始终位于 UITableViewController 的底部?

Posted

技术标签:

【中文标题】如何使页脚视图始终位于 UITableViewController 的底部?【英文标题】:How can I make the footerview always stay at the bottom in UITableViewController? 【发布时间】:2016-01-05 10:58:50 【问题描述】:

我正在使用UITableviewcontroller,并且我希望页脚视图始终保持在屏幕的底部。但是,页脚视图y 位置正在根据tableviewcellheight 发生变化。我怎样才能让它一直停留在屏幕底部?

【问题讨论】:

使用表格视图的tableFooterView属性 覆盖 func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? if section == 1 let footerView = UIView(frame: CGRectMake(0, UIScreen.mainScreen().bounds.height - 40, tableView.frame.size.width, 40)) return footerView return UIView() This实际上是我的代码块。我想要屏幕底部的页脚,但它没有粘在屏幕底部,并且根据 tableview 的高度不断变化 已编辑:= 我认为 uitableviewcontroller 不可能。所以我所做的是将视图添加为导航控制器的子视图,它对我有用 :) 【参考方案1】:

tableview 页脚视图将始终位于tableview 的底部,并始终随之滚动。如果您需要将页脚视图固定在底部,则不能使用 TableViewController。您必须使用 UIViewController ,将您的 tableView 作为子视图。将页脚也作为另一个子视图并完成。

【讨论】:

我知道这听起来很愚蠢。但是是否可以在 tableviewcontroller 中添加另一个视图?这里我正在做一些我必须使用 tableviewcontroller 的东西,所以不能切换到视图控制器。我正在努力使它工作:(是否可以在 tableviewcontroller 类中添加任何其他视图?也许让它粘在底部 如果您使用的是UINavigationController,您可以将您的footerview 作为subview 添加到您的navigationController。不要忘记从viewDidDisappear 中删除footerView,否则它会出现在导航堆栈中的所有屏幕中。【参考方案2】:

页脚始终添加到内容大小的底部。所以我的做法是

方法一:(静态和动态TableView都可用)

在 Storyboard 中添加一个ViewController,并将您的页脚视图(或按钮)设置在ViewController 的底部。

ViewController 中添加ContainerView 并设置约束

添加UITableViewController并将tableview嵌入到容器视图中

方法2:(适用于Dynamic TableView)

添加ViewController,在底部设置页脚视图,添加 UITableView 并设置您的自动布局。

你不能在 UIViewController 中设置静态表格视图

【讨论】:

【参考方案3】:

如果您想将页脚视图始终保持在表格视图的底部,而不需要像部分页脚这样的浮动属性,那么可以使用

tableView.tableFooterView = customFooterView

【讨论】:

【参考方案4】:

覆盖现有的 UiTableView 方法

func 允许FooterViewToFloat() -> Bool 返回真

【讨论】:

【参考方案5】:

使footerView填充底部剩余空间的Swift代码, 然后你可以使用自动布局让你在footerView的底部查看:

override func viewDidLayoutSubviews()

    super.viewDidLayoutSubviews()


    guard let footerView = tableView.tableFooterView else
    
        return
    

    var cellsHeight:CGFloat = tableView.tableHeaderView?.frame.height ?? 0

    let sections = self.numberOfSections(in: tableView)
    for section in 0..<sections
    

        let rows = self.tableView(tableView, numberOfRowsInSection: section)

        for row in 0..<rows
        
            let indexPath = IndexPath(item: row, section: section)
            cellsHeight += self.tableView(tableView, heightForRowAt: indexPath)
        
    

    var frame = footerView.frame

    frame.size.height = tableView.contentSize.height - cellsHeight;
    frame.origin.y = cellsHeight

    footerView.frame = frame

【讨论】:

【参考方案6】:

您不能使用UITableViewController,但无论如何也没有必要。您可以轻松地将UITableView 添加到常规UIViewController,并且只需使用自动布局在UITableView 下方添加UIView。下面是一个简单的例子,在UITableView下方添加一个红色的UIView

import UIKit

class MyFooterTableViewController: UIViewController 

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    var data = [ "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"]

    override func viewDidLoad() 
        super.viewDidLoad()
        self.tableView.dataSource = self
     

    @IBOutlet weak var tableView: UITableView!



extension MyFooterTableViewController: UITableViewDataSource 
    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return data.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableCellTest", for: indexPath)

        cell.textLabel?.text = data[indexPath.row]
        cell.detailTextLabel?.text = "BANANA"
        return cell
    

Storyboard 上的约束如下所示:

最终结果是这样的:

完整的项目代码在这里:

https://www.dropbox.com/s/pyp42nzumquompp/TableViewFooter.zip?dl=0

【讨论】:

以上是关于如何使页脚视图始终位于 UITableViewController 的底部?的主要内容,如果未能解决你的问题,请参考以下文章

当您有不同高度的页面时,如何使页脚位于所有屏幕尺寸的底部?

页面内容不足时如何使页脚移至底部

使页脚留在底部[重复]

尝试使用 CSS 粘页脚时无法在移动设备中滚动

如何使页脚居中[重复]

如何使用引导程序使页脚文本居中,右侧有两个图像?