如何在静态UITableView中使用页脚?

时间:2018-01-30 15:00:45

标签: swift uitableview footer

我有一个设置屏幕,我想在我的静态 UITableView中添加一个包含应用程序版本号的页脚:

enter image description here

我已经阅读了很多关于SO的帖子,其中绝大多数似乎是Objective-C和/或使用UITableView和其他人在动态内容的tableView(_:titleForHeaderInSection:)中添加页脚。我找到了one question的答案,建议只使用UITableView.tableFooterView属性,所以我也尝试了这个,但仍然没有得到任何结果,如上图所示。

这就是我所做的:

override func viewDidLoad() {
    super.viewDidLoad()

    setUpView()
  }

  func setUpView() {
    self.navigationController?.navigationBar.topItem?.title = "Settings"

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.dismissSettings(_:)))

    formulasTitle.textColor = UIColor.black
    liftsTitle.textColor = UIColor.black
    roundNumbersTitle.textColor = UIColor.black
    sendFeedbackTitle.textColor = UIColor.black
    unitsTitle.textColor = UIColor.black
    pleaseRateTitle.textColor = UIColor.black
    legalMumboJumboTitle.textColor = UIColor.black

    currentFormulaSelection.detailTextLabel!.text = settingsViewModel.defaultFormulaName
    currentLiftsSelection.detailTextLabel!.text = settingsViewModel.defaultLiftName
    weightUnitControl.selectedSegmentIndex = settingsViewModel.weightUnitSelectedSegmentIndex
    roundNumbersSwitch.isOn = settingsViewModel.roundNumbersSwitchOn

    roundNumbersSwitch.addTarget(self, action: #selector(self.roundingOptionDidChange), for: .valueChanged)
    weightUnitControl.addTarget(self, action: #selector(weightUnitDidChange), for: .valueChanged)

    let versionLabel = UILabel()
    versionLabel.text = getVersion()
    let footer = UITableViewHeaderFooterView()

    tableView.tableFooterView = footer

  }

  func getVersion() -> String {
    let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
    let appBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

    let versionLabelText: String
    versionLabelText = "Version \(appVersion) (\(appBuild))"

    return versionLabelText
   }

正在使用tableView.tableFooterView正确的解决方案而我只是错误地执行此操作,还是以其他方式添加页脚?

编辑#1

我已根据Taras的回答添加了这个,但仍然没有:

override func viewDidLoad() {
    super.viewDidLoad()

    let versionLabel = UILabel()
    versionLabel.text = getVersion()

    let footer = UITableViewHeaderFooterView(reuseIdentifier: "footer")
    tableView.tableFooterView = footer
    tableView.register(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "footer")
    footer.frame = CGRect(x: 50, y: 10, width: 100, height: 100)
    footer.contentView.addSubview(versionLabel)
    footer.backgroundView?.backgroundColor = UIColor.green
    footer.constrainToSuperView()
  }

extension UIView {
  func constrainToSuperView() {
    guard let superview = superview else {
      return
    }
    translatesAutoresizingMaskIntoConstraints = false
    topAnchor.constraint(equalTo: superview.topAnchor).isActive = true
    bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true
    leadingAnchor.constraint(equalTo: superview.leadingAnchor).isActive = true
    trailingAnchor.constraint(equalTo: superview.trailingAnchor).isActive = true
  }
}

需要注意两件奇怪的事情:在运行时,footer的框架为(50.0, 535.333333333333, 375.0, 100.0)。另外,如果我这样做,我会看到带有版本号的标签,但它左对齐,我似乎无法居中:

 footer.textLabel?.text = versionLabel.text

2 个答案:

答案 0 :(得分:2)

let footer = UITableViewHeaderFooterView()

tableView.tableFooterView = footer

在这两行中你创建了零页框的空页脚。尝试使用下一个:

let footer = UIView(frame: CGRect(x:0, y:0, width: UIScreen.main.bound.width, height: 100))
footer.backgroundColor = UIColor.red
tableView.tableFooterView = footer

答案 1 :(得分:0)

@tarasChernyshenko的答案是正确的,但我认为您需要更具体的内容才能获得与您上传的图像相同的结果。

为此,您可以将带有零帧的UIView设置到tableView页脚,然后为视图设置适当的背景颜色。

类似这样的东西:

tableView.tableFooterView = UIView()
view.backgroundColor = .groupTableViewBackground

请注意,部分标题的颜色会与背景发生变化,这是正常现象,但是,如果要使用相同的颜色,则只需要为标题部分设置清晰的背景颜色。如果您没有为“标题”部分设置自定义视图,则只需覆盖此功能且重要,请设置为清除背景视图的背景色。

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

按情节提要放置页脚视图,您需要在底部放置一个框架为零的视图,然后将其设置为可调整大小的蒙版,并在所有侧面进行调整。不管背景颜色如何,都不会显示。

作为数据,标头部分的背景颜色默认为UIExtendedSRGBColorSpace 0.920532 0.920532 0.926863 1,但可以随型号或OS进行更改。