我正在尝试以编程方式(没有IB和Storyboard)创建视图控制器层次结构。如果我使用普通的UIViewController
,则一切正常:
// My app delegate
func application(application: UIApplication, didFinishLaunchingWithOptions options: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let vc = UIViewController(nibName: nil, bundle: nil)
vc.view = UIView(frame: CGRectZero)
vc.view.backgroundColor = UIColor.whiteColor()
let label = UILabel(frame: CGRectMake(0, 0, 100, 40))
label.text = "Hello!"
vc.view.addSubview(label)
vc.title = "Title"
self.window.rootViewController = vc
self.window.makeKeyAndVisible()
return true
}
然后,我尝试将视图控制器放入导航控制器中:
func application(application: UIApplication, didFinishLaunchingWithOptions options: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// vc created the same way as above.
let nav = UINavigationController(rootViewController: vc)
self.window.rootViewController = nav
self.window.makeKeyAndVisible()
return true
}
并且标签隐藏在导航栏下方。
因此,很显然,导航视图控制器无法正确调整视图的大小。我尝试设置内部vc的框架,但是没有效果,可能是因为事情是由autolayout处理的?我应该添加一些约束以使其像IB / Storyboard中那样正常工作,还是应该以其他方式做一些事情?
最佳答案
您的视图已正确调整大小,但在iOS 8中,由于条形可以是半透明的,因此默认情况下,视图会在其下延伸。 (这就是您的标签被导航栏隐藏的原因)
据我了解,您想使用半透明的条形,但您不希望内容最终出现在它们之下。为此,您可以编辑视图控制器的edgesForExtendedLayout属性。
vc.edgesForExtendedLayout = UIRectEdgeNone
此属性告诉您应在半透明条(左,右,顶部,底部,全部,无,或这些的任何组合)下延伸哪些边缘,默认情况下为UIRectEdgeAll。
有关更多信息,请查看documentation和此guide。