Ionic v1 安全区域不适用于 Xcode 11.5 模拟器

Posted

技术标签:

【中文标题】Ionic v1 安全区域不适用于 Xcode 11.5 模拟器【英文标题】:Ionic v1 safe areas not working on Xcode 11.5 simulator 【发布时间】:2020-07-16 12:44:22 【问题描述】:

在将 Xcode 10 升级到 11.5 并升级 Cordova/ionic v1 应用程序的其他组件后,之前在 iPhoneX/iPhone11 上获得全屏的解决方案 - 缺口安全区/无白/黑条 - 不再有效。屏幕在notch 后面向上推。

在 index.html 中: <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

在 CSS body 和 Ionics .tabs 中,以下代码不再有效:

body 
  padding-top: constant(safe-area-inset-top) ;
  padding-top: env(safe-area-inset-top) ;


.tabs 
  padding-top: constant(safe-area-inset-top) ;
  padding-top: env(safe-area-inset-top) ;

有没有人可以解决这个问题?

我不确定这是否相关,但我开始怀疑它是。在从 CLI 编译应用程序开始时,我收到了一些 gulp 消息 cannot load gulp ...。我的应用程序编译时出错或失败 - 并且可以很好地部署到模拟器设备。但我想知道 gulp/sass 问题是否导致了我看到的 safe zone UI 布局问题。

% ionic cordova build ios
> ionic-v1 build
[08:16:10] Cannot load gulp: ReferenceError: primordials is not defined
[08:16:10] Cannot load gulp: ReferenceError: primordials is not defined
[08:16:10] Cannot run sass task: missing in gulpfile.js
[08:16:10] Cannot load gulp: ReferenceError: primordials is not defined
> cordova build ios

和我的构建环境:

% ionic info

Ionic:
   Ionic CLI         : 6.10.1 (/usr/local/lib/node_modules/@ionic/cli)
   Ionic Framework   : ionic1 1.0.0
   @ionic/v1-toolkit : 1.0.22

Cordova:
   Cordova CLI       : 9.0.0 (cordova-lib@9.0.1)
   Cordova Platforms : ios 5.1.1
   Cordova Plugins   : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 5.0.0, (and 32 other plugins)

Utility:
   cordova-res : 0.15.1
   native-run  : not installed

System:
   ios-deploy : 1.10.0
   ios-sim    : 8.0.2
   NodeJS     : v14.5.0 (/usr/local/Cellar/node/14.5.0/bin/node)
   npm        : 6.14.5
   OS         : macOS Catalina
   Xcode      : Xcode 11.5 Build version 11E608c

% gulp -v
CLI version: 2.3.0
Local version: 3.9.1

【问题讨论】:

我回滚到 node@10 - 与修复 gulp/sass 错误的旧 Mac 上的工作相同,但没有解决 UI 问题,safe-areas 仍然没有很荣幸,我的 UI 在 iPhoneX 上被推到了后面 我这里也有同样的问题。您找到解决此问题的方法了吗? @FernandoGhisi - 我做到了。实际上。我昨晚才想通了。原来我的项目中有其他设置导致冲突。让我在下面发布我的最终解决方案作为答案。 @FernandoGhisi - 我的决议贴在下面。 【参考方案1】:

我之前的回答是针对仍在 iPhone 上运行 UIWebView 的 Ionic v1 应用程序。但由于 App Store 将不再接受带有 UIWebView 的应用程序,我不得不将我的应用程序切换到 WKWebView。 CORS 有点让人头疼,但更大的问题是所有适用于 Ionic v1 UIWebView 应用程序的代码都在运行 WkWebView 的同一个 Ionic v1 应用程序中中断。

我不知道为什么我总是不得不做一些特殊的事情来处理notch iPhone,但我确实认为这与仍在使用 Ionic V1 有关。下面我花了很长时间才弄清楚,但解决方案比上面 UIWebView 的解决方案简单得多:

将 Ionic v1 TABS 与 cordova-plugin-ionic-webview 一起使用:

在 app.js 中:

if (window.StatusBar) 
  StatusBar.hide() ;

在 custom.css 文件中:

/* this pushes down the ion-header-bar for 'notch' iPhones */
.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) 
  height: 44px;
  margin-top: constant(safe-area-inset-top); /* iOS 11.0 */
  margin-top: env(safe-area-inset-top) ;

/* this is for parent of ion-nav-title for 'notch' iPhones */
.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) > * 
  margin-top: 0px;

/* this pushes down ion-content for 'notch' iPhones */
.platform-ios.platform-cordova:not(.fullscreen) .has-header:not(.bar-subheader) 
  top: 44px;  /* this needs to match the height set for ion-header-bar */
  padding-top: constant(safe-area-inset-top); /* iOS 11.0 */
  padding-top: env(safe-area-inset-top) ;

/* this pushes button tab bar up from behind iPhone HOME button */
.tabs 
  /* padding not needed, but it eliminates a 1px border at top of nav bar */
  padding-top:0px !important;  /* over rides .tabs @media i ionic.app.css */
  margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
  margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */

【讨论】:

【参考方案2】:

我的标签现在位于我的应用底部 - 我原来的帖子标签栏仍在顶部。我知道其他人会批评这个答案,但经过几个月与缺口手机布局的角力,我终于解决了问题:

注意:以下解决方案适用于使用 UIWebView 的手机 - iOS 不再接受该解决方案。下面是 WkWebView 的自定义解决方案

在 Xcode 中,在 Target -> General 上,取消选中 Hide Status Bar & Requires full screen。

在项目 index.xml 中:

在正文标签中...与所有其他帖子的直觉相反,我删除了:

body 
  //padding-top: constant(safe-area-inset-top) ;  - remove both of these lines.
  //padding-top: env(safe-area-inset-top) ;  

然后我补充说:

/* this is for ion-header-bar for 'notch' iPhones*/
/* the default is 64px and creates a very large/tall nav-title bar */
.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)   
  height: 44px;


/* this is for parent of ion-nav-title for 'notch' iPhones */
.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) > * 
  margin-top: 0px; 


/* sets margin beneath tabs, pushing them up so they are not behind iPhone home button */
.tab-nav 
  margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
  margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */

然后在我的 app.js 文件中,我添加了这段代码来检测手机是否有缺口 - 然后相应地隐藏/显示状态栏。使用缺口手机,StatusBar.show() 会将 ion-header-bar 推到缺口下方。

if (ionic.Platform.isIOS()) 
  deviceData.iosStatusBar = 20 ;
  if (hasNotch() == true) 
    //global object to track if phone has notch or not.
    deviceData.iosNotch = true ;
    console.log("NOTCH FOUND, Applying safe-area CSS") ;
    // do NOT apply ionic.Platform.fullScreen() if phone has notch
    if (window.StatusBar)           
      StatusBar.show() ;  // show ios status bar, forces ion-header-bar down below notch
      StatusBar.overlaysWebView(false); 
    
   else 
    deviceData.iosNotch = false ;
    // if not notch, then force app to full screen. 
    ionic.Platform.fullScreen();
    if (window.StatusBar) 
      StatusBar.hide();   // hide ios status bar
      StatusBar.overlaysWebView(true);
    
  

然后函数检测手机是否有缺口:

function hasNotch() 
  if (CSS.supports('padding-bottom: env(safe-area-inset-bottom)')) 
    let div = document.createElement('div');
    div.style.paddingBottom = 'env(safe-area-inset-bottom)';
    document.body.appendChild(div);
    let calculatedPadding = parseInt(window.getComputedStyle(div).paddingBottom, 10);
    document.body.removeChild(div);
    if (calculatedPadding > 0) 
      return true;
    
  
  return false;

【讨论】:

非常感谢,@rolinger。它似乎工作得很好!我仍然遇到标签栏的一些问题(我的位于某些屏幕的顶部),但您给了我更多资源可供使用。 @FernandoGhisi - 很酷。很高兴它对你有效。顶部的选项卡有什么问题?如果它们仍然落后于缺口...删除.nav-bar margin-bottom: ... 并重新添加body padding-top: ...。对于底部的标签,body padding-top 代码将我的标签推到屏幕下方/离开屏幕。您需要将边距放在顶部,而不是底部。如果这有效,请接受这个答案是正确的。谢谢。 事实上,选项卡低于预期位置。无论如何,我最终使用了一个更简单的解决方案(更具体到我的情况),在 CSS 中进行了一些调整——但你给了我一些非常有用的提示。再次感谢。

以上是关于Ionic v1 安全区域不适用于 Xcode 11.5 模拟器的主要内容,如果未能解决你的问题,请参考以下文章

安全区域布局指南不适用于情节提要中的 UITableViewController

安全区域布局指南不适用于 UITableView 的 BackgroundView

评级插件不适用于 Ionic 3

本地通知中的属性“触发器”不适用于 ionic 3

Cordova 插件不适用于 ionic

ionic 3 的内页不适用于 ionic 3 中的脚本或外部自定义 jQuery 插件