现在这个阶段适配iPhone X的等刘海屏幕的手机方式有很多,一个是通过代码来适配还有一种是通过Xib、StoryBoard。
首先是我们来说一下代码适配,既然是适配iPhone X,当然需要知道需要适配哪些机型,返回YES代表是异形曲面屏
#import <SystemConfiguration/CaptiveNetwork.h>
/**
判断手机是否是异形屏幕
@return YES 是 异形屏幕
*/
+ (BOOL)iphoneIsProfiledScreen {
struct utsname systemInfo;
uname(&systemInfo);
NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
if([platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"] || [platform isEqualToString:@"iPhone11,8"] || [platform isEqualToString:@"iPhone11,2"] || [platform isEqualToString:@"iPhone11,6"] || [platform isEqualToString:@"iPhone11,4"] ) {
return YES;
} else {
return NO;
}
}
由于iPhoneX以后状态栏又20变成了44,所以我们一般都会加入几个全局变量的宏定义
//判断手机机型导航高度
#define SafeAreaTopHeight ([NSObject iphoneIsProfiledScreen] ? 88 : 64)
#define SafeAreaStatusHeight ([NSObject iphoneIsProfiledScreen] ? 44 : 20)
#define SafeAreaMoreThanHeight ([NSObject iphoneIsProfiledScreen] ? 24 : 0)
/// 底部宏
#define SafeAreaBottomHeight ([NSObject iphoneIsProfiledScreen] ? 34 : 0)
这样我们就可以根据不同的机型适配不同的高度,在iOS11以后有一个ViewController等滚动方法废弃了,但是同时滚动视图多了一个新的方法,为了保证视图偏移的
OC
if (@available(iOS 11.0, *)){
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}else{
self.automaticallyAdjustsScrollViewInsets = NO;
}
swift
if #available(iOS 11.0, *) {
UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false;
}
当然了如果是系统自带的导航和分栏控制器那就没有太大的适配问题
第二种就是Xib、StoryBoard。这个方法就是直接在Xib、StoryBoard上进行适配,当然了这种最好是使用自定义导航,因为系统自带的会自动适配。
我们自定义导航的时候是需要一个view的,因为X的导航高度和状态栏一共88、别的机型是64,但是这里分别包含了44和20的状态栏高度所以我们在写布局的时候只需要去除状态栏高度,直接写44高度的布局既可,线面是效果图和拖线位置
好多人看到这里可能会说,那上面的状态怎么办,下面这些代码便是状态栏的解决方法
平常我们状态栏状态是导航一样的,所以我们要改变状态栏颜色(保持导航一样)既可,下面这个代码就是每一个页面都可以更改状态栏颜色,我们平常每一个导航和状态栏颜色都是一样的,所以我们一般都是写在父类一次性就可以了,下面这个代码添加到info.plist文件中
<key>UIStatusBarHidden</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
下面这个代码就是更改状态栏颜色
OC
//设置状态栏颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
swift
func setStatusBarBackgroundColor(color :UIColor) {
let statusBarWindow :UIView=UIApplication.shared.value(forKey:"statusBarWindow")as!UIView
let statusBar:UIView = statusBarWindow.value(forKey:"statusBar") as!UIView
if statusBar.responds(to:#selector(setter:UIView.backgroundColor)) {
statusBar.backgroundColor = color
}
}
这样我们就实现了状态和导航布局保持一致了,下面是效果图
这样我们就可以适配iPhoneX等机型了,其他适配基本同理既可