在 iOS 7 中,我能够通过添加约束来处理自定义呈现 View Controller 的布局,同时考虑通话状态栏,其中呈现 View Controller 与呈现 View Controller 具有相同的中心和相同的宽度和高度 View Controller 。这比对宽度和高度使用自动调整大小更可取,因为否则,当通话状态栏消失时,呈现的 View Controller 将出于某种原因从顶部向下推 20 点。
然而,在 iOS 8 中,这个技巧不再有效。一方面,我通过实验发现呈现 View Controller 似乎不一定在容器 View 中,所以我无法将那些约束添加到容器 View 中。 (对于 sample code 的 "A Look Inside Presentation Controllers" 2014 WWDC video 并没有将呈现 View Controller 放在那里。)似乎让呈现 View Controller 使用自动布局或自动调整大小填充容器 View 是可行的,但我发现当通话中状态栏消失时,容器 View 本身可能会保持下推 20 点(这在 iOS 7 中不是这种情况)。
我一直在研究 "A Look Inside Presentation Controllers" sample code ,但即使是这段代码也不能正确处理通话中的状态栏。 (顺便说一句,我仍在尝试掌握新的 UIPresentationController
API。)
最佳答案
对我有用的是为 UIApplicationWillChangeStatusBarFrameNotification
添加观察者,然后找到 transitionContext.containerView()
并更新框架。我在 View 调试时注意到,当返回到正常状态栏高度时,transitionContext.containerView()
框架没有更新。
func willChangeStatusBarFrame(notification: NSNotification)
{
if let userInfo = notification.userInfo
{
if let value = userInfo[UIApplicationStatusBarFrameUserInfoKey] as? NSValue
{
let statusBarFrame = value.CGRectValue()
let transitionView = UIApplication.sharedApplication().delegate!.window!!.subviews.last! as UIView
var frame = transitionView.frame
frame.origin.y = statusBarFrame.height-20
frame.size.height = UIScreen.mainScreen().bounds.height-frame.origin.y
UIView.animateWithDuration(0.35) {
transitionView.frame = frame
}
}
}
}
关于ios - 如何进行布局以处理 iOS 8 中自定义呈现的 View Controller 的通话中(双高)状态栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25882609/