Unity适配iphone刘海屏

48 篇文章 2 订阅

首先,我们是通过获取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;
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林新发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值