在 tableview 上添加视图

Posted

技术标签:

【中文标题】在 tableview 上添加视图【英文标题】:Adding a view over the tableview 【发布时间】:2016-09-10 13:48:45 【问题描述】:

我必须创建一个看起来像这样的屏幕。

我已经使用UITableViewController 完成了它。我走这条路而不是使用UIViewControllerUIScrollView 的原因是,中间的表格视图是静态的,只有UITableViewControllers 可以有静态表格视图。反正我现在的结果是这样的。

表格的页眉视图包含顶部的标签,页脚视图包含地图视图。

我创建了一个单独的 UIView 子类,并为两个按钮创建了一个名为 ButtonView 的笔尖。

import UIKit

class ButtonView: UIView 

    @IBOutlet var view: UIView!
    @IBOutlet weak var declineButton: UIButton!
    @IBOutlet weak var acceptButton: UIButton!

    override init(frame: CGRect) 
        super.init(frame: frame)

        NSBundle.mainBundle().loadNibNamed("ButtonView", owner: self, options: nil)
        self.bounds = view.bounds
        self.addSubview(self.view)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        NSBundle.mainBundle().loadNibNamed("ButtonView", owner: self, options: nil)
        self.addSubview(self.view)
    

我尝试将它添加到表视图控制器的 viewtableView 中,但两次都被添加到滚动视图中。我希望这些按钮固定在底部。所以我将它们添加到window

class TableViewController: UITableViewController 

    var buttonView: ButtonView!

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 35, right: 0)
    

    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()

        buttonView = ButtonView(frame: CGRect(x: 0, y: view.frame.size.height - 35, width: view.frame.width, height: 35))
        UIApplication.sharedApplication().keyWindow!.addSubview(buttonView)
    

但正如您从上面的屏幕截图中看到的那样,按钮的宽度是关闭的。他们没有正确调整大小以适应屏幕。我已经在ButtonView 中设置了所有必要的自动布局约束。

如何让它们正确调整大小并适合屏幕?

【问题讨论】:

我收到此错误。 错误:非法配置:静态表视图仅在嵌入 UITableViewController 实例时有效 只需使用容器视图将 tableviewcontroller 嵌入到您的标准 ViewController 中 【参考方案1】:

我建议走不同的路线。将您的 UITableviewController 放在普通视图控制器的容器视图中。它为您提供两全其美的体验。您的父 VC 可以拥有您想要的任何视图,并且包含的​​ UITableviewController 为您管理您的静态表视图。

这是一个示例项目的链接:(在 Objective-C 中,但概念和布局是相同的。)

https://github.com/DuncanMC/test

编辑:

正如@Gordonium 在他的回答中所暗示的那样,在代码中添加视图但不设置约束很少会产生您想要的结果。如果您在代码中添加视图并且正在使用 AutoLayout,那么您还需要添加一组约束来指定视图的大小和间距。使用 IB 设置视图及其约束通常更容易。

【讨论】:

【参考方案2】:

给你 - 我已经为你设置了一个基本项目。

您可以在这里获取:https://github.com/99arobe/ButtonTest

它使用容器和自动布局,因此应该可以帮助您入门。大致是这样的:

可能有几种方法可以做到这一点,但是当您开始在代码中设置视图的框架时,除非您手动添加该代码,否则您将无法获得自动布局的好处。

【讨论】:

当您在代码中设置视图的框架时,AutoLayout 通常会接管并撤消您的更改。 是的,这很好。我经常看到人们改变设备的方向,想知道为什么他们的视野突然变成了 x0, y0。 @Gordonium 感谢您提供详细的答案和演示项目。既然你和邓肯的答案都是一样的,但他先发了,我不得不接受他的。感谢您的帮助:)【参考方案3】:

除了 Duncan 的建议之外,如果您不想要容器视图,还有另一种解决方法可以解决您的问题。像现在一样将按钮视图添加到表格中,实现UIScrollViewDelegatescrollViewDidScroll 方法,并根据表格的contentOffset 更改按钮视图的origin.y。并且,不要忘记在表格中插入一些底部内容,以便您的按钮视图在滚动到底部时不会重叠任何内容。希望这会有所帮助。祝你好运!

【讨论】:

以上是关于在 tableview 上添加视图的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局将视图定位在 tableview 的顶部

在 viewController 中重新加载 tableView

将 tableview 代表移动到不同的类

iPhone:TableView 下的图像视图和按钮

UITableView 页脚未显示

滚动视图内的不可滚动的tableview