iOS 9开发小技巧

转载 2016年05月31日 16:03:04

前言

"小黄鸭"法不仅适用于debug,也适用于学习新知识。表达是最好的吸收。本文原文发表在realm.io上。我翻译并整理成此文。希望可以为国内的iOS朋友提供一些资料。

LayoutGuide

在iOS9.0 和 OS X10.11中,分别有两个新的类:UILayoutGuideNSLayoutGuide。他们可以作为一种类似View的对象,参与到AutoLayout的布局约束中。作为一种新的布局解决方案,这两个类的出现使你无需再创建、显示无关的View了。举个栗子,原本需要一个空的UIView占位的地方,现在只需要用UILayoutGuide去替代它就可以了。

// 创建LayoutGuide
let layoutGuideA = UILayoutGuide()  
let layoutGuideB = UILayoutGuide()

// 添加到View上
let view: UIView = ...  
view.addLayoutGuide(layoutGuideA)  
view.addLayoutGuide(layoutGuideB)

// 用UILayoutGuide来添加布局约束
layoutGuideA.heightAnchor.constraintEqualToAnchor(layoutGuideB.heightAnchor).active = true

// 设置Identifier,为了方便DEBUG
layoutGuideA.identifier = "layoutGuideA"  
layoutGuideB.identifier = "layoutGuideB"

// ...然后看看他们的Frame吧
print("layoutGuideA.layoutFrame -> \(layoutGuideA.layoutFrame)")  

NSLayoutAnchor

iOS9中另一个新增的API是NSLayoutAnchor。它的出现不仅仅是让使用代码添加约束变得简洁明了。通过该类强大的静态检查能力,还提供了额外的约束正确定保证。举个栗子,考虑以下使用NSLayoutConstraintAPI创建的约束会出现什么问题:

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中都已经得到了支持。UIViewNSLayoutAnchor相关的存取方法,明确指出了需要哪些继承自NSLayoutAnchor的子类。这些子类被分为了三类,X轴,Y轴,和尺寸(宽/高),一种类型的Anchor只允许绑定约束到另外一个相同类型的Anchor上。通过指定NSLayoutAnchor中参数的类型,这个API可以通过类型检查,来避免创建出例子中无效的约束。

我们回到之前的例子,用NSLayoutAnchor来实现一下这个约束:

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的跳转方法,需要在代码里完成:

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文件吧。最快的方法是:

  1. 缩放Storyboard
  2. 框选一组逻辑相近的scenes
  3. 选择Editor > Refactor to Storyboard...

自动Refactord的故事板文件会为每一个scenes留下一个UIStoryboard Reference,并且在需要的地方自动创建可读性不好的Storyboard ID。所以就个人来说,我更推荐手动复制scenes到新的故事板文件中,然后在源文件中删除这些scenes并手动添加Storyboard Reference

如果你已经有多个故事板文件了,为自己庆祝一下吧——你又可以精简你的代码了!从Object库中拖拽一个UIStoryboard Reference,并配置segue。然后选取你手动跳转的代码,大力地按下删除键吧!

相关文章推荐

iOS 9开发小技巧:LayoutGuide,Storyboard Reference

前言"小黄鸭"法不仅适用于debug,也适用于学习新知识。表达是最好的吸收。本文原文发表在realm.io上。我翻译并整理成此文。希望可以为国内的iOS朋友提供一些资料。LayoutGuide在iOS...
  • offbye
  • offbye
  • 2016-02-25 11:30
  • 1365

iOS开发中的小技巧

在ios7.0之后所有控制器默认全屏 , 由extendEdges属性控制 ,默认撑满上下. 如果ipad开发 ,需要横屏还可以设置左右撑满.      但是scrollView及其子类添加入导航...

27个iOS开发中的小技巧

iOS开发中,相信大家都会遇到这样或那样的问题,于是在本篇文章中,小编整理了一些大家可能能用到的小技巧,希望会对iOS开发者们有所帮助。 [以下资料小编收集自互联网、叶孤城___的博客] ...

iOS 开发小技巧

原文地址 《iOS开发的一些奇巧淫技》自定义了leftBarbuttonItem左滑返回手势失效了怎么办?self.navigationItem.leftBarButtonItem = [[UIBa...

iOS开发:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...

iOS项目开发小技巧 (三) --UITableView实现Cell左划删除等自定义功能

今天来介绍下iOS开发中UITableView的Cell左划实现微信中置顶,删除等功能。该功能在iOS8.0以前是需要很复杂的实现,不过github上应该有现成demo,不过今天介绍的是在iOS8.0...

iOS开发:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...

iOS开发 偷懒小技巧---自定义XCode代码片段

有句话说的好,聪明的程序员懂得"偷懒"来提升开发效率.我们在日常开发中,有一些代码片段会经常利用到,大家可能会觉得定义一些宏可以解决问题,但是遇到比如,UITableView的协议方法,或者写Demo...

iOS开发之软键盘使用小技巧

在iOS开发过程中,有时候需要弹出软键盘进行输入,有时候又需要在某些情况下隐藏软键盘,以提高用户体验。今天有几个关于软键盘的小技巧和大家分享。 (1)只弹出数字键盘        有某些需求中,要求用...

iOS开发小技巧汇总

1.App名称的修改 许多个人开发者或许会有和我一样的经历,开发一个App途中会想到更合适的名字,这时候变会修改工程名以达到App名称改变的目的,其实你可以一步到位—— 在info...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)