使用Swift

时间:2017-06-24 10:32:41

标签: ios swift uitableview

我正在尝试使用swift将UIControls添加到iOS中的静态TableViewHeaders。目标是在默认外观的基础上构建,因此UI将匹配前面的默认UI元素。

我找到了一个很好的modifying the appearance of existing elements示例,但没有添加任何新内容。

我的具体目标是:

  1. “全选”功能可快速将部分中的所有行标记为“已选中”(可能是复选标记附件,UISwitch等)
  2. “显示/隐藏”功能,允许单个视图按部分提供简单的“概述”,同时仍然可以访问部分内部的详细信息。
  3. 由于这两者都与部分分组相关,因此标题是添加此功能的合理选择。

1 个答案:

答案 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

上找到完整的工作演示

(是回答我自己的问题,想要在浸出多年后回馈一些东西)