适配iPhoneX常用的宏定义及方法
过了好久,今天终于有时间总结一下适配iPhone X相关的坑,总的来说有两类坑,一个是导航栏+状态栏的高度发生了变化,一个是一些没有实现实现-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:等代理方法的UITableView会出错位的问题。
1. 判断是否iPhone X:返回YES或NO
1.1 判断:宏
(1)依据屏幕分辨率
三目运算法
1
2
|
//是否iPhoneX YES:iPhoneX屏幕 NO:传统屏幕
#define kIs_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake( 1125 , 2436 ), [[UIScreen mainScreen] currentMode].size) : NO)
|
多行逻辑判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//是否iPhoneX 1:iPhoneX屏幕 0:传统屏幕
#define kIs_iPhoneX_test ({\
int tmp = 0 ;\
if ([UIScreen instancesRespondToSelector:@selector(currentMode)]) {\
if (CGSizeEqualToSize(CGSizeMake( 1125 , 2436 ), [[UIScreen mainScreen] currentMode].size)) {\
tmp = 1 ;\
} else {\
tmp = 0 ;\
}\
} else {\
tmp = 0 ;\
}\
tmp;\
})
|
其中,反斜杠\并不是注释或者其它的无用符号,其实是多行宏换行必须要用的标志。
最后一句tmp;\也是必须的,因为要将经过逻辑判断得到的tmp作为该宏的返回值。
(2)依据屏幕尺寸
1
2
3
|
#define kIs_iPhoneX (kSCREEN_WIDTH == 375 .f && kSCREEN_HEIGHT == 812 .f)
#define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
|
1.2 判断:方法
方法:依据设备型号
1
2
3
4
5
6
7
8
9
10
11
|
+(BOOL)getIs_iPhoneX{
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
if ([platform isEqualToString:@ "iPhone10,3" ]||[platform isEqualToString:@ "iPhone10,6" ]) {
return YES;
} else {
return NO;
}
}
|
2. 灵活返回状态栏+导航栏的高度
需求:灵活得到导航栏+状态栏的高度,作为一个子视图Y轴的起点。
宏定义
1
|
#define kStatusBarAndNavigationBarHeight (kIs_iPhoneX ? 88 .f : 64 .f)
|
调用范例
1
2
|
//自动适配
_segmentedControl.frame = CGRectMake( 0 , kStatusBarAndNavigationBarHeight, kSCREEN_WIDTH, 55 );
|
3. 拓展:获得iOS系统与App版本信息
获取iOS系统版本号:返回字符串
1
2
3
|
+ (NSString *)getSystemVersion{
return [[UIDevice currentDevice] systemVersion];
}
|
获取App版本号:返回字符串
1
2
3
4
5
6
|
+ (NSString *)getAppVersion{
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
// 获取App的版本号
NSString *appVersion = [infoDic objectForKey:@ "CFBundleShortVersionString" ];
return appVersion;
}
|
4. 适配iPhone X的其他问题
适配iPhone X和Xcode 9的过程中,除了与导航栏相关的问题,还有一个问题经常出现,就是UITableView相关的问题。下面两个办法可以解决多数错位的问题。
VC创建tableView属性的时候这样设置
1
2
3
|
self.tableView.estimatedRowHeight = 0 ;
self.tableView.estimatedSectionHeaderHeight = 0 ;
self.tableView.estimatedSectionFooterHeight = 0 ;
|
还可以这样设置
1
2
3
4
|
//cell自适应高度
self.tableView.rowHeight = UITableViewAutomaticDimension;
//预估行高
self.tableView.estimatedRowHeight = 44 .0f;
|
关于根视图的安全区
iOS新增了个safeArea,原来的老代码中,规定子视图跟根子视图的关系的代码需要新增一个判断:当iOS 11时,需要改为子视图跟根子视图的安全区的关系。这样就不会在iPhone X的底部虚拟home有任何控件干扰了。
1
2
3
4
5
|
if (@available(iOS 11.0 , *)) {
make.edges.equalTo(self.view.safeAreaInsets)
} else {
make.edges.equalTo(self.view)
}
|
当然,一般除了tabbar不能放在这个底部虚拟home区,其它的视图tableView视图或者网页视图时可以放在底部虚拟home区中的。这时候,不需要强调必须把子视图放在safeArea之内,原来的老代码也就不用改。
适配iPhoneX常用的宏定义及方法相关推荐
- 来,看看这20个常用的宏定义!
关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 作者:李肖遥 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用的宏定义. 1 ...
- C语言中宏定义使用方法详解
C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define PRINT_CLINE() printf("%d", ____ ...
- VS工程中常用路径宏定义表示
VS IDE中常用路径 表示 $(SolutionDir) 即解决方案配置文件 xxx.sln所在的目录例如 D:\WorkSpace\CPPWorkSpace\TestDLL\ $(ProjectD ...
- ios 常用的宏定义
#pragma mark - shortcuts #ifdef QA # define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数 ...
- php 如何宏定义,php – 在html中实现宏定义的方法
也许显而易见,但C预处理器可以完成这项工作. index._html #define _em(a) a #define _image(a, b) #define _list(a, b, c) a \ ...
- iOS日常工作之常用宏定义大全
前言: 在工作中, 很多小伙伴都会在PCH文件定义一些常用的宏,但是又怕写这些简单的宏浪费时间,又有时候忘记怎么定义了怎么办?本人在工作中也是如此.所以在这里给大家分享一些常用的宏定义,喜欢的小伙伴可 ...
- iOS常用宏定义大全
宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...
- C/C++常用宏定义,注意事项,宏中#和##的用法
总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...
- C语言之一些值得被定义为常用C语言头文件库的漂亮宏定义
原文连接:https://mp.weixin.qq.com/s/OICAfQgMKWfBLuZbp2gCBw 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等. ...
最新文章
- linux下创建多进程,linux之多进程fork:进程创建
- 网络爬虫-爬取微博热门话题前15个
- opencv实现快速傅立叶变换和逆变换
- SpringBoot 使用Swagger2打造在线接口文档(附源代码)
- html如何获得网址,已知一个网址,如何获得该网址对应的html源代码?在del 找人事管理软件...
- mysql模糊查询与预编译_mysql预编译模糊查询恶心了我一天的时间,终于弄好了。但是还有一点不明白。如下:...
- 初级程序员为避免淘汰该怎么办?
- Android TextView 带背景的文字垂直方向显示(ems属性)
- PG13用pg_rman进行备份恢复
- Java实现Excel导入和导出,看这一篇就够了(珍藏版)
- 令牌环网 IEEE802.5
- 社会化媒体驱动营销转型
- OCT图像层次分割相关论文泛读
- 如何保证测试质量之Bug管理规范及流程
- 强化学习——多智能体强化学习
- mysql 自己的ip怎么查看_如何查看连接mysql的ip地址
- 什么是云服务和云服务端开发?
- java excel相同的合并_Java使用Apache POI合并Excel连续相同内容的单元格
- CTFHUB-WEB-文件上传【06】
- 带你了解什么是Nginx(实操反向代理-负载均衡)
热门文章
- 微信之父张小龙谈移动互联网产品:我所说的都是错的!
- MySQL(三)-数据类型
- 一款综合(QQ 音乐、微信、美团、优酷、虎牙直播等多款 app)风格的搜索控制器...
- 2013.10.30 当着众人面批评一位员工
- sql学习---datepart函数的使用
- 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现
- 益阳安化云台山风景区,周末去亲子游——湘中第一条玻璃栈道
- 鸿蒙系统2.0升级机型,鸿蒙系统2.0升级将覆盖华为的大面积的主流机型
- 降压恒流工作灯方案 4线6珠 AP5218车灯恒流芯片
- Java进阶学习第二十六天(JavaScript增强、AJAX基础)