针对已经打开的页面
- 定义一个属性, 记录是否要更新frame。
@property (nonatomic, assign)BOOL isUpdateFrame;
- 在
viewDidLoad
方法中添加观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarChanged) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
- 观察者监听到变化之后 调用方法
- (void)statusBarChanged {
self.isUpdateFrame = YES;
}
- 在
viewDidLayoutSubviews
方法中 修改子控件的frame 修改偏移影响的控件的frame。一般整体的控件是修改frame.size.height, 底部的是修改frame.origin.y。视具体情况而定。
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.isUpdateFrame) {
self.isUpdateFrame = NO;
CGRect frame = self.wkWebview.frame;
if ([[UIApplication sharedApplication] statusBarFrame].size.height == 40) {
frame.size.height -= 20;
} else {
frame.size.height += 20;
}
self.wkWebview.frame = frame;
}
}
针对新打开的页面
- 使用masnory或者其它的进行适配的没有这种问题
- 使用frame坐标的 屏幕高度使用宏定义
iPhoneX等有刘海的屏幕手机不需要适配, 通话或连接热点等时状态栏高度不会变。只需要适配有home键的手机。
#define kscreenheight ([UIScreen mainScreen].bounds.size.height - ([[UIApplication sharedApplication] statusBarFrame].size.height == 40 ? 20 : 0))
使用全局的 以后方便修改。
网友评论