导航控制器内部的pageviewcontroller导致布局问题

时间:2017-04-12 03:01:02

标签: ios swift layout uinavigationcontroller uipageviewcontroller

我有一个UIViewController(使用Swift)

这只是一个简单的项目列表。它被实现为UIViewController,我已经添加了一个UITableView。在我的幻灯片菜单实现中通过此代码调用此“项目”视图,并且幻灯片菜单的初始视图嵌入在NavigationController中 - 因此幻灯片菜单中的所有视图都采用导航控制器。 Items是这样调用的幻灯片菜单视图之一

self.openViewControllerBasedOnIdentifier("Items")

这很好用,我得到......

Initial Lists view from slider menu

然后我在右上角有一个添加按钮,你可以推送添加新项目。添加按钮会打开一个PageViewController。我使用页面视图,因为有多个与要添加的项目关联的详细信息页面。到目前为止,这也是有效的,因为我启动了pageviewcontroller,我可以在页面之间翻转。

问题在于页面上元素的放置在某些情况下会发生变化(它不一致)。

当我最初显示PageViewController的第一页时,我看到了我设计的布局(在左下方)。如果我只是从文本字段中删除,或者如果我滑到第二页然后向后滑动到第一页,那么我会看到正确的图像。整个视图跳起来!

我尝试翻转故事板中的所有不同设置。我甚至将大部分绘图移到了代码中并且从故事板中移出以便手动设置约束。这些是我玩的设置。尝试了很多组合,但现在大部分时间都没有了。

enter image description here

这是前后。如何阻止视图上下跳跃。另外,有趣的是,如果我从第3页滑到第2页,那么第2页向上移动。如果我继续回到第1页,然后向后滑动到第2页,则第2页将返回到正确的位置。因此,深入了解我进入第2页的方式是不同的布局。从1到2,第2页是正确的。从3到2,第2页向上移动。

enter image description here

我无法让布局留在一个地方。

另一个选择是在页面视图控制器中关闭NavigationController并在没有它的情况下进行处理。

因此...

1)我怎样才能停止跳跃 - 最佳情况

2)当pageviewcontroller启动时如何关闭导航控制器 - 第二个选项

我的pageviewcontroller的页面是通过此代码

调用的
 instantiateViewController(withIdentifier: "itemDetail\(num)ViewController")

其中'num'是1,2或3.使用索引数组和viewControllerBefore以及viewControllerAfter方法。分页本身工作正常。

由于

2 个答案:

答案 0 :(得分:0)

这不能回答如何使故事板工作的问题。这仍然是一个谜。但是,通过执行以下操作,我能够解决移动布局的奇怪行为。

我从Storyboard中删除了所有绘图,并将所有内容放入代码中。例如,我已经定义了一个容器视图......

// The container
let containerView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.white
    view.translatesAutoresizingMaskIntoConstraints = false
    view.layer.masksToBounds = true
    return view
}()

然后我将容器相对于UIViewController的视图放置

    view.addSubview(containerView)

    containerView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    containerView.topAnchor.constraint(equalTo: view.topAnchor, constant: 155).isActive = true
    containerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true
    containerView.heightAnchor.constraint(equalTo: view.heightAnchor, constant: -155).isActive = true

同样,我已经在代码中定义了所有其他控件,然后将它们添加到containerView子视图中,然后相对于containerView进行了所有操作。

当我在PageViewController

的页面之间滑动时,这可以保持一切

答案 1 :(得分:0)

我遇到了同样的问题,并找到了解决方案。您只需在automaticallyAdjustsScrollViewInsets中停用viewDidLoad即可。这是我的代码:

override func viewDidLoad()
{
    super.viewDidLoad()
    self.dataSource = self

    self.automaticallyAdjustsScrollViewInsets = false
    if let detailsVC = viewControllersList.first as? DetailsViewController
    {
        detailsVC.delegate = self
        self.setViewControllers([detailsVC], direction: .forward, animated: true, completion: nil)
    }
}

对此answer的信任。