在 iOS 中关闭视图控制器时 ContentInset 设置错误

ContentInset set wrong when dismissing view controller in iOS

在我的 iOS 应用程序(使用 Xamarin 开发)中,我使用自定义容器视图控制器在不同的子视图控制器(它们都包含一个 UITableView)之间切换UISegmentedControl.

一开始我在切换到新的视图控制器时遇到错误 contentInset 分配的问题,因为视图位于导航栏下方。我使用另一个 Whosebug question 中提供的解决方案解决了这个问题,并且效果很好。

现在的问题是其中一个子视图控制器以模态方式呈现另一个视图控制器,当它被关闭时,contentInset 再次设置错误。在这种情况下,tableview 从可用 space 的中间开始,在导航栏和第一行之间有相当多的白色 space。

我试图了解哪种方法隐式更改了内容插图,但我没有运气。那么,这种行为的罪魁祸首是什么方法?

我试过将 automaticallyAdjustsScrollViewInsets 设置为 true 和 false,但结果是一样的。

更新:这个问题似乎只在 iOS 8 中出现,但在 iOS 7

中没有出现

概要

干掉contentInset。在 Segmented Control View Controller 和每个 table view controller.

之间插入一个 UINavigationController

故事板中的外观

虽然您不需要使用 Storyboard 来实现此解决方案,但它提供了一个非常图形化的用户界面。

连接分段控件

同样,为了简单明了,我使用 Storyboard。如果适合您,欢迎您以编程方式创建每个导航控制器和视图控制器。

这是整个class。总共 30 行代码。

class SegmentedControlViewController: UIViewController {
    var segmentViewController:UIViewController? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        let vc = self.storyboard!.instantiateViewControllerWithIdentifier("nav0") as? UIViewController
        self.addChildViewController(vc!)
        self.view.addSubview(vc!.view)
        self.segmentViewController = vc
    }

    @IBAction func segmentedControlValueChanged(sender: AnyObject) {
        if let segmentedControl = sender as? UISegmentedControl {
            let identifier = "nav\(segmentedControl.selectedSegmentIndex)"
            let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifier) as? UIViewController

            self.addChildViewController(vc!)
            self.transitionFromViewController(self.segmentViewController!, toViewController: vc!, duration: 0, options: .TransitionNone, animations: { () -> Void in
                self.segmentViewController!.view.removeFromSuperview()
                //vc!.view.frame = self.view.bounds
                self.view.addSubview(vc!.view)
            }, completion: { (Bool) -> Void in
                vc!.didMoveToParentViewController(self)
                self.segmentViewController!.removeFromParentViewController()
                self.segmentViewController = vc
            })
        }
    }
}

兼容性

上面的代码没有显示如何使用 Segue Present Modally 或 `Show(例如 Push)推送视图控制器,因为它超出了此响应的范围并且都已经过验证。

在 iPhone 4s 到 6 Plus 上构建和测试,每个 iPad、纵向、横向、方向变化,iOS 7 和 8。