(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.addSubview
内viewForHeaderInSection
?你能发布一个简单的例子吗?
@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的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 UIView 上添加 UITextField Swift