10年我刚开始进行业余的 iOS 开发时,使用 xib 开发了 iTimeLog 最初的界面,后面几次改版之后全部改成了使用代码写界面元素,我一直觉得相对于当时的 xib xml 文件格式,使用 Objective-C 的代码构建界面元素更加直观,可控,且更方便复用。
后面开发公司的项目,基于代码管理,合并,冲突解决等方面的考虑,我们也一直使用纯代码的界面构建方式。算起来也写了四五年“无聊但必要”的界面代码了。
一两个月前我开始使用 storyboard 进行一个新的小工具的开发,写个 blog 总结一下这一两个月的心得,也就是一两个月之前的我不知道的东西。
Add new constraints
一般来说,我们听到的 storyboard 操作指南都是用 ctrl + 连线的方式来建立新的 constraint,但很多时候这并不是很高效的方式,一方面每次连线只能连一个;另一方面,有时候拖一个控件到 storyboard 里面时,起始位置比较尴尬,你想拖一个 leading contraint,但控件离父 view 的边缘太近了,很难操作,还有的时候父 view 比较小,拖一个 view 进去之后发现四条边都是父 view 外面。 这种时候,用编辑界面右下角 Add new constraints 更方便,拖一个控件到 storyboard 中之后,点开 Add new constraints ,可以一次性设置好 上下左右长宽 中的几个属性,控件的位置和大小就确定了。
UIStackView
世界上的大部分 app 界面,用 UIStackView 就够了,如果还不行,就嵌套 UIStackView。
因为大部分界面为了看起来整齐美观,要做的事就是对齐和间隔,而 UIStackView 天生就是为了这两种需求而在的,了解一下? 另外,UIStackView 是在 iOS xx 中引入的,为了在版本中使用,推荐GitHub - forkingdog/FDStackView: Use UIStackView directly in iOS6+
动画
使用 constraint 时,简单动画代码跟原先操纵 frame 属性时的代码有一些不同。 在做属性动画时,我们一般在闭包中写属性变化的代码。
UIView.animate(withDuration: 0.3) {
self.view.height = self.view.height/2.0
}
而使用 constraint 时,给 constraint 属值后,在闭包使调用父类的 layoutIfNeed 触发界面重绘,展示动画。
viewConstraintsY.constant = 0
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}