1

我有一个UIViewController(使用Swift)pageviewcontroller导航控制器内部导致布局问题

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

self.openViewControllerBasedOnIdentifier("Items") 

这工作得很好,我得到这些幻灯片菜单视图之一....

Initial Lists view from slider menu

我然后在右上角的添加按钮,你可以推动添加新的项目。添加按钮调出一个PageViewController。我使用页面视图,因为有多个页面的细节与正在添加的项目相关联。这也适用于我得到的pageviewcontroller启动,我可以翻页。

问题是页面上元素的位置在某些情况下(它不一致)转移。

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

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

enter image description here

这里是之前和之后。我该如何阻止视图跳跃和跳跃。另外,有趣的是,如果我从页面3滑动到页面2,则页面2向上移动。如果我继续返回到第1页,然后再滑回到第2页,则第2页返回到正确的位置。所以深入我输入page-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方法。分页本身工作正常。

谢谢

回答

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

0

我有同样的问题的页面之间滑动,并找到了解决办法。您只需要在您的viewDidLoad中禁用automaticallyAdjustsScrollViewInsets。这里是我的代码:

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) 
    } 
} 

Credits to this answer