iOS 9开发小技巧
http://www.cocoachina.com/ios/20151217/14733.html
前言
"小黄鸭"法不仅适用于debug,也适用于学习新知识。表达是最好的吸收。本文原文发表在realm.io上。我翻译并整理成此文。希望可以为国内的iOS朋友提供一些资料。
LayoutGuide
在iOS 9.0和 OS X 10.11中,分别有两个新的类:UILayoutGuide 和 NSLayoutGuide。他们可以作为一种类似View的对象,参与到AutoLayout的布局约束中。作为一种新的布局解决方案,这两个类的出现使你无需再创建、显示无关的View了。举个栗子,原本需要一个空的UIView占位的地方,现在只需要用UILayoutGuide去替代它就可以了。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 创建LayoutGuidelet layoutGuideA = UILayoutGuide() let layoutGuideB = UILayoutGuide()// 添加到View上let view: UIView = ... view.addLayoutGuide(layoutGuideA) view.addLayoutGuide(layoutGuideB)// 用UILayoutGuide来添加布局约束layoutGuideA.heightAnchor.constraintEqualToAnchor(layoutGuideB.heightAnchor).active = true// 设置Identifier,为了方便DEBUGlayoutGuideA.identifier = "layoutGuideA" layoutGuideB.identifier = "layoutGuideB"// ...然后看看他们的Frame吧print("layoutGuideA.layoutFrame -> \(layoutGuideA.layoutFrame)") |
NSLayoutAnchor
iOS9中另一个新增的API是NSLayoutAnchor。它的出现不仅仅是让使用代码添加约束变得简洁明了。通过该类强大的静态检查能力,还提供了额外的约束正确定保证。举个栗子,考虑以下使用NSLayoutConstraintAPI创建的约束会出现什么问题:
|
1
2
3
4
5
6
7
8
|
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; |
这个约束是无效的。因为你将一个X轴上的属性(leading)同一个Y轴属性(top)绑定。然而,这个错误可以毫无警告地通过编译,在运行的时候默默地就失效了,最终留下一个出错的布局。由于这个错误不会产生任何的日志信息,导致极难debug。假如工程里有许多(成千上万)这样的约束代码,那对于维护来说真是一场噩梦。
好在NSLayoutAnchor利用了"泛型"解决了这个问题。"泛型"现在在Swift和Objective-C中都已经得到了支持。UIView中NSLayoutAnchor相关的存取方法,明确指出了需要哪些继承自NSLayoutAnchor的子类。这些子类被分为了三类,X轴,Y轴,和尺寸(宽/高),一种类型的Anchor只允许绑定约束到另外一个相同类型的Anchor上。通过指定NSLayoutAnchor中参数的类型,这个API可以通过类型检查,来避免创建出例子中无效的约束。
我们回到之前的例子,用NSLayoutAnchor来实现一下这个约束:
|
1
2
|
NSLayoutConstraint *constraint = [view1.leadingAnchor constraintEqualToAnchor:view2.topAnchor]; |
相比旧的API,新的API非常明显地提升了代码可读性。并且,当你传入错误的Anchor类型时,新的API会抛出一个"Incompatible pointer type"警告,因为编译器知道这个是两个不同的类。
想要了解更多,请查阅NSLayoutAnchor官方文档
HTTPS 和 HTTP
Apple介绍了iOS9中的App Transport Security,它要求所有App在默认情况下使用HTTPS来进行网络请求。由于不是所有的服务器都运行在HTTPS环境下,Apple也提供了相关的方法来禁用ATS。
如果你的App需要请求的网址不可控(比如说UIWebVeiw请求的网站,有可能是HTTP的,也有可能是HTTPS的),那么你应当将Info.plist文件中的NSAllowsArbitraryLoads设置为YES,来完全禁用ATS。出于数据安全考虑,在完全禁用ATS的情况下,你也应该为某些重要的站点打开ATS。你可以通过NSExceptionDomainskey来禁用/启用特定的站点的ATS。参照如下图片:

该plist文件允许用户在HTTP环境下下载文件,但是只能在HTTPS情况下访问"workflow.is"
需要提醒的是,ATS的设置只针对当前bundle。这意味着你不仅需要在你主项目的info.plist中添加ATS相关的Key,同时也需要在其他bundle下的info.plist中添加相关配置。
关于iOS9的适配,github上有一个中文项目iOS9AdaptationTips可以提供很大的帮助。
Storyboard Reference
Storyboard真是让人又爱又恨,每个在多人合作项目中使用Storyboard的人,都遇到过Storyboard文件的冲突。类似的冲突解决起来比较棘手,常常是以回滚告终。这一点直接造成了一些团队放弃使用Storyboard开发而推荐纯代码布局。
如果需要使用Storyboard,但又想最大化地避免冲突呢?最好的方法就是将UI划分的更小的、不同的Storyboard文件中。在过去如果想要做到这一点,意味跨Storyboard的跳转方法,需要在代码里完成:
|
1
2
3
4
5
|
UIStoryboard *destinationStoryboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil]; DestinationViewController *vc = [destinationStoryboard instantiateViewControllerWithIdentifier:@"identifier"];//一顿设置...[self.navigationController pushViewController:vc animated:YES]; |
在Xcode7 和 iOS 9中,只需要用Storyboard Reference就可以用Segue轻松实现跨Storyboard的跳转了。Storyboard Reference的出现,保留了单个Storyboard文件跳转的优点的同时,提供了多Storyboard文件时利于合并的便利。
开始分割你那巨大的Storyboard文件吧。最快的方法是:
缩放Storyboard
框选一组逻辑相近的scenes
选择Editor > Refactor to Storyboard...
自动Refactord的故事板文件会为每一个scenes留下一个UIStoryboard Reference,并且在需要的地方自动创建可读性不好的Storyboard ID。所以就个人来说,我更推荐手动复制scenes到新的故事板文件中,然后在源文件中删除这些scenes并手动添加Storyboard Reference。
如果你已经有多个故事板文件了,为自己庆祝一下吧——你又可以精简你的代码了!从Object库中拖拽一个UIStoryboard Reference,并配置segue。然后选取你手动跳转的代码,大力地按下删除键吧!
iOS 9开发小技巧的更多相关文章
- iOS之开发小技巧
1.xcode如何添加快捷代码 xcode添加快捷代码 属性 2.cocoapods安装 cocoapods安装 3.iOS真机调试 真机调试 4.命令行自动打包 xcrun -sdk iphoneo ...
- iOS开发小技巧 - UILabel添加中划线
iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...
- iOS开发小技巧 - runtime适配字体
iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...
- 移动Web开发小技巧
移动Web开发小技巧 添加到主屏后的标题(IOS) name="apple-mobile-web-app-title" content="标题"> 启用 ...
- Windows统一平台: 开发小技巧
Windows统一平台: 开发小技巧 技巧一: 在手机端拓展你应用的显示区域.(WP8.1中也适用) 对于Windows Phone系统的手机, 手机屏幕最上方为系统状态栏(System Tray), ...
- flex开发小技巧集锦
关于flex开发网上有非常多的相关信息介绍,因此我们要想学习关于flex开发的知识信息技能是一件非常简单和方便的事情.而针对于flex开发小编要告诉大家的是一些flex开发小技巧.利用这些小技巧能够有 ...
- TP开发小技巧
TP开发小技巧原文地址http://wp.chenyuanzhao.com/wp/2016/07/23/tp%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7/ ...
- BizTalk开发小技巧
BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B ...
- Java开发小技巧(三):Maven多工程依赖项目
前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...
随机推荐
- 【DM642】ICELL Interface—Cells as Algorithm Containers
ICELL Interface—Cells as Algorithm Containers: DSP的算法标准(XDAIS)为算法提供了一个标准的接口.这样我们就可以使用第三方的算法.For tech ...
- hive-hbase性能问题
华为负责人本来想用这种表来做大数据开发,先前就听前辈讲过性能存在问题.实际开发过程确实存在不少问题.然后放弃换方案去做了. 1.底层meta映射字段问题.默认4000,如果再做修改会涉及到挺多源码. ...
- hbase连接linux开发过程
最近近公司被安排做hbase开发,太久没做今天记录下过程 import java.io.IOException; import org.apache.hadoop.conf.Configuration ...
- AGC035D
AGC035D Add and Remove 题意 给出\(n\)个数,每次删除一个不在两端的数,然后把它的权值加到相邻的两个数上. 问操作\(n-2\)次后,所剩的两数之和的最小值 \(n\le18 ...
- CentOS如何升级openssl到最新版本
本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:CentOS如何升级openssl到最新版本: 环境信息 CentOS Linux release 7.6.1810 (Core): Op ...
- odoo 8.0 多核启用
对于很多企业来说,随着时间的推移,用户量或者企业建点扩张,使用erp就会出现应用访问越来越慢的情况, 其实这种情况不但限于erp,只要是有数据量增长的互联网业务必然会遇到的,因为一开始的是就没有做好大 ...
- 用reduce装逼 之 多个数组中得出公共子数组,统计数组元素出现次数
昨天做了一道美团的面试题,要求是给N个数组,找出N个数组的公共子数组. ,,,,]; ,,,,]; ,,,,]; ,,,,]; 以上四个数组,有公共子数组2, 3,7 function main(){ ...
- macbook双网卡路由
用route命令可以解决,步骤如下:1)确定你内网的网段,如果有多个都一一列出来,例如:192.168.1.0/24,10.20.0.0/16等 2)确定你内网网卡的网关IP,通过netstat -r ...
- 怎么比较两个list中相同的值个数!
怎么比较两个list中相同的值个数!int count=0;for(int i=0;i<list1.size();i++){ for(int j=0;j<list2.size();j++) ...
- Spring_Hibernate整合准备
1,Spring整合Hibernate 整合什么? 1)由IOC容器来生成Hibernate的SessionFactory 2)让Hibernate使用上Spring的声明式事务 2,整合步骤 1 ...