ios - 如何进行布局以处理 iOS 8 中自定义呈现的 View Controller 的通话中(双高)状态栏?

标签 ios iphone cocoa-touch uiviewcontroller ios8

在 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/

相关文章:

iphone - 触摸开始驳回 View

xcode - 如何在nib中轻松设计UIScrollView的内容

ios - 将框架和应用程序扩展目标添加到 IOS 应用程序项目,我做得对吗?

iphone - 请问这个泄漏内存

iOS官方待办教程: List View Controller does not display correctly

iphone - 当主线程繁忙时运行 UIActivityIndi​​catorView

ios - 将分数添加到已保存的分数中

javascript - HTML 5 Canvas addHitRegion 不适用于 iOS(未定义不是函数)

iphone - 在 UItextview 中一次启用滚动属性并禁用(复制、全选、定义)属性

iOS 通过本地通知显示特定的 View Controller