iOS11 如何关闭 UITableView 调整大标题?
How to turn off adjusting large titles by UITableView in iOS 11?
iOS 11 中有这个大标题功能,当 UITableViewController
的 table 滚动到顶部时显示大标题,当用户使用时折叠成标准小标题将 table 滚动到远离顶部的位置。这是标准行为。我需要导航控制器的行为有所不同——我需要始终显示大标题。如何实现?
下面的代码没有帮助,滚动时它仍然折叠。
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
我在 UIViewController
中嵌入 UITableViewController
时无意中实现了它。
我不确定这是 Apple 的错误还是有意为之。
所以栈很简单 UINavigationController
-> UIViewController
(用作容器) -> UITableViewController
这是 示例 带有嵌入式 UITableViewController
全屏
的视图控制器
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var vc = UITableViewController(style: .plain)
var array: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
vc.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(vc.view)
view.addConstraint(view.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor))
view.addConstraint(view.rightAnchor.constraint(equalTo: vc.view.rightAnchor))
view.addConstraint(view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: vc.view.topAnchor))
view.addConstraint(view.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor))
vc.tableView.delegate = self
vc.tableView.dataSource = self
array = "0123456789".characters.map(String.init)
vc.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "identifier")
title = "Title"
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
cell.textLabel?.text = array[indexPath.row]
return cell
}
}
这是结果
希望对您有所帮助。
P.S. 令人惊讶的是,我目前的问题是我不知道如何使用这种架构来获得折叠行为:)
我所做的是在 navigationBar 和 TableView 之间添加另一个高度为 1 的视图。
let tableViewSeperator: UIView = {
let view = UIView()
// remove the color, so it wont be visible.
view.backgroundColor = UIColor.systemBlue
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
一件重要的事情是 将此分隔符视图添加为 viewcontroller 视图的子视图,然后再添加到 tableView,否则它不会没工作
view.addSubview(tableViewSeperator)
view.addSubview(tableView)
或者如果你想节省一行代码,你也可以这样做。
[tableViewSeperator, tableView].forEach({view.addSubview([=12=])})
然后像这样设置它的约束。
tableViewSeperator.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
tableViewSeperator.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
tableViewSeperator.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
tableViewSeperator.heightAnchor.constraint(equalToConstant: 1).isActive = true
最后一件事是将tableView TopAnchor 更改为sperator View 的BottomAnchor。
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
tableView.topAnchor.constraint(equalTo: tableViewSeperator.bottomAnchor, constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: createItemBtn.topAnchor, constant: 0).isActive = true
现在,当您滚动时,导航栏将保持大尺寸。
iOS 11 中有这个大标题功能,当 UITableViewController
的 table 滚动到顶部时显示大标题,当用户使用时折叠成标准小标题将 table 滚动到远离顶部的位置。这是标准行为。我需要导航控制器的行为有所不同——我需要始终显示大标题。如何实现?
下面的代码没有帮助,滚动时它仍然折叠。
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
我在 UIViewController
中嵌入 UITableViewController
时无意中实现了它。
我不确定这是 Apple 的错误还是有意为之。
所以栈很简单 UINavigationController
-> UIViewController
(用作容器) -> UITableViewController
这是 示例 带有嵌入式 UITableViewController
全屏
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var vc = UITableViewController(style: .plain)
var array: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
vc.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(vc.view)
view.addConstraint(view.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor))
view.addConstraint(view.rightAnchor.constraint(equalTo: vc.view.rightAnchor))
view.addConstraint(view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: vc.view.topAnchor))
view.addConstraint(view.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor))
vc.tableView.delegate = self
vc.tableView.dataSource = self
array = "0123456789".characters.map(String.init)
vc.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "identifier")
title = "Title"
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
cell.textLabel?.text = array[indexPath.row]
return cell
}
}
这是结果
希望对您有所帮助。
P.S. 令人惊讶的是,我目前的问题是我不知道如何使用这种架构来获得折叠行为:)
我所做的是在 navigationBar 和 TableView 之间添加另一个高度为 1 的视图。
let tableViewSeperator: UIView = {
let view = UIView()
// remove the color, so it wont be visible.
view.backgroundColor = UIColor.systemBlue
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
一件重要的事情是 将此分隔符视图添加为 viewcontroller 视图的子视图,然后再添加到 tableView,否则它不会没工作
view.addSubview(tableViewSeperator)
view.addSubview(tableView)
或者如果你想节省一行代码,你也可以这样做。
[tableViewSeperator, tableView].forEach({view.addSubview([=12=])})
然后像这样设置它的约束。
tableViewSeperator.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
tableViewSeperator.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
tableViewSeperator.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
tableViewSeperator.heightAnchor.constraint(equalToConstant: 1).isActive = true
最后一件事是将tableView TopAnchor 更改为sperator View 的BottomAnchor。
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
tableView.topAnchor.constraint(equalTo: tableViewSeperator.bottomAnchor, constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: createItemBtn.topAnchor, constant: 0).isActive = true
现在,当您滚动时,导航栏将保持大尺寸。