美文网首页
iPhoneX 刘海儿打理指南

iPhoneX 刘海儿打理指南

作者: Aloesshine | 来源:发表于2017-10-23 10:52 被阅读0次

概述

iOS11 中增加了 SafeArea 的概念,规定了苹果建议的最合适的内容展示区域。

在iPhoneX中

  • 状态栏高度由 20pt 变为 44pt
  • 导航栏以上高度由 64pt 变为 88pt
  • 底部工具栏需要为 home indicator 留出 34pt 边距

Frame 布局

UIView

UIView 中新增了以下属性,我们可以利用此属性来知道当前 view 所需要下移以及加高的值。

@property(nonatomic, readonly) UIEdgeInsets safeAreaInsets;

  • 通常在 - (void)layoutSubviews 方法中使用 safeAreaInsets 布局
- (void)layoutSubviews {
    [super layoutSubviews];
     if (@available(iOS 11.0, *)) {
         self.titleLabel.frame = CGRectMake(0, self.view.safeAreaInsets.top, 100, 100);
     }
}

UIViewController

UIViewController 中新增了以下属性来设置 safeAreaInsets

@property(nonatomic) UIEdgeInsets additionalSafeAreaInsets;

viewSafeAreaInsetsDidChange 的调用顺序:

- (void)viewDidLoad
- (void)viewWillAppear
- (void)viewSafeAreaInsetsDidChange // safeArea 改变时调用
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
- (void)viewDidAppear
  • 只有在调用 viewSafeAreaInsetsDidChange 及以后的方法才能获得 view 和 Controller 的UIEdgeInsets(44,0,34,0)。所以在 viewDidLoad 中根据 safeAreaInsets 设置界面会有问题

AutoLayout 布局

UIView 中还有一个用于 AutoLayout 布局的属性

@property(nonatomic, readonly, strong) UILayoutGuide *safeAreaLayoutGuide;

  • Masonry 1.1.0 已更新了 SafeArea 相关的用法
// 尽量使用这种方式
[self.label mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.penBtn.mas_left);
    make.top.equalTo(self.view.mas_top).priorityMedium();
    if (@available(iOS 11.0, *)) {
        make.top.greaterThanOrEqualTo(self.view.mas_safeAreaLayoutGuideTop);
    }
 }];

// 如果 iphoneX 和其他机型偏移量不同且无法用 SafeArea 相关属性解决,再用这样的方式
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    if ([UIDevice awe_isIPhoneX]) {
        if (@available(iOS 11.0, *)) {
            make.top.greaterThanOrEqualTo(self.view.mas_safeAreaLayoutGuideTop).offset(12);
        }
    } else {
        make.top.equalTo(self.view).offset(30);
    }
    make.right.lessThanOrEqualTo(self.view.mas_left).offset(10);
    make.centerX.equalTo(self.view);
}];

一些Tips

  • 适配时尽量使用 SafeArea 相关的属性,不要简单粗暴的直接指定偏移量的大小
// 错误示范!!!不要这样搞!!!
[self.cancelButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(@(74));
        make.height.equalTo(@(74));
        if ([UIDevice awe_isIPhoneX]) {
            make.top.equalTo(@(20));
        } else {
            make.top.equalTo(@(0));
        }
        make.right.equalTo(@(0));
}];

// 这样才是对哒~!
[self.cancelButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(@(74));
        make.height.equalTo(@(74));
        make.right.equalTo(@(0));
        make.top.equalTo(self.view.mas_top).priorityMedium();
        if (@available(iOS 11.0, *)) {
            make.top.greaterThanOrEqualTo(self.view.mas_safeAreaLayoutGuideTop);
        }
}];
  • 常用的宏
    • 一般用于 frame 的改变,AutoLayout 中尽量不要用
#define STATUS_BAR_HEIGHT [UIApplication sharedApplication].statusBarFrame.size.height
#define STATUS_BAR_NORMAL_HEIGHT ([UIDevice isIPhoneX] ? STATUS_BAR_HEIGHT : 20)
#define TAB_BAR_HEIGHT          49
#define NAVIGATION_BAR_HEIGHT   ([UIDevice isIPhoneX] ? 88 : 64)
#define NAVIGATION_BAR_OFFSET   ([UIDevice isIPhoneX] ? 24 : 0)
#define IPHONE_X_BOTTOM_OFFSET   ([UIDevice isIPhoneX] ? 34 : 0)         
  • 判断机型 : 不到万不得已不要用这个方法!不到万不得已不要用这个方法!不到万不得已不要用这个方法!
#import <sys/utsname.h>

+ (BOOL)isIPhoneX {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]) {
        return YES;
    }
    return NO;
}

相关文章

网友评论

      本文标题:iPhoneX 刘海儿打理指南

      本文链接:https://www.haomeiwen.com/subject/uhiouxtx.html