簡體   English   中英

viewForHeaderInSection在表視圖中不顯示標簽

[英]viewForHeaderInSection not displaying label in table view

我正在尋找使用viewForHeaderInSection更改uitableview部分的背景顏色和文本顏色,如下所示:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeader = UIView()
    let sectionText = UILabel()

    sectionHeader.backgroundColor = .blue

    sectionText.textColor = .red
    sectionText.font = .systemFont(ofSize: 14, weight: .bold)
    sectionText.text = painkillersArray[section]["label"] as? String

    sectionHeader.addSubview(sectionText)

    return sectionHeader
}

背景正在工作,但沒有出現文本。 我究竟做錯了什么?

您需要為視圖和標簽提供框架,還必須提供heightForHeaderInSection:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let sectionHeader = UIView.init(frame: CGRect.init(x: 0, y: 0, width: tableView.frame.width, height: 50))

            let sectionText = UILabel()
            sectionText.frame = CGRect.init(x: 5, y: 5, width: sectionHeader.frame.width-10, height: sectionHeader.frame.height-10)
            sectionText.text = "Custom Text"
            sectionText.font = .systemFont(ofSize: 14, weight: .bold) // my custom font
            sectionText.textColor = .red // my custom colour

            sectionHeader.addSubview(sectionText)

            return sectionHeader
        }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
            return 60 // my custom height
        }

===編輯:我刪除了我編寫的第一個代碼,該代碼無法正確處理自動布局。 正如@rmaddy在下面的注釋中指出的那樣,Morevoer最好使用原樣提供的UITableViewHeaderFooterView

寄存器

tableView.register(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "header")

viewDidLoad並執行

  override func tableView(_ tableView: UITableView,
                          viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
    header?.textLabel?.text = "foo"
    return header
}

header?.textLabel?.textColor = .red在上述方法中不起作用,因此將自定義代碼放入

  override func tableView(_ tableView: UITableView,
                          viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
    header?.textLabel?.text = "foo"
    return header
  }

  override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
      header.textLabel?.textColor = .red
      header.backgroundView?.backgroundColor = .blue
    }
  }

===

要將自動布局約束與更復雜的標題一起使用,請提供一個自定義UITableViewHeaderFooterView子類:

class CustomTableViewHeaderView: UITableViewHeaderFooterView {
  func commonInit() {
    let sectionHeader = UIView()
    let sectionText = UILabel()

    sectionHeader.backgroundColor = .blue

    sectionText.textColor = .red
    sectionText.font = .systemFont(ofSize: 14, weight: .bold)
    sectionText.text = "foo"

    sectionHeader.translatesAutoresizingMaskIntoConstraints = false
    sectionText.translatesAutoresizingMaskIntoConstraints = false

    sectionHeader.addSubview(sectionText)
    addSubview(sectionHeader)

    NSLayoutConstraint.activate([
      sectionHeader.leadingAnchor.constraint(equalTo: leadingAnchor),
      sectionHeader.trailingAnchor.constraint(equalTo: trailingAnchor),
      sectionHeader.topAnchor.constraint(equalTo: topAnchor),
      sectionHeader.bottomAnchor.constraint(equalTo: bottomAnchor),

      sectionText.leadingAnchor.constraint(equalTo: sectionHeader.leadingAnchor, constant: 16),
      sectionText.trailingAnchor.constraint(equalTo: sectionHeader.trailingAnchor),
      sectionText.topAnchor.constraint(equalTo: sectionHeader.topAnchor, constant: 8),
      sectionText.bottomAnchor.constraint(equalTo: sectionHeader.bottomAnchor, constant: -8),
    ])
  }

  override init(reuseIdentifier: String?) {
    super.init(reuseIdentifier: reuseIdentifier)
    commonInit()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
  }
}

並在viewDidLoad()注冊它:

  func viewDidLoad() {
    super.viewDidLoad()
    ...
    tableView.register(CustomTableViewHeaderView.self, forHeaderFooterViewReuseIdentifier: "header")
    ...
  }

然后只需dequeReusableHeaderFooterView

  func tableView(_ tableView: UITableView,
                          viewForHeaderInSection section: Int) -> UIView? {
    return tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
  }

類似地實現heightForHeaderInSectionestimatedHeightForHeaderInSection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM