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

发现问题

测试在测试项目过程中,发现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手机都有刘海屏。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端布道人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值