微信小程序如何判断刘海屏

news2024/9/28 3:30:09

发现问题

测试在测试项目过程中,发现IPhone13按钮显示不全,但是IPhone 14 pro 没问题。

正常情况

非正常情况

找到原因

小程序没有适配全部刘海屏

刘海屏: 指的是手机屏幕正上方由于追求极致边框而采用的一种手机解决方案。因形似刘海儿而得名。刘海屏一词最早来源于2017年9月苹果公司发布的苹果 iPhone X

解决问题:小程序到底如何适配刘海屏

iPhone所有手机型号屏幕尺寸

为了便于适配,我找到了大部分iPhone手机屏幕尺寸

从iPhone 4至今

微信小程序 iPhone刘海屏系列机型适配

小程序判断刘海屏,得需要用到微信小程序一个API: wx.getSystemInfo(Object object): 获取系统信息

地址: https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html

使用

wx.getSystemInfo({
  success (res) {
    console.log(res) 
  }
})

可以看到,模拟器下,普通屏幕statusBarHeight为20,而刘海屏statusBarHeight为44。

真机下,model和模拟器有些出入,但都带iPhone字样。

刘海屏statusBarHeight在iOS14和iOS13及以下系统不一样,为47。

所以判断是iPhone刘海屏机型的条件就可以是:

model带iPhone字样 && statusBarHeight > 20

但是,要特别注意: iPhone 6 7 8 是没有刘海屏的

app.js 里写好全局变量

globalData: {  
  isIphoneX: false, // 当前设备是否为 iPhone X  
},

判断设备是否为刘海屏

checkIsIPhoneX() { 
  wx.getSystemInfo({
    success: (res) => {  
      //根据安全高度判断 ;  判断设备是否为刘海屏 
      if ((res.model.includes("iPhone 11") || res.model.includes("iPhone 12") || res.model.includes("iPhone 13") || res.model.includes("iPhone14,5") || res.model.includes("iPhone14")) || (res.model.includes("iPhone") && (res.model.includes("Pro") || res.model.includes("mini") || res.model.includes("X"))) && (res.statusBarHeight > 20)) {
        this.globalData.isIphoneX = true
      } else {
        this.globalData.isIphoneX = false
      }
    }
  })
},

控件适配刘海屏

方法一:写两个样式

var app = getApp();
data: {
  isIPhoneX: app.isIphoneX,
}
<view class="isIPhoneX ? bottomSafeHeight : bottomHeight">
  <view class="ok">确定</view>
  <view class="cancel">取消</view>
</view>
.bottomSafeHeight {  /*刘海屏底部高度*/
  height: 124rpx;
}
.bottomHeight {  /*普通屏幕底部高度*/
  height: 90rpx;
}

方法二:控件高度设为变量,在js中计算这个变量的值

let bottomHeight = getApp().globalData.isIPhoneXSeries ? 124 : 90
this.setData({
  bottomHeight: bottomHeight
})
<view style="height:{{bottomHeight}}rpx">
  <view class="ok">确定</view>
  <view class="cancel">取消</view>
</view>

齐活,问题解决。

app.js 全部代码

// app.js

App({
  onLaunch() { 
    this.checkIsIPhoneX();
  },
  globalData: {  
    isIphoneX: false, // 当前设备是否为 iPhone X  
  },

  checkIsIPhoneX() { 
    wx.getSystemInfo({
      success: (res) => {  
        //根据安全高度判断 ;  判断设备是否为刘海屏 
        if ((res.model.includes("iPhone 11") || res.model.includes("iPhone 12") || res.model.includes("iPhone 13") || res.model.includes("iPhone14,5") || res.model.includes("iPhone14")) || (res.model.includes("iPhone") && (res.model.includes("Pro") || res.model.includes("mini") || res.model.includes("X"))) && (res.statusBarHeight > 20)) {
          this.globalData.isIphoneX = true
        } else {
          this.globalData.isIphoneX = false
        }
      }
    })
  },
})

总结

这个适配比较简单,用一下微信小程序的API wx.getSystemInfo(Object object) 即可。

但是一定要考虑全面:不是所有的iphone手机都有刘海屏。

特别注意:本文中示例代码,判断手机型号那块,代码写的很烂,很有优化空间。 千万别直接使用,建议自行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java基础】消灭魔法值-常量枚举详述

&#x1f6a9; 本文已收录至专栏&#xff1a;JAVA基础 &#x1f44d;希望能对你有所帮助 一.引入 在开发中我们经常会遇到用一个值&#xff08;诸如数字或字符串&#xff09;表示一种状态的情况&#xff0c;例如&#xff1a; 用 1 表示男&#xff0c;用 0 表示女用 0 表示状态…

被裁员了,要求公司足额补缴全部公积金,一次补了二十多万!网友兴奋了,该怎么操作?...

被裁员后&#xff0c;能要求公司补缴公积金吗&#xff1f; 一位网友问&#xff1a; 被裁员了&#xff0c;要求公司把历史公积金全部足额缴纳&#xff0c;现在月薪2.3万&#xff0c;但公司每个月只给自己缴纳300元公积金&#xff0c;结果一次补了二十多万&#xff0c;一次性取出…

步进频雷达信号脉冲压缩仿真matlab

步进频雷达信号脉冲压缩仿真matlab 发射与回波信号模型仿真分析 发射与回波信号模型 步进频率信号发射得的是一串窄带的相参脉冲&#xff0c;每个脉冲的载频之间是均匀线性步进的&#xff0c;经过相参本振对目标回波信号进行混频、采样&#xff0c;再对同距离门的采样值做逆傅里…

java 入门Spring,SpringBoot,SpringCloud等技术全栈教程网站导航

我们整理了Java的全栈技术路线的各个精品网站&#xff0c;从最简单的基础语法&#xff0c;到核心JVM&#xff0c;到企业级开发Spring以及通信技术Netty等开发&#xff0c;每个网站都有对应的免费的精品教程。我们全部收录到 java 技术全栈学习导航http://​www.webhub123.com/…

高级服务框架(黑马)

一、修改order-service服务 修改OrderService&#xff0c;让其监听Nacos中的sentinel规则配置。 具体步骤如下&#xff1a; 1.引入依赖 在order-service中引入sentinel监听nacos的依赖&#xff1a; <dependency><groupId>com.alibaba.csp</groupId><…

电子专业英语(持续更新)

前言 23考研刚刚结束&#xff0c;但在我复试的两个学校的专业英语翻译我都不会。发现自己在专业英语方面很差&#xff0c;故写此文章记录我专业英语的学习历程 2023/4/17日学习 Analog /ˈnəlɒɡ/ signal 模拟信号 Continuous values 连续值…

怎样远程控制另一台电脑

有多种方法可以远程控制另一台计算机&#xff0c;您选择的方法将取决于您的具体需要和涉及的操作系统。以下是您可以遵循的一些一般步骤&#xff1a; 在目标计算机上启用远程访问&#xff1a;在 Windows 上&#xff0c;您可以通过转到“控制面板”>“系统和安全”>“系统…

DFIG控制10: 双馈发电机的动态模型

DFIG控制10&#xff1a; 双馈发电机的动态模型。主要介绍DFIG在三相坐标系、定子αβ坐标系、dq同步坐标系下的模型。 本文主要是整理了DFIG的动态模型的公式和坐标变换的过程。某些描述是为了便于自己理解&#xff0c;不一定准确。 大部分内容参考&#xff1a; G. Abad, J. …

Windows逆向安全(一)之基础知识(十二)

结构体 C语言中的结构体是一种自定义的数据类型&#xff0c;一个结构体里可由其它各种类型组合而成 声明结构体 举个简单的例子&#xff0c;自定义一个为player的类型&#xff0c;如下&#xff1a; struct Player{float hp; //人物血量float mp; …

MongoDB 聚合管道中使用数组表达式运算符判断数组中是否包含元素($in)并获取元素索引($indexOfArray)

数组表达式运算符主要用于文档中数组的操作&#xff0c;之前我们介绍了如果获取文档数组中的元素&#xff1a; MongoDB 聚合管道中使用数组表达式运算符获取数组中指定位置的元素($arrayElemAt&#xff0c;$first&#xff0c;$last)https://blog.csdn.net/m1729339749/article…

k8s 1.20 二进制安装

安装前的准备 CentOS Linux release 7.3.1611 (Core) 初始化系统参数 集群规划 192.168.6.20 master1 - etcd、kube-apiserver、kube-controller-manager、kube-scheduler 192.168.6.21 master2 - etcd、kube-apiserver、kube-controller-manager、kube-scheduler 192.168.6…

手牵手SpringBoot2集成Redis7

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis是一个NoSQL数据库&#xff0c;常用缓存(cache) Re…

注册苹果开发者账号的方法

在2020年以前&#xff0c;注册苹果开发者账号后&#xff0c;就可以生成证书。 但2020年后&#xff0c;因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号&#xff0c;所以需要缴费才能创建ios证书了。 所以新政策出来后&#xff0c;注册苹果开发者账号&#…

2023年2月安全更新补丁

一、2023年2月安全更新补丁 近日&#xff0c;微软发布了2023年2月安全更新补丁&#xff0c;共发布了75个漏洞的补丁程序&#xff0c;其中18个漏洞值得关注&#xff08;包括个7严重漏洞、11个重要漏洞&#xff09; Microsoft Windows是美国微软公司以图形用户界面为基础研发的…

SSM学习记录7:通过cdn引入vue进行使用

通过cdn引入vue进行使用 引入vue 和 vue-router&#xff0c;注&#xff1a;vue的版本要比router版本低一个版本&#xff0c;例vue2配router3 <!-- import Vue before Element --><script src"https://cdn.jsdelivr.net/npm/vue2.7.14"></script>&…

CloudEon云原生大数据平台

文章目录 [toc] 1. CloudEon是什么&#xff1f;2. gitHub地址和官网地址3. 官网教程4. 特性5. 架构6. 支持组件版本7. 安装部署7.1 部署前提7.1.1 Kubernetes环境准备&#xff08;必须&#xff09;7.1.2 SSH服务准备&#xff08;必须&#xff09;7.1.3 数据库环境准备&#xff…

【学习笔记】websocket数据帧

介绍 RFC官网给出的数据帧格式 字段解释 FIN&#xff08;1bit&#xff09;: 标记位&#xff0c;表示该数据帧是否为完整消息最后的数据帧。RSV1/2/3&#xff08;各1bit&#xff09;: 标记位&#xff0c;根据RFC的介绍&#xff0c;这三个bit位是用做扩展用途&#xff0c;没有…

rslidar_SDK二次开发

rslidar_SDK代码二开注意事项 文章目录 rslidar_SDK代码二开注意事项0.下载地址1.CMakeLists.txt1.1 Cmake里面&#xff0c;首先选择编译方式&#xff0c;原始ORIGINAL还是CATKIN&#xff0c;还是COLCON1.2 增加新增cpp文件位置1.3 如果选择ORIGINAL模式&#xff0c;需要额外增…

LabView中数组的使用2-1

在LabView中&#xff0c;数组用来管理相同类型的数据。 1 在前面板中创建数组 1.1 创建空数组 在前面板中创建数组时&#xff0c;首先在前面板中点击鼠标右键&#xff0c;弹出“控件”对话框&#xff0c;之后选择“新式->数组、矩阵与簇->数组”&#xff0c;在前面板中…

硬盘格式化工具,强烈推荐这个!

案例&#xff1a;硬盘格式化工具推荐 【我的电脑已经用了好几年了&#xff0c;硬盘存储容量严重不够了&#xff0c;最近想把它格式化&#xff0c;但却不知道怎么操作&#xff0c;大家有什么比较好的硬盘格式化工具可以推荐吗&#xff1f;】 硬盘作为存储设备&#xff0c;我们…