文章目录
  1. 1. Safe Area
  2. 2. UIBarButtonItem 按钮偏移
  3. 3. Swift4
    1. 3.1. @objc 修饰符
    2. 3.2. NSAttributedString
    3. 3.3. JSON
    4. 3.4. String

Safe Area

什么是 Safe Area?由于iPhone X 屏幕上的刘海和四周的圆角设计,导致某些区域无法用于执行交互,需要开发者对页面做出调整。而 Safe Area就是再减去 UInavigationbar 和 UITabbar 剩下的区域。具体可以看iOS 11 安全区域适配总结这篇文章,已经说得很具体了。 而我们要面临的实际问题就是 UIViewController 的 automaticallyAdjustsScrollViewInsets 属性被废弃了,所以现在 UIScrollView 自动调整 ContentInset 的行为需要自己管理,而不是交给 UIViewController 了。就是 UIScrollView 中新增的 UIScrollViewContentInsetAdjustmentBehavior 属性,将其设置成 .never 关闭自动调整。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
#define  adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)

之前的修改之后,有的 UITableView 如果还出现偏移的问题,那也可能是 Self-Sizing 的原因,在 iOS 11 中现在是默认启用。解决办法是手动设置 header 或者 footer 高度:

1
2
3
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

UIBarButtonItem 按钮偏移

在 iOS11 之前 navigationBarButton 是直接添加在 navigationBar 上面的,而现在苹果添加了新的类来管理,navigationBarButton 添加在 _UIButtonBarStackView 上面,而 _UIButtonBarStackView 则添加在 _UINavigationBarContentView 上面。 要想把按钮往边上挪,以前可以通过 UIBarButtonSystemItemFixedSpace,将按钮挤到边缘。现在则由于 _UIButtonBarStackView 的原因,已经失效。现阶段的办法是:

1
2
3
if (@available(iOS 11.0, *)) {
[self.rightBtn setContentEdgeInsets:UIEdgeInsetsMake(0, 15, 0, -15)];
}

这个办法的缺点是治标不治本,按钮的的响应范围其实没有变化。看看以后有更好的解决办法没。 ps:有了。iOS11 导航栏按钮位置问题的解决——新 很好很强大。

Swift4

虽说比上次的升级小一些,但是一堆报错还是少不了的。还好 Xcode 的转换器可以帮我们解决大部分问题,需要手动修改的并不多。

@objc 修饰符

Swift4 中弃用了 @objc 属性推断,所以 #selector 参数指定的实例方法必须使用 @objc 修饰。直接选中定位到相应位置,追加 @objc 修饰即可。

NSAttributedString

NSFontAttributeName、NSForegroundColorAttributeName 等属性,统统转为 NSAttributedStringKey.font、NSAttributedStringKey.foregroundColor 等,更加 Swift 化。

JSON

Swift 终于添加了对 JSON 解析的原生支持,可喜可贺。下面只是最简单的使用方法,更多功能可以参考Swift 4 JSON 解析指南

1
2
3
4
5
6
7
let jsonData = jsonString.data(encoding: .utf8)!
let decoder = JSONDecoder()
do {
let beer = try! decoder.decode(Beer.self, for: jsonData)
} catch let encodeError {
print(encodeError.localizedDescription)
}

可以解码,当然也可以进行编码:

1
2
3
4
5
6
7
let encoder = JSONEncoder()
do {
let data = try encoder.encode(beer)
let str = String.init(data: data, encoding: .utf8)!
} catch let encodeError {
print(encodeError.localizedDescription)
}

String

String 的 characters 属性被废弃了,现在可以直接使用 count 得出长度。 截取字符串的方法现在修改为 prefix(upTo:).dropFirst()de等,返回的参数不是 String 类型,而是新增的 Substring 类型。

文章目录
  1. 1. Safe Area
  2. 2. UIBarButtonItem 按钮偏移
  3. 3. Swift4
    1. 3.1. @objc 修饰符
    2. 3.2. NSAttributedString
    3. 3.3. JSON
    4. 3.4. String