Unity适配iphone刘海屏

news/2024/11/25 10:54:56/

首先,我们是通过获取iOS设备的的Device Type,根据特定的型号来判断为是否是刘海屏的,比如如果DeviceType是:iPhone10.3 或 iPhone10.6 或 iPhone11.6,那么就认为是刘海屏的。

我们需要写objective-c接口来获取DeviceType

//IOSGameTools.mm#include <string.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <stdlib.h>extend "C" const char* IOSGetDeviceType()
{size_t size;sysctlbyname("hw.machine", NULL, &size, NULL, 0);if(size <= 0)return NULL;char *machine = (char*)malloc(size);if(NULL == machine)return NULL;sysctlbyname("hw.machine", machine, &size, NULL, 0);return machine;}

注:在Unity中如何把objective-c代码打入xcode工程中,

见:Unity与iOS交互(XUPorter的使用)

或见:Unity的IOS导出工程配置工具xcodeapi

 

Unity的C#中,封装一下接口:

//UnityIOSGameTools.cs#if UNITY_IOS
using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;class UnityIOSGameTools
{[DllImport("__Internal")]private static extern string IOSGetDeviceType();private static string UnityIOSGetDeviceType(){return IOSGetDeviceType();}//判断iOS是否是刘海屏public static bool IsIOSBangSreen(){var deviceType = UnityIOSGetDeviceType();bool isLiuhai = false;Match match = Regex.Match(deviceType, @"[^\d]*(\d*)[^\d]*");if(null != match){var version = int.Parse(match.Groups[1].Value);isLiuhai = version >= 11;}return "iPhone10.3" == deviceType || "iPhone10.6" == deviceType || isLiuhai;}
}
#endif

调用:

if(UnityIOSGameTools.IsIOSBangScreen())
{//是刘海屏
}

具体的适配方法,要看工程中用的是NGUI还是uGUI

NGUI的话,可以利用UIWdiget的Anchors,左右贴边往里偏44像素,底部贴边往上偏70像素,顶部贴边往下偏54像素

var w = gameObject.GetComponent<UIWidget>();
w.leftAnchors.absolute += 44;
w.rightAnchors.absolute -= 44;
w.bottomAnchors.absolute += 70;
w.topAnchors.absolute -= 54;

uGUI原理一样,不再赘述

 

如果你有更好的识别刘海屏的方法,欢迎在评论区留意讨论


附:

iOS设备DeviceType查看:https://support.hockeyapp.net/kb/client-integration-ios-mac-os-x-tvos/ios-device-types

DEVICE TYPEPRODUCT NAME
iPhone1,1iPhone
iPhone1,2iPhone 3G
iPhone2,1iPhone 3GS
iPhone3,1iPhone 4 (GSM)
iPhone3,3iPhone 4 (CDMA)
iPhone4,1iPhone 4S
iPhone5,1iPhone 5 (A1428)
iPhone5,2iPhone 5 (A1429)
iPhone5,3iPhone 5c (A1456/A1532)
iPhone5,4iPhone 5c (A1507/A1516/A1529)
iPhone6,1iPhone 5s (A1433/A1453)
iPhone6,2iPhone 5s (A1457/A1518/A1530)
iPhone7,1iPhone 6 Plus
iPhone7,2iPhone 6
iPhone8,1iPhone 6s
iPhone8,2iPhone 6s Plus
iPhone8,4iPhone SE
iPhone9,1iPhone 7 (A1660/A1779/A1780)
iPhone9,2iPhone 7 Plus (A1661/A1785/A1786)
iPhone9,3iPhone 7 (A1778)
iPhone9,4iPhone 7 Plus (A1784)
iPhone10,1iPhone 8 (A1863/A1906)
iPhone10,2iPhone 8 Plus (A1864/A1898)
iPhone10,3iPhone X (A1865/A1902)
iPhone10,4iPhone 8 (A1905)
iPhone10,5iPhone 8 Plus (A1897)
iPhone10,6iPhone X (A1901)
iPad1,1iPad
iPad2,1iPad 2 (Wi-Fi)
iPad2,2iPad 2 (GSM)
iPad2,3iPad 2 (CDMA)
iPad2,4iPad 2 (Wi-Fi, revised)
iPad2,5iPad mini (Wi-Fi)
iPad2,6iPad mini (A1454)
iPad2,7iPad mini (A1455)
iPad3,1iPad (3rd gen, Wi-Fi)
iPad3,2iPad (3rd gen, Wi-Fi+LTE Verizon)
iPad3,3iPad (3rd gen, Wi-Fi+LTE AT&T)
iPad3,4iPad (4th gen, Wi-Fi)
iPad3,5iPad (4th gen, A1459)
iPad3,6iPad (4th gen, A1460)
iPad4,1iPad Air (Wi-Fi)
iPad4,2iPad Air (Wi-Fi+LTE)
iPad4,3iPad Air (Rev)
iPad4,4iPad mini 2 (Wi-Fi)
iPad4,5iPad mini 2 (Wi-Fi+LTE)
iPad4,6iPad mini 2 (Rev)
iPad4,7iPad mini 3 (Wi-Fi)
iPad4,8iPad mini 3 (A1600)
iPad4,9iPad mini 3 (A1601)
iPad5,1iPad mini 4 (Wi-Fi)
iPad5,2iPad mini 4 (Wi-Fi+LTE)
iPad5,3iPad Air 2 (Wi-Fi)
iPad5,4iPad Air 2 (Wi-Fi+LTE)
iPad6,3iPad Pro (9.7 inch) (Wi-Fi)
iPad6,4iPad Pro (9.7 inch) (Wi-Fi+LTE)
iPad6,7iPad Pro (12.9 inch, Wi-Fi)
iPad6,8iPad Pro (12.9 inch, Wi-Fi+LTE)
iPad6,11iPad 9.7-Inch 5th Gen (Wi-Fi Only)
iPad6,12iPad 9.7-Inch 5th Gen (Wi-Fi/Cellular)
iPad7,1iPad Pro (12.9 inch, A1670)
iPad7,2iPad Pro (12.9 inch, A18219)
iPad7,3iPad Pro (10.5 inch, A1701)
iPad7,4iPad Pro (10.5 inch, A1709)
iPad7,5iPad (6th gen, A1893)
iPad7,6iPad (6th gen, A1954)
iPod1,1iPod touch
iPod2,1iPod touch (2nd gen)
iPod3,1iPod touch (3rd gen)
iPod4,1iPod touch (4th gen)
iPod5,1iPod touch (5th gen)
iPod7,1iPod touch (6th gen)

 

新出的iPhone10s的DeviceType是 iPhone11.6


补充:

后面发现unity可以直接用SystemInfo来判断

using UnityEngine.SystemInfo;if(SystemInfo.deviceModel.Contains("iPhone10,3") || SystemInfo.deviceModel.Contains("iPhone10,6"))
{// 是iOS刘海屏var wr = topLeft.GetComponent<UIWidget>();wr.leftAnchor.absolute += 30;
}

 


http://www.ppmy.cn/news/427449.html

相关文章

A1043

没做出. 关键点&#xff1a; 1、将二叉搜索树建起来. 2、先序镜像遍历二叉搜索树. 3、后序镜像遍历二叉搜索树. #include<cstdio> #include<cstdlib> #include<string.h> #include<math.h> #include<iostream> #include<vector> #include…

当pytest遇上poium会擦出什么火花

当pytest遇上poium会擦出什么火花 首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开…

python安装0x80072ee7_电脑错误0x80072EE7 - 卡饭网

小方法教你关闭电脑错误报告问题 小方法教你关闭电脑错误报告问题 一、使用组合键“Win+R”,然后输入gpedit.msc 打开本地组策略编辑器,如下图所示: 二、打开本地组策略编辑器,我们找到“用户配置”→ “管理模板”→“Windows组件”→“Windows错误报告”,如下图所示: …

远程端电脑出现网络故障的应用办法

随着网速的提升以及高性能计算的要求&#xff0c;使用便携笔记本连接远程端的计算设备&#xff08;服务器或实验室的电脑等&#xff09;成为常见的一种工作方式。然而&#xff0c;由于计算机系统以及网络等原因&#xff0c;远程端的电脑会莫名的掉线&#xff0c;从而导致远程连…

多重选定怎么撤销_怎样取消电脑多重网络 - 卡饭网

win7电脑多重网络怎么办 win7电脑多重网络怎么办 1.任务栏上,点击"网络和共享中心"项,然后在网络和Internet面板上,点击"更改适配器设置"项; 2.在弹出的"网络连接"对话框上,右键单击"本地连接"项,选择"属性"; 3.接着在网络选…

使用电信 TR069 内网架设 WireGuard 隧道异地组网

❝ 本文转自 Steins;Gate&#xff0c;原文&#xff1a;https://www.kryii.com/89.html&#xff0c;版权归原作者所有。欢迎投稿&#xff0c;投稿请添加微信好友&#xff1a;cloud-native-yang TR069 内网是运营商用于下发光猫管理网络的内网&#xff0c;同一运营商同一省份的内…

xp系统怎样访问校园网服务器,有线校园网电脑连接教程

Windows XP下建立PPPoE宽带连接的方法 1、鼠标右键点击网上邻居选择属性。 2、左键单击本地连接左侧的『创建一个新的连接』 3、出现“欢迎使用新建连接向导”画面,直接单击“下一步” ★注意:直接选择『开始->程序->附件->通讯->新建连接向导』也可以打开新建连…

家庭宽带搭建个人服务器

家庭宽带搭建个人服务器 家庭宽带搭建个人服务器准备1.公网IP1.1光猫改桥接模式 2.一台PC主机 安装PVE系统1.下载PVE镜像文件2.制作U盘启动盘 PVE安装Centos1.创建虚拟机2.启动虚拟机 完成centos安装步骤即可 域名解析实现公网访问1.测试公网连接 家庭宽带搭建个人服务器 想必…