IOS Hybrid App - Избегание безопасной зоны на iPhone 11 - PullRequest
0 голосов
/ 01 ноября 2019

Для моего гибридного приложения 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.

Пожалуйста, кто-нибудь может сказать мне, что я делаю не так? Некоторые ограничения внутреннего вида не применяются впервые, но применяются после поворота?

1 Ответ

0 голосов
/ 02 ноября 2019

Решение этого - двукратное

  1. Сначала создайте WKWebView в viewDidAppear, а не в viewDidLoad, так как только в viewDidAppear вы можете программно получить доступ к значениям safeAreaInserts

  2. Во-вторых, используйте значения в safeAreaInserts при создании фрейма WKWebView, как показано ниже

    smallScreen = [deviceType hasPrefix:@"iPhone"];
    topMargin   = [UIApplication sharedApplication].statusBarFrame.size.height ;
    if (@available(iOS 11, *)) topMargin = self.view.safeAreaInsets.top ;
    bottomMargin = 0 ;
    if (@available(iOS 11, *)) bottomMargin = self.view.safeAreaInsets.bottom ;
    
    int top    = (smallScreen && appW > appH)? 0    : topMargin ;
    int height = (smallScreen && appW > appH)? appH : appH - topMargin - bottomMargin ;
    NSLog (@"Top %d, Height %d",top,height);
    
    webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, top , appW, height) configuration:theConfiguration];
    
...