最近读了《iOS UI开发捷径--利用Interface Builder高效、优雅地开发UI》这本书。感觉受益匪浅,记录下自己在书里面学到的东西。这里只写自己学到的新知识,并不介绍一些简单的IB知识,想要具体学习,请买书自己学习。
和Interface Builder有关的几个重要概念
下面介绍几个和IB有关的概念,学习下平常经常用,但是不了解的概念。
Bundle
这个我们在平常工作中应该经常用,比如创建IB的时候,还有获取资源路径的时候:
let bundle = Bundle.main
复制代码
Bundle有两种表现形式:
- 保存可执行代码,比如我们整个App就是一个Bundle,也就是我们经常用的main bundle。
- 保存需要的资源。这里的资源包括XIB,Storyboard,图片,声音等,例如我们在使用一些第三方的SDK时用的bundle。
nib
我们创建XIB时,经常调用的方法是loadNibName
,为啥是loadNib,而不是loadXIB呢。这里就少说一下XIB和nib的关系了,XIB用Source Code的方式显示可以看到其实他就是个xml文件,那么nib是什么呢,通俗的解释下,nib是工程被编译后,由XIB生成的一种文件类型。这里可以看出XIB和其他资源文件的不同,XIB是需要经过编译的,编译后XIB就不存在了,而在Bundle中生成了与之对应的nib文件,而其他文件只是简单的copy到bundle中。Storyboardc和Storyboard的对应关系和XIB和nib的对应关系是一样的。
使用XIB应该注意的事情
下面看下使用XIB时,应该注意的事情。
File‘s Owner的使用
在XIB文件中,左侧文件排列上,我们可以看到有一个File‘s Owner。从字面上理解,File‘s Owner就是文件的所有者。一般我们的File‘s Owner都是VC。这里为什么介绍File‘s Owner,是因为一个XIB可以同时和UIView和UIViewController进行连线,这里依靠的就是File‘s Owner。例如,一个XIB文件中,一个view即可以和File‘s Owner连线也可以和自己的view文件连线,这样就可以在view中处理一些view的逻辑,在VC中处理业务逻辑了。使用File‘s Owner时还应该注意的地方是,当创建XIB时,调用的函数:
func loadNibNamed(_ name: String, owner: Any?, options: [AnyHashable : Any]? = nil)
复制代码
这里的owner参数,我们经常传入nil,这里要说下这个参数具体情况下应该传入什么,
- 当XIB没有设置File‘s Owner那么这里传入nil
- 当XIB设置File‘s Owner并且对应类就是使用XIB的这个类,这里可以传入self或者nil
- 当XIB设置的File‘s Owner不是当前使用该XIB文件的类,这里就必须传入与File‘s Owner相对应的类。
UINib的使用
加载XIB文件的方式有以下两种:
func loadNibNamed(_ name: String, owner: Any?, options: [AnyHashable : Any]? = nil)
open func instantiate(withOwner ownerOrNil: Any?, options optionsOrNil: [AnyHashable : Any]? = nil) -> [Any]
这两种方法有啥不同的呢,第一种是频繁的加载XIB文件,第二种是利用UINib把XIB文件加载到内存中,然后从内存中加载。所以当我们需要频繁使用XIB文件时要用第二种,但只用一次时,应该用第一种。
UIViewController和XIB的使用
当我们创建VC时如果没有勾选also create XIB,后面又想使用XIB,我们就应该手动创建XIB,然后进行关联,关联的时候,我们需要把view和VC的view属性进行连线,否则程序会crash。
XIB和AutoLayout
这里不具体介绍AutoLayout,只介绍几个属性,新学到的。
Content Compression Resistance
这个属性是指一个视图保护其内容完整性的能力,系数越大,该视图保护内容完整性越强,内容越不容易被压缩或者裁剪。
Content Hugging
这个属性是指一个视图保护它的尺寸与其内容尺寸相匹配的能力,系数越大,匹配能力越强。
在XIB中ScrollView使用AutoLayout
ScrollView使用AutoLayout和其他view不同,我们需要设置它的子view大小明确,因为ScrollView需要计算自己的contentSize。所以原则是他的子view的约束需要可以推算出ScrollView的contentSize。
Storyboard使用
Storyboard平常的使用和XIB差不多,但是Storyboard比XIB多了Extra View,segue和object的使用,这里我们主要介绍extra view,segue和object的使用。
Extra View
我们通常会有这样的需求,一个VC在特定的情况下或者固定的操作后显示一个View,比如,没有网络的时候的提示页面。SB允许在Scene中添加Extra View来完成这些事情。下面介绍如何使用。我们拖一个View到First Responder和exit中间,如图所示:
class ViewController: UIViewController {
@IBOutlet weak var reachabilityView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let noReachability = true
if noReachability {
reachabilityView.center = view.center
self.view.addSubview(reachabilityView)
}
}
}
复制代码
预告
Segue、Storyboard reference、Object其实可以单独写篇文章,这里先暂时不介绍了,等写完文章附上地址。