Для моего гибридного приложения 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);};
};
Я также изменяю размер веб-представления, когда устройство поворачивается следующим образом:
- (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, поскольку я не могу себе этого позволить по-настоящему), заключается в том, что когда веб-представление создается впервые, оноуважает верхнюю безопасную область, но не уважает нижнюю безопасную область.
Однако, когда я поворачиваю устройство в симуляторе, веб-просмотр учитывает обе безопасные области.
Для iPhone 11переменные appW и appH равны 414 и 896 в портретной ориентации и 896 и 414 в альбомной ориентации. Переменная _statBarH имеет 44 в портретной ориентации и 0 в альбомной ориентации.
Однако в веб-представлении window.innerHeight в портретной ориентации изначально имеет значение 852 (896-44), но после поворота - 838.
Пожалуйста, кто-нибудь может сказать мне, что я делаю не так? Некоторые ограничения внутреннего вида не применяются впервые, но применяются после поворота?