在我的iOS应用程序(使用Xamarin开发)中,我使用自定义容器视图控制器在与UITableView
的段相关联的不同子视图控制器(均包含UISegmentedControl
)之间切换。
一开始我遇到了在切换到新视图控制器时分配错误contentInset
的问题,因为视图位于导航栏下方。我用其他stackoverflow question中提供的解决方案解决了这个问题,它就像魅力一样。
现在的问题是其中一个子视图控制器以模态方式呈现另一个视图控制器,当它被解除时,contentInset
再次设置错误。在这种情况下,tableview从可用空间的中间开始,在导航栏和第一行之间有相当多的空白区域。
我试图了解哪个方法隐式更改内容插入,但我没有运气。那么,什么方法可能是这种行为的罪魁祸首?
我尝试将automaticallyAdjustsScrollViewInsets
设置为true和false,但结果是一样的。
更新:似乎问题仅在iOS 8中出现,但在iOS 7中未出现
答案 0 :(得分:4)
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&amp; 8。