【发布时间】:2019-11-01 13:44:55
【问题描述】:
对于我的 IOS 混合应用程序,我以编程方式创建了一个 WKWebView,如下所示
- (void)viewDidLoad
{
[super viewDidLoad];
_statBarH = [UIApplication sharedApplication].statusBarFrame.size.height ;
appH = self.view.frame.size.height ;
appW = self.view.frame.size.width ;
webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:theConfiguration];
smallScreen = [deviceType hasPrefix:@"iPhone"];
if (smallScreen && appW > appH) {webView.frame = CGRectMake(0, 0 , appW, appH);}
else {webView.frame = CGRectMake(0, _statBarH, appW, appH - _statBarH);};
};
我还改变了设备旋转时 web 视图的大小,如下所示:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
appH = size.height ;
appW = size.width ;
if (smallScreen && appW > appH) {webView.frame = CGRectMake(0, 0 , appW, appH);}
else {webView.frame = CGRectMake(0, _statBarH, appW, appH - _statBarH);};
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
[webView evaluateJavaScript:@"IOSOrientationChanged()" completionHandler:nil];
}
];
}
javascript 函数 IOSOrientationChanged 仅以纵向或横向格式重绘我的应用内容,从 javascript window.innerWidth 和 window.innerHeight 检测新的高度和宽度
这种方法对我来说效果很好,直到 Apple 移除了 iPhone X 上的主页按钮,11 ...
在这些较新的手机上发生的情况(至少在 XCode 11 IOS 13 模拟器中,因为我买不起真正的)是,当第一次创建 web 视图时,它尊重上安全区域,但不尊重下安全区域安全区域。
但是,当我在模拟器中旋转设备时,webview 会考虑两个安全区域。
对于 iPhone 11,变量 appW 和 appH 在纵向为 414 和 896,在横向为 896 和 414。变量 _statBarH 纵向为 44,横向为 0。
但是在 web 视图中,window.innerHeight 的纵向初始设置为 852 (896-44),但旋转后设置为 838。
请有人告诉我我做错了什么吗?是否有一些内部视图约束不是第一次执行,而是在轮换后执行?
【问题讨论】: