Swift - basis

Swift UI纯代码自动布局-VFL

2019-12-12  本文已影响0人  张小西的BUG
VFL全称Visual Format Language,可视化的布局。一直感觉iOS布局框架五花八门,大概都是为了解决苹果自动布局鸡肋的问题,虽然苹果推出了xib但还是不喜欢用,不仅是因为代码维护和合并的问题,主要是因为自己比较喜欢纯代码布局。
在OC里面VFL的布局代码依旧是很麻烦当时主要用的还是Masonry,到了Swift里面就简化了很多以至于我不再使用第三方布局框架,之后的项目全部都是用的VFL。而使用自动布局觉得最方便之处,1:子控件可以去撑父试图,避开繁琐frame的计算所有子控件根据内容自动撑父试图,2:tableViewCell可以根据子试图内容动态计算高度,不需要设置固定高度。
当我回头看以前用第三框架布局的代码的时候我发现,真的很难维护,因为比较零散,所以的约束是以子控件为单位写的,全部都是block回调里写的约束,很臃肿,不够直观一眼看不到子控件之间的约束,但是当时在写的时候很清晰。VFL是以父试图为单位写的约束,一行代码可以写一个方向的约束,子控件之间的约束一眼就能看到,后来就彻底使用VFL。

后来在面试中我也会问下别人会使用VFL布局吗,当然不作为考核只是仅仅的想了解下,有了第三框架会不会再去学苹果的布局框架。最后发现很少有人会去使用,基本都是用的Masonry和SnapKit或者xib,都说写法简单,但是我想说的VFL也很简单也有很多高阶写法,维护起来更方便。

先看下主要布局的API,都是UIKit框架里面的API

 @available(iOS 6.0, *)
open func addConstraint(_ constraint: NSLayoutConstraint)

@available(iOS 6.0, *)
open func addConstraints(_ constraints: [NSLayoutConstraint])

@available(iOS 6.0, *)
open func removeConstraint(_ constraint: NSLayoutConstraint)

@available(iOS 6.0, *)
open func removeConstraints(_ constraints: [NSLayoutConstraint])

最常用的是 open func addConstraints(_ constraints: [NSLayoutConstraint])其中[NSLayoutConstraint]open class func constraints(withVisualFormat format: String, options opts: NSLayoutConstraint.FormatOptions = [], metrics: [String : Any]?, views: [String : Any]) -> [NSLayoutConstraint]API创建,所以我们常见的写法就是contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[list][closeButton(24)]-16-|", options: [], metrics: nil, views: vd))

如果对VFL了解的话,那么上面说的都是废话,可以参考苹果文档去看,但是苹果文档上写的也很复杂,主要是布局情况太多,举了各种例子。但是我想说的是真的很简单,但是想熟练运用还是很难的,经常会出现约束冲突,或者是一个小的错误导致整个界面显示不出来。但是不管怎么样,先用起来才能学的更快,有了错误再解决。

写在最后面:只是大概罗列了使用layout中可能会遇到的问题,没有具体去说怎么使用VFL,因为这只是一个布局的方式,个人的喜好,想去了解也是很简单,只是我个人推荐使用VFL为主做自动布局,自己也使用了三年多。UI玩的转对一个iOS开发猿来说,是最基本的,自己在开发中喜欢封装小的UI组件,任重而道远。

上一篇 下一篇

猜你喜欢

热点阅读