将容器置于视图前方

8

我有三个控制器。一个是HomeViewController,它启动了BlahPageViewController及其各个页面。另外两个控制器(BlahPageViewControllerBlahItemViewController)专门处理UIPageViewController。在我的HomeViewController中,我有以下代码来初始化页面。

private func setPageViewController() {
    let blahPageController = self.storyboard!.instantiateViewControllerWithIdentifier("BlahPageController") as! BlahPageViewController

    blahPageController.dataSource = self

    blahPageController.blahs = blahs

    if blahs.count > 0 {
        let firstController = getItemController(0)!

        let startingViewControllers: NSArray = [firstController]

        blahPageController.setViewControllers(startingViewControllers as [AnyObject], direction: .Forward, animated: false, completion: nil)
    }

    // Setting page view controller to front of app
    pageViewController = blahPageController

    addChildViewController(pageViewController!)

    self.view.addSubview(pageViewController!.view)

    pageViewController!.didMoveToParentViewController(self)

    // Now lets bring that container to the front.
    self.view.bringSubviewToFront(self.headerBar)
    // BUT IT DOESN'T WORK!!!!

}

我想象容器进入页面的前景。然而,当我运行应用程序时,容器内部的按钮无法点击。
以下是Storyboard。
调试视图截图如下。
这是什么问题?有更好的处理方式吗?我不希望用户在翻页时那些按钮移动,但是容器与BlahItemViewController重叠了。我该怎么解决?

你在哪里调用setPageViewController()方法? - dopcn
viewDidLoad() 中。 - thank_you
3个回答

6
在您的setPageViewController()函数中,您正在使用addSubview()将UIPageViewController的视图添加到您的ViewController的视图中。这将把视图置于所有其他视图之上。
基本上您有两个选项来避免这种情况。要么将其作为第一个视图插入:
self.view.insertSubview(pageViewController!.view, atIndex: 0)

或者在特定视图下方使用
self.view.insertSubview(pageViewController!.view, belowSubview: self.headerbar)

这应该能解决问题了。

更新

还要确保容器视图启用了用户交互。在Interface Builder中有一个设置,但您也可以在代码中进行设置:

self.headerbar.userInteractionEnabled = true

我尝试了两种修复方法,用两个选项替换了 addSubview 代码,但仍然无法点击按钮。就好像 headerBar 仍然被覆盖着一样。 - thank_you
嗯,这很奇怪。你尝试使用Xcode中的视图调试器查看是否有东西覆盖了标题栏吗? https://developer.apple.com/library/ios/recipes/xcode_help-debugger/using_view_debugger/using_view_debugger.html 另外,请尝试删除self.view.bringSubviewToFront(self.headerBar)。 还有一个问题,你真的需要那个容器视图吗?如果你只是展示一些按钮,你也可以将它们嵌入到一个视图中。 - ergoon
谢谢您的建议。我调试了视图并在我的问题中发布了屏幕截图,显示了按钮位于前面,但我仍然无法使其响应。即使我添加了打印字符串的动作,控制台日志也没有任何输出。容器视图不是必需的,但我认为这不是问题所在。请告诉我您的想法。 - thank_you
容器是否启用了用户交互? - ergoon
太好了,我修复好了。更新你的答案以匹配启用用户交互,我会给你加分、奖励等。这是一个很愚蠢的错误,我错过了它。 - thank_you

0

我认为你的视图堆栈是正确的。你可以检查容器的userInteractionEnabled是否为true,或者检查按钮是否可点击而不添加childviewcontroller。这样你就可以看到childviewcontroller是否影响了按钮的行为。


0
我猜问题出在包含你的页面视图控制器的视图中。 你将页面视图控制器的视图添加为视图控制器视图的子视图,然后将一些放到最前面。它会覆盖页面视图控制器的视图。
调用
self.headerBar.addSubview(pageViewController!.view)

替代

self.view.addSubview(pageViewController!.view)

很遗憾,那段代码不起作用。它实际上完全隐藏了我的标题栏。我甚至看不到标题栏上的按钮。 - thank_you
这样,您只需将“UIViews”添加到视图中,视图仍将在您设置它的最后一个屏幕上可用。就算是这段代码也无法解决此问题。请使用其中一种方法insertSubview: - Alex Cio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接