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];
}
}
我在重新编码或 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];
}
}