(Swift) 以编程方式在 UITableViewController 上方添加 UIView

Posted

技术标签:

【中文标题】(Swift) 以编程方式在 UITableViewController 上方添加 UIView【英文标题】:(Swift) Adding a UIView above a UITableViewController programmatically 【发布时间】:2017-02-15 21:46:32 【问题描述】:

我有一个UITableViewController,我想在它上面放置一个 UIView(不是覆盖/覆盖,就在上面),同时保留导航栏。

这是我正在努力实现的一个很好的例子,除了我说我仍然想要导航栏:

我在 Swift (3) 中执行此操作,并且全部以编程方式执行(无情节提要)。

这是我目前在我的UITableViewController 中所拥有的,在以编程方式执行约束时我被卡住了,我不确定我需要什么:

// Create the view (add subview in viewDidLoad)

let topView: UIView = 
    let tv = UIView()
    tv.backgroundColor = UIColor.darkGray
    tv.translatesAutoresizingMaskIntoConstraints = false
    tv.layer.masksToBounds = true
    return tv
()

// Constraints (call in viewDidLoad)
func setupTopView() 
        //x, y, width, height constraints
        topView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        topView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        topView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        topView.heightAnchor.constraint(equalToConstant: 100)


有人知道怎么做吗?

编辑:谢谢@Sneak,这就是我最终得到的结果:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

    let headerLabel = UILabel()
    let logoView = UIImageView()

    headerLabel.frame = CGRect(x: 0, y: 0, width: 200, height: 21)
    headerLabel.text = self.navigationItem.title
    headerLabel.textColor = UIColor.white
    headerLabel.backgroundColor = UIColor.clear

    logoView.frame = CGRect(x: 0, y: 0, width: 90, height: 90)
    let logo: UIImage = UIImage(named: self.navigationItem.title!)!
    logoView.image = logo

    view.addSubview(headerLabel)
    view.addSubview(logoView)

    return topView


override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 175

【问题讨论】:

您可以使用常规的`viewController`和tableView,或者将您的视图作为标题添加到当前tableView 【参考方案1】:

实现方法tableView(_:viewForHeaderInSection:)

如果您只有 1 个部分,只需在方法中返回您的 UIView

如果您有多个部分,则只返回第 1 部分的 UIView。

tableView(_:heightForHeaderInSection:)你如何设置高度。

您也可以通过以下方式执行此操作:tableView.tableHeaderView = headerView

【讨论】:

赢家。谢谢,这比我预期的要容易得多。 @d0xi45 很高兴提供帮助,有些人把事情复杂化了:P 所以现在,如果我想在标题中添加一个标签和图像视图,我是在viewForHeaderInSection 内完成所有这些,还是需要在外面创建它们并做约束,然后将它们添加为view.addSubviewviewForHeaderInSection?你能发布一个简单的例子吗? @d0xi45 你可以像往常一样在 viewForHeaderSection 中运行你的代码,如果你有一个更复杂的 UI,你可以继承 UIView 并简单地返回你的自定义类。这样您就可以将 XIB 和 AutoLayout 与您的自定义 UIView 子类一起使用。查看其他问题/教程,了解如何使用 xib 子类化 UIView。 酷 - 我现在有我的标签和图像,但有两个问题:首先,当我滚动时,子视图(标签和图像)会随着表格视图移动,而不是停留在标题中。有没有办法阻止这种情况?另外,只是为了澄清约束(我试图像我的问题中的示例一样将标签和图像约束在中心),我将像在原始问题中那样在 tableview 控制器中设置约束, 并在 viewForHeaderInSection? 中调用该函数?【参考方案2】:

这样做你会遇到很大的困难,因为你不能真正访问 UITableViewController 的根视图。你应该切换到一个 UIViewController 里面有一个 tableView,然后你可以添加你的 topView 作为控制器根视图的子视图并添加你的约束。

【讨论】:

【参考方案3】:

我的建议是使用UIViewController 而不是UITableViewController

这样您就可以根据需要正确设置整个视图,方法是让顶部横幅 UIView 在导航栏下方的顶部占据一定的空间,然后在其下方放置一个 UITableView , 使用约束捕捉到 UIView 的底部和底部布局指南的顶部。

我还强烈推荐使用 Storyboard,因为根据我在 UIViewController 内构建具有 UITableView 的应用程序的经验,在 Storyboard 中进行可视化设置后,您确实没有什么不能以编程方式完成的。网上有很多代码和建议来自完全以编程方式做事的人,但如果你没有这样做的一些真正具体的理由,我建议使用 Storyboard。特别是在这种情况下,它确实可以帮助您在适当的约束条件下快速准确地布局。

【讨论】:

以上是关于(Swift) 以编程方式在 UITableViewController 上方添加 UIView的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式居中按钮

以编程方式在 UIView 上添加 UITextField Swift

在 Swift 中以编程方式创建 NSTextField

UIScrollView 在 Swift 中以编程方式

在 Swift 中以编程方式创建 UITableViewController

如何使用 Swift 以编程方式创建 UILabel?