【问题标题】:IOS Hybrid App - Avoiding the safe area on iPhone 11IOS Hybrid App - 避开 iPhone 11 上的安全区域
【发布时间】: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。

请有人告诉我我做错了什么吗?是否有一些内部视图约束不是第一次执行,而是在轮换后执行?

【问题讨论】:

    标签: iphone wkwebview


    【解决方案1】:

    解决这个问题的方法有两个

    1. 首先在 viewDidAppear 中创建 WKWebView,而不是在 viewDidLoad 中,因为直到 viewDidAppear 才能以编程方式访问 safeAreaInserts 值

    2. 其次,在创建WKWebView框架时使用safeAreaInserts中的值,如下

      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];
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-02
      • 2018-03-03
      • 2018-03-22
      • 2018-08-13
      • 1970-01-01
      • 2018-01-06
      • 2018-06-26
      相关资源
      最近更新 更多