iPhoneX适配

目录(?)[-]

  1. 核心代码
  2. 自动化修改代码
  3. 参考资料

iPhoneX适配,比较搓的一种方式,在不修改分辨率(720 x 1280)的情况下适配

iphone X 主屏尺寸: 5.8英寸 主屏分辨率: 2436 x 1125


核心代码

修改 工程目录/Classes/UnityAppController.mm 文件

判断的方式比较搓,以 iPhone X 的宽高的 与众不同来判断

为了不调整分辨率的情况下适配(这里是 竖屏 应用),高度改为 150 是最好的值。(横屏 应用修改 height 为 width,y为 x 即可)

  • 找到方法

    这里写图片描述

  • 代码

    //    _window         = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];CGRect winSize = [UIScreen mainScreen].bounds;if (winSize.size.height / winSize.size.width > 2) {winSize.size.height -= 150;winSize.origin.y = 75;::printf("-> is iphonex hello world\n");} else {::printf("-> is not iphonex hello world\n");}_window = [[UIWindow alloc] initWithFrame: winSize];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 运行效果

    这里写图片描述


自动化修改代码

不用每次打xcode后都需要手动修改

参考:https://www.cnblogs.com/pandawuwyj/p/6904770.html

  1. 增加一个修改 文件的类

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;namespace UnityEditor.XCodeEditor
    {public partial class XClassExt : System.IDisposable{private string filePath;public XClassExt(string fPath){filePath = fPath;if (!System.IO.File.Exists(filePath)){Debug.LogError(filePath + "not found in path.");return;}}public void WriteBelow(string below, string text){StreamReader streamReader = new StreamReader(filePath);string text_all = streamReader.ReadToEnd();streamReader.Close();int beginIndex = text_all.IndexOf(below);if (beginIndex == -1){Debug.LogError(filePath + " not found sign in " + below);return;}int endIndex = text_all.LastIndexOf("\n", beginIndex + below.Length);text_all = text_all.Substring(0, endIndex) + "\n" + text + "\n" + text_all.Substring(endIndex);StreamWriter streamWriter = new StreamWriter(filePath);streamWriter.Write(text_all);streamWriter.Close();}public void Replace(string below, string newText){StreamReader streamReader = new StreamReader(filePath);string text_all = streamReader.ReadToEnd();streamReader.Close();int beginIndex = text_all.IndexOf(below);if (beginIndex == -1){Debug.LogError(filePath + " not found sign in " + below);return;}text_all = text_all.Replace(below, newText);StreamWriter streamWriter = new StreamWriter(filePath);streamWriter.Write(text_all);streamWriter.Close();}public void Dispose(){}}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
  2. 打包后处理,动态修改 xcode配置 及 文件内容

    using System;
    using System.IO;
    using System.Collections.Generic;
    using UnityEditor;
    using UnityEngine;
    using UnityEditor.Callbacks;#if UNITY_EDITOR_OSXusing UnityEditor.iOS.Xcode;
    using UnityEditor.XCodeEditor;#endifpublic class Package {#if UNITY_EDITOR_OSX[PostProcessBuildAttribute(100)]public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) {if (target != BuildTarget.iOS) {Debugger.LogWarning("Target is not iPhone. XCodePostProcess will not run");return;}// Create a new project object from build targetPBXProject project = new PBXProject();string configFilePath = PBXProject.GetPBXProjectPath(pathToBuiltProject);project.ReadFromFile(configFilePath);string targetGuid = project.TargetGuidByName("Unity-iPhone");string debug = project.BuildConfigByName(targetGuid, "Debug");string release = project.BuildConfigByName(targetGuid, "Release");project.AddBuildPropertyForConfig(debug, "CODE_SIGN_RESOURCE_RULES_PATH", "$(SDKROOT)/ResourceRules.plist");project.AddBuildPropertyForConfig(release, "CODE_SIGN_RESOURCE_RULES_PATH", "$(SDKROOT)/ResourceRules.plist");project.AddFrameworkToProject(targetGuid, "SystemConfiguration.framework", true);project.AddFrameworkToProject(targetGuid, "Security.framework", true);project.AddFrameworkToProject(targetGuid, "libz.tbd", true);project.AddFrameworkToProject(targetGuid, "libc++.tbd", true);project.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");project.WriteToFile(configFilePath);EditSuitIpXCode(pathToBuiltProject);}public static void EditSuitIpXCode(string path) {//插入代码//读取UnityAppController.mm文件string src = @"_window         = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];";string dst = @"//    _window         = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];CGRect winSize = [UIScreen mainScreen].bounds;if (winSize.size.height / winSize.size.width > 2) {winSize.size.height -= 150;winSize.origin.y = 75;::printf(""-> is iphonex aaa hello world\n"");} else {::printf(""-> is not iphonex aaa hello world\n"");}_window = [[UIWindow alloc] initWithFrame: winSize];";string unityAppControllerPath = path + "/Classes/UnityAppController.mm";XClassExt UnityAppController = new XClassExt(unityAppControllerPath);UnityAppController.Replace(src, dst);}#endif}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75


参考资料

  • http://blog.csdn.net/nicepainkiller/article/details/78926077

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

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

相关文章

leetcode142 环形链表II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有…

jquery、javascript实现(get、post两种方式)跨域解决方法

&#xfeff;&#xfeff;jquery、javascript实现(get、post两种方式)跨域解决方法一、实现get方式跨域请求数据浏览器端<script> $(document).ready(function(){$.ajax({url: "http://www.xxx.cn/index.php",type: "get",dataType: "jsonp&quo…

leetcode41 缺失的第一个正数

给定一个未排序的整数数组&#xff0c;找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 说明: 你的算法的时间复杂度应为O(n)&#xff0c;并且只能使用常数级别的空间。 思路&am…

Linux(11)-Ubuntu装系统

Ubuntu18.04装系统单系统双系统启动项dell 5820进不去bios。单系统 装过好多次ubuntu系统&#xff0c;每次要重装之前总是得搜索各种教程。现在总结一份简略教程如下&#xff0c;以备哪天装系统之需。 1.官网上下载Ios文件:https://ubuntu.com/download/desktop 2.找一个U盘…

Harris的角点检测和特征匹配

一.特征检测&#xff08;提取&#xff09; 基于特征的图像配准方法是图像配准中最常见的方法之一。它不是直接利用图像像素值&#xff0c;二十通过像素值导出的符号特征&#xff08;如特征点、特征线、特征区域&#xff09;来实现图像配准&#xff0c;因此可以克服利用灰度信息…

开始入坑深度学习(DeepLearning)

现在游戏越来越难做,国家广电总局审核越来越变态,国家各种打压游戏,游戏产业也成为教育失败的背锅侠,所以本人现在开始做深度学习方向。 深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、The…

《盘点那些秀你一脸的秒天秒地算法》(1)

本系列坚持格式&#xff1a;1个抖机灵算法2个较简单但是天秀的算法1个较难天秀算法。 bogo排序 Bogo排序(Bogo-sort)&#xff0c;又被称为猴子排序&#xff0c;是一种恶搞排序算法。 将元素随机打乱&#xff0c;然后检查其是否符合排列顺序&#xff0c;若否&#xff0c;则继续…

《盘点那些秀你一脸的秒天秒地算法》(3)

斐波那契之美 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、因数学家列昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”。 这个数列就是1、1、2、3、5、8、13…

《盘点那些秀你一脸的秒天秒地算法》(4)

防止新手错误的神级代码 #define ture true #define flase false #difine viod void #define mian main #define &#xff1b; ; 以后有新手问题就把这几行代码给他就好啦。 不用额外空间交换两个变量 a 5 b 8 #计算a和b两个点到原点的距离之和&#xff0c;并且赋值给…

为啥用redis解决会话呢?

什么是会话&#xff1f; 会话可简单理解为&#xff1a;用户开一个浏览器&#xff0c;点击多个超链接&#xff0c;访问服务器多个web资源&#xff0c;然后关闭浏览器&#xff0c;整个过程称之为一个会话。 •会话过程中要解决的一些问题&#xff1f; –每个用户不可避免各自会…

听说你还在纠结自己没访问量?成不了“博客专家”?

一、提高浏览量的技巧 相信很多人都这么想过&#xff1a;“我文章写的这么好&#xff0c;怎么就没人看呢&#xff1f;”&#xff1b; 或者这样想过&#xff1a;“这文章写得明明比我烂很多&#xff0c;凭什么这么多浏览量&#xff1f;”&#xff1b; 虽然在我看来这是极其严…

关系数据库——范式/反范式的利弊权衡和建议

范式&#xff08;避免数据冗余和操作异常&#xff09; 函数依赖 A->B A和B是两个属性集&#xff0c;来自同一关系模式&#xff0c;对于同样的A属性值&#xff0c;B属性值也相同 平凡的函数依赖 X->Y&#xff0c;如果Y是X的子集 非平凡的函数依赖 X->Y&#xff…

pytorch学习入门 (二) Variable(变量)

Variable&#xff08;变量&#xff09; autograd.Variable 是包的核心类. 它包装了张量, 并且支持几乎所有的操作. 一旦你完成了你的计算, 你就可以调用 .backward() 方法, 然后所有的梯度计算会自动进行. 你还可以通过 .data 属性来访问原始的张量, 而关于该 variable&#…

leetcode1033. 移动石子直到连续

三枚石子放置在数轴上&#xff0c;位置分别为 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子&#xff0c;并将该石子移动到某一整数位置 k 处&#xff0c;其中 x &…

pytorch学习 训练一个分类器(五)

训练一个分类器 就是这个, 你已经看到了如何定义神经网络, 计算损失并更新网络的权重. 现在你可能会想, 数据呢? 一般来说, 当你不得不处理图像, 文本, 音频或者视频数据时, 你可以使用标准的 Python 包将数据加载到一个 numpy 数组中. 然后你可以将这个数组转换成一个 to…

【软考中级】网络工程师:8.网络安全

本章考察内容比较广泛&#xff0c;考题对知识点都会有所涉及。 8.1 网络安全的基本概念 8.1.1 网络安全威胁的类型 窃听 这种情况发生在广播式网络系统中&#xff0c;每个节点都可以读取数据&#xff0c;实现搭线窃听、安装通信监视器和读取网上的信息等。 假冒 当一个实体…

caffe网络结构图绘制

绘制网络图通常有两种方法&#xff1a; 一种是利用python自带的draw_net.py&#xff0c;首先安装两个库&#xff1a; sudo apt-get install graphviz sudo pip install pydot 接下来就可以用python自带的draw_net.py文件来绘制网络图了。 draw_net.py执行时带三个参数&…

理解Caffe的网络模型

目录 1. 初见LeNet原始模型2. Caffe LeNet的网络结构3. 逐层理解Caffe LeNet 3.1 Data Layer3.2 Conv1 Layer3.3 Pool1 Layer3.4 Conv2 Layer3.5 Pool2 Layer3.6 Ip1 Layer3.7 Relu1 Layer3.8 Ip2 Layer3.9 Loss Layer 1. 初见LeNet原始模型 Fig.1. Architecture of original …

caffe开始训练自己的模型(转载并验证过)

学习caffe中踩了不少坑&#xff0c;这里我参考了此博主的文章&#xff0c;并体会到了如何训练自己的模型&#xff1a;http://www.cnblogs.com/denny402/p/5083300.html 学习caffe的目的&#xff0c;不是简单的做几个练习&#xff0c;最终还是要用到自己的实际项目或科研中。因…

图像拼接(一):柱面投影+模板匹配+渐入渐出融合

这种拼接方法的假设前提是&#xff1a;待拼接的两幅图像之间的变换模型是平移模型&#xff0c;即两幅图像同名点位置之间只相差两个未知量&#xff1a;ΔxΔx 和ΔyΔy&#xff0c;自由度为2&#xff0c;模型收得最紧。所以只有所有图像都是用同一水平线或者同一已知倾斜角的摄…