iOS 11新特性与适配

iOS 11正式发布了,下面整理了一些该版本下的特点还有如何进行兼容适配工作。

1. UIView变化

1.1. 更加方便的RTL边距设置

在之前的系统中我们会使用layoutMargins来获取和设置控件显示内容部分的边缘与控件边缘的距离。在iOS 11中,新增directionalLayoutMargins属性来指定边距。这两个属性的结构定义如下:

typedef struct UIEdgeInsets {
   
    CGFloat top, left, bottom, right;
} UIEdgeInsets;
typedef struct NSDirectionalEdgeInsets {
   
    CGFloat top, leading, bottom, trailing; 
} NSDirectionalEdgeInsets

从结构上看主要是将UIEdgeInsets结构的leftright调整为NSDirectionalEdgeInsets结构的leadingtrailing。这一调整主要是为了Right To Left(RTL)语言下可以进行自动适配,例如:要实现文本每行尾部边距设置为30px,在以前做法则需要判断语言来区分哪些是RTL语言,然后再做设置,如:

if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft)
{
   
    // Right to left 语言下每行尾部在左边
    self.view.layoutMargins.left = 30;
}
else
{
   
    self.view.layoutMargins.right = 30;
}

iOS 11 后则可以一步到位,如:

self.view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(0, 0, 0, 30);

注:测试时需要添加RTL本地化语言才能看到效果

1.2. 安全区域

在iOS 11中新增了安全区域的概念,目的是告诉开发者在这个区域下绘制的内容的显示才是有效的,否则会存在被遮挡的情况(特别是iPhoneX那帅气的刘海)。在UIView中新增safeAreaLayoutGuidesafeAreaInsets来获取屏幕的安全区域(对于frame布局时是很有用的)。如图所示:

SafeArea示意图

举个例子,在一个空白的UIViewController中,分别在viewDidLoadviewDidAppear方法中输出view.safeAreaInsets观察边距情况,代码如下:

- (void)viewDidLoad
{
   
    [super viewDidLoad];
    
    NSString *edgeStr = NSStringFromUIEdgeInsets(self.view.safeAreaInsets);
    NSString *layoutFrmStr = NSStringFromCGRect(self.view.safeAreaLayoutGuide.layoutFrame);
    NSLog(@"viewDidLoad safeAreaInsets = %@, layoutFrame = %@", edgeStr, layoutFrmStr);=
}

- (void)viewDidAppear:(BOOL)animated
{
   
    [super viewDidAppear:animated];
    
    NSString *edgeStr = NSStringFromUIEdgeInsets(self.view.safeAreaInsets);
    NSString *layoutFrmStr = NSStringFromCGRect(self.view.safeAreaLayoutGuide.layoutFrame);
    NSLog
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值