在我的iOS应用程序(使用Xamarin开发)中,我使用自定义容器视图控制器在与UISegmentedControl的段相关联的不同子视图控制器(都包含UITableView)之间切换.
在开始时,我遇到了切换到新视图控制器时分配的错误contentInset的问题,因为视图位于导航栏下方.我用其他stackoverflow question中提供的解决方案解决了这个问题,它就像魅力一样.
现在的问题是其中一个子视图控制器以模态方式呈现另一个视图控制器,当它被解除时,contentInset再次设置错误.在这种情况下,tableview从可用空间的中间开始,导航栏和第一行之间有相当多的空白区域.
我试图了解哪个方法隐式更改内容插入,但我没有运气.那么,什么方法可能是这种行为的罪魁祸首?
我试过将automaticAdjustsScrollViewInsets设置为true和false,但结果是一样的.
更新:似乎问题仅在iOS 8中出现,而在iOS 7中出现
解决方法
Synposis
摆脱contentInset.在分段控制视图控制器和每个表视图控制器之间插入UINavigationController.
它如何在故事板中看起来
虽然您不需要使用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
})
}
}
}
兼容性
上面的代码没有说明如何使用Segue Present Modally或“Show(例如Push)”来推送视图控制器,因为它超出了此响应的范围,并且两者都已经过验证.
在iPhone 4s到6 Plus上进行构建和测试,每个iPad,人像,风景,方向更改,iOS 7和更高版本8.