在UITableView上添加子视图

时间:2017-05-19 18:59:17

标签: ios iphone uitableview swift3

首先,我是Swift编程的新手。

我正在尝试在UITableView上显示自定义视图。

我面临两个主要问题:

a)子视图首先没有正确显示。参考图片如下:

Appreance on addSubview

并且片刻之后加载了实际视图:

Actual View Appearance

b)滚动UITableView后,视图不会超过UITableView的当前顶部滚动位置 After Table View is scrolled

以下是添加子视图的代码:

let vaAdPopupViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AdPopupWithCrossViewController") as! AdPopupWithCrossViewController
                            vaAdPopupViewController.adID = adID
                            vaAdPopupViewController.tableView = self.tableView
                            if let message = parseJSON["adv_text"] as? String{
                                vaAdPopupViewController.message = message
                            }


                            let navigationBarFrame: CGRect = (self.navigationController?.view.frame)!
                            let frameSize = CGRect(x: navigationBarFrame.minX, y: navigationBarFrame.minY, width: navigationBarFrame.width, height: (navigationBarFrame.height - (self.navigationController?.navigationBar.frame.size.height)!))
                            vaAdPopupViewController.view.frame = frameSize
                            self.tableView.addSubview(vaAdPopupViewController.view)


                            vaAdPopupViewController.view.tag = 1000
                            self.addChildViewController(vaAdPopupViewController)
                            vaAdPopupViewController.didMove(toParentViewController: self)

也在AdPopupWithCrossViewController中:

override func viewDidLoad() {
        self.view.superview?.layoutIfNeeded()
        self.view.layoutIfNeeded()
        super.viewDidLoad()
}

请指导我如何解决此问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

正如Dan所说,您应该将弹出窗口添加为视图控制器视图的子视图,而不是表视图。表视图的视图层次结构是私有的,您不应该试图弄乱它。

请注意,您无法使用表视图控制器执行此操作。这一直困扰着我,但这是事实:A UITableViewController管理单个表视图而不是其他任何东西。如果需要更复杂的视图层次结构,则需要将表视图控制器嵌入另一个视图控制器中。我这样做是为了容器视图和嵌入segue,这很容易。

如果您这样做,那么您可以将新视图控制器的内容添加到父视图控制器的内容视图,而不是表视图控制器的视图(或表视图本身)

答案 1 :(得分:1)

您可能想要创建Present Modally Segue或通过代码使用present()

您已经创建了AdPopupWithCrossViewController。将其背景颜色设置为半透明。然后你可以这样呈现:

    let vaAdPopupViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AdPopupWithCrossViewController") as! ModalOverTableViewController
    vaAdPopupViewController.modalPresentationStyle = .overCurrentContext
    self.present(vaAdPopupViewController, animated: true, completion: nil)

然后,您的小“X”按钮可以删除广告:

    @IBAction func closeTapped(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

您可以尝试.modalPresentationStyle.modalTransitionStyle上的各种选项,以及将animated设置为true或false,以获得您想要的外观/行为。