我正在尝试使用swift将UIControls添加到iOS中的静态TableViewHeaders。目标是在默认外观的基础上构建,因此UI将匹配前面的默认UI元素。
我找到了一个很好的modifying the appearance of existing elements示例,但没有添加任何新内容。
我的具体目标是:
由于这两者都与部分分组相关,因此标题是添加此功能的合理选择。
答案 0 :(得分:1)
为TableViews自定义静态标头有两个主要选项:
willDisplayHeaderView 提供默认视图并允许对其进行修改。简单的外观修改非常简单。添加按钮等交互式功能会有点复杂
viewForHeaderInSection 返回标题的视图,该标题可以从笔尖加载或完全在代码中创建。这样做的一个缺点是它不能访问标题的默认外观,Apple只提供对一个默认(UIColor.groupTableViewBackground)的访问。
要构建在默认标头之上,需要使用willDisplayHeaderView。
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
{
let header = view as! UITableViewHeaderFooterView
let headerLabelFont: UIFont = header.textLabel!.font
// References for existing or new button
var selectButton: UIButton? = nil
// Check for existing button
for i in 0..<view.subviews.count {
if view.subviews[i] is UIButton {
selectButton = view.subviews[i] as? UIButton
}
}
// No button exist, create new one
if selectButton == nil {
selectButton = UIButton(type: .system)
header.addSubview(selectButton!)
toggleButton = UIButton(type: .system)
header.addSubview(toggleButton!)
}
// Configure button
selectButton?.frame = CGRect(x: view.frame.size.width - 85, y: view.frame.size.height - 28, width: 77, height: 26)
selectButton?.tag = section
selectButton?.setTitle("SELECT ALL", for: .normal)
selectButton?.titleLabel?.font = UIFont(descriptor: headerLabelFont.fontDescriptor, size: 11)
selectButton?.contentHorizontalAlignment = .right;
selectButton?.setTitleColor(self.view.tintColor, for: .normal)
selectButton?.addTarget(self, action: #selector(self.selectAllInSection), for: .touchUpInside)
}
func selectAllInSection() {
...
最大的挑战是解决TableView可以重用静态标题单元的问题。因此,如果修改了一个,例如通过添加按钮,那么当重新使用时,可以添加第二个按钮。如果TableView足够大以滚动屏幕,这只是一个问题,但是应该防范因为结果很难追踪。
如果向标题添加了多个按钮,则需要一些识别每个按钮的机制。 UIButton.tag是一个选项,但在此示例中,该字段用于标识要对其执行的部分。另一种选择是使用标记字符串来包含两条信息。
可以在Github
上找到完整的工作演示(是回答我自己的问题,想要在浸出多年后回馈一些东西)