在iOS中解除视图控制器时,ContentInset设置错误

mar*_*ian 7 uitableview uiviewcontroller ios xamarin

在我的iOS应用程序(使用Xamarin开发)中,我使用自定义容器视图控制器在与a UITableView的段相关联的不同子视图控制器(均包含a ) 之间切换 UISegmentedControl.

在开始contentInset时,当切换到新的视图控制器时,我遇到了错误分配的问题,因为视图位于导航栏下方.我用这个其他stackoverflow 问题中提出的解决方案解决了这个问题,它就像魅力一样.

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

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

我试过将automaticallyAdjustsScrollViewInsets两者都设置为true和false,但结果是一样的.

更新:似乎问题仅在iOS 8中出现,但在iOS 7中未出现

Swi*_*ect 5

综合

摆脱contentInset. UINavigationControllerSegmented Control View Controller和每个table view controller之间插入一个。

它在故事板中的外观

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

在此处输入图片说明

连接分段控件

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

这是整个班级。总共 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
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

兼容性

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

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