iOS 如果在录制或 phone 通话期间状态栏增加,自定义键盘的框架会缩小 20 点?

iOS Custom keyboard's frame shrinks 20 points if status bar increases during recording or phone call?

我在重新编码或 phone 调用期间 iOS(真实)设备上的键盘扩展有问题(iOS 模拟器没有红色状态栏)。由于状态栏增加了 20 点,自定义键盘在 Y 轴上也移动了 20 点,并将其 height 减少到 196 点(应该是 216 点)。但是,当我打印 view.frame 时,它显示 {{0.0, 0.0}, {320.0, 196.0}}.

Here is the screenshot.

如果我使用故事板而不是以编程方式添加视图,则效果很好。一开始我以为是因为topLayoutGuide.length,但是在调试区显示0.0.

我试图找到解决方案或与此问题相关的任何主题,但似乎只有我一个人面对它。 :(

您可以使用 UIApplicationWillChangeStatusBarFrameNotification 编写解决方法。

在您的 init 或 viewDidLoad 中:

let os = NSProcessInfo().operatingSystemVersion
if os.majorVersion == 9 && (os.minorVersion == 0 || os.minorVersion == 1) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "statusBarChange:", name:
        UIApplicationWillChangeStatusBarFrameNotification, object: nil)
}

并处理通知:

func statusBarChange(notification:NSNotification) {
    let newRect:CGRect? = notification.userInfo?[UIApplicationStatusBarFrameUserInfoKey]?.CGRectValue
    var heightOffset = CGFloat(20) - newRect!.height
}

然后您可以使用偏移量作为 Y 坐标来更新视图框架。

希望对您有所帮助。

对我有用的解决方法:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    if (CGRectGetMinY(self.view.superview.frame) > 0.f) {
        CGRect frame = self.view.superview.frame;
        frame.origin.y = 0.f;
        [self.view.superview setFrame:frame];
    }
}

基本上,我们正在寻找 superview 的框架,如果它被移动,我 "adjust" 它。

编辑:

TomSawyer所述,先前的解决方案存在问题。这个应该可以同时解决它们。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGRect frame = self.view.superview.frame;
    CGFloat dy = CGRectGetMinY(frame);
    if (dy > 0.f) {
        frame.origin.y = 0.f;
        frame.size.height += dy;
        [self.view.superview setFrame:frame];
    }
}