swift - 在顶部时更改 UITableView 部分标题
问题描述
我使用以下代码将 Xib 文件中的自定义标题用于我的表格视图:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let result: Result = (self.responseData?.result![section])!
let headerCell = Bundle.main.loadNibNamed("HeaderViewTableViewCell", owner: self, options: nil)?.first as! HeaderViewTableViewCell
headerCell.sectionName.text = "Title"
if (section == 0) {
headerCell.sectionName.textColor = UIColor(red: 49/255.0, green: 149/255.0, blue: 213/255.0, alpha: 1)
}
return headerCell
}
然后我想在滚动到顶部时更改标题部分名称,我已经尝试过这段代码
let topSection = self.mainTable .indexPathsForVisibleRows?.first?.section
let currentHeader : HeaderViewTableViewCell = self.mainTable .headerView(forSection: topSection!) as HeaderViewTableViewCell
currentHeader.sectionName.textColor = UIColor.red
但我收到此错误:无法转换“UITableViewHeaderFooterView?”类型的值?强制键入“HeaderViewTableViewCell”有没有办法将 headerView 转换为我的自定义类型?
解决方案
首先,我建议您使用UITableViewHeaderFooterView
您的标题视图。您可以创建一个子类并添加自定义代码。对于这个例子,我将使用一个空的子类:
class HeaderView: UITableViewHeaderFooterView {
override func prepareForReuse() {
super.prepareForReuse()
// set you default color (other properties) here.
// when scrolling fast the view gets reused and sometimes
// the view that's on top will suddenly appear on the bottom still with the previous values
textLabel?.textColor = .black
}
}
注册您的标题视图(我正在跳过所有其他不相关的代码):
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(HeaderView.self, forHeaderFooterViewReuseIdentifier: "Header")
// If you have a nib file for your HeaderView then register nib instead
// Make sure in our nib file you set class name to HeaderView
// And the file name is also HeaderView.xib
// tableView.register(UINib.init(nibName: "HeaderView", bundle: nil) , forHeaderFooterViewReuseIdentifier: "Header")
}
实现委托方法:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 44
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header")
view?.textLabel?.text = "Hello"
return view
}
创建一个更新标头的方法:
// Iterates through section header views and
// checks for positions in relation to the tableview offset
func updateHeaders() {
var sectionHeaders: [Int: HeaderView?] = [:]
var i = 0
while i < numberOfSections {
sectionHeaders[i] = tableView.headerView(forSection: i) as? HeaderView
i += 1
}
let availableHeaders = sectionHeaders.flatMap { $0.value != nil ? $0 : nil }
for (index, header) in availableHeaders {
let rect = tableView.rectForHeader(inSection: index)
if rect.origin.y <= tableView.contentOffset.y + tableView.contentInset.top || index == 0 {
header!.textLabel?.textColor = .red
} else {
header!.textLabel?.textColor = .black
}
}
}
updateHeaders()
并从 UIScrollViewDelegate 方法调用您scrollViewDidScroll
:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
updateHeaders()
}
还要在视图显示之前更新标题(在出现任何滚动之前),为此使用 UITableViewDelegate 方法willDisplayHeaderView
:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
updateHeaders()
}
推荐阅读
- laravel - 如何重置 Laravel 磁盘配置?
- javascript - 未出现表单验证字段的警告消息
- pandas - 获取每组的具体索引号
- swift - macos modal新窗口,windowController的windowDidLoad在其contentView的viewDidLoad之后调用?
- javascript - Angular/TypeScript Map 使用每个对象的最后一个索引
- node.js - 在 AWS Codebuild 上运行时开玩笑不关闭()expressjs 服务器
- hardware - 计算机只能使用软件中断吗?
- rest - 如何在同一 URI 上处理无参数和参数化 REST 服务
- java - 如何根据坐标仅使我的部分布局(包括部分视图)不可见?
- c++ - Boost.Graph 和 Graphviz 嵌套子图