如何使页脚视图始终位于 UITableViewController 的底部?
Posted
技术标签:
【中文标题】如何使页脚视图始终位于 UITableViewController 的底部?【英文标题】:How can I make the footerview always stay at the bottom in UITableViewController? 【发布时间】:2016-01-05 10:58:50 【问题描述】:我正在使用UITableviewcontroller
,并且我希望页脚视图始终保持在屏幕的底部。但是,页脚视图 的y
位置正在根据tableviewcell
的height
发生变化。我怎样才能让它一直停留在屏幕底部?
【问题讨论】:
使用表格视图的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 的底部?的主要内容,如果未能解决你的问题,请参考以下文章