之前做项目时为了节省时间赶工期,经常用storyboard或者XIB来拖拽视图做页面,经常会遇到各种各样的跟代码不兼容的错误,也没有时间静下心来去找寻其中的问题出在哪里,最终还是决定以后用代码布局来做项目了。
现在市面上已经有很多ios的代码布局框架,如Masonry等等。但是对于我等手残党来说,用苹果自带的 NSLayoutConstraint 就感觉完全够用了。但是原生的在写起来代码又有些复杂,所以就花了些时间对其进行了一次小封装,主要是对 NSLayoutConstraint 和 NSLayoutAttribute 进行了整理。好了话不多少了上代码~
完整的DEMO代码如下:
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let label = UILabel() label.backgroundColor = UIColor.blue label.text = "this is test" label.textColor = UIColor.yellow self.view.addSubview(label)//该方法要放到布局代码前 label.CenterX.layout(constrain: self.view.CenterX, constant: 0) .CenterY.layout(constrain: self.view.CenterY, constant: 0) .Left.layout(constrain: self.view.Left, constant: 20) .Right.layout(constrain: self.view.Right, constant: -20) .heightLayoutConstraint(height: 80) let greenView = UIView() greenView.backgroundColor = UIColor.green self.view.addSubview(greenView) greenView.Top.layout(constrain: label.Bottom, constant: 20) .CenterX.layout(constrain: label.CenterX, constant: 0) .widthLayoutConstraint(width: 80) .heightLayoutConstraint(height: 80) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }}运行起来是这样的:
个人比较喜欢这种链式调用的敲代码方式,当然这个小轮子目前还很不完善,承重能力有限,基本实现思路是通过协议扩展的方式对UIView 进行的功能增强~~将原生的代码布局用到的属性封装成了 ConstraintClass 类。
class ConstraintClass { var view: UIView! var attribute: NSLayoutAttribute! init(view: UIView!, attribute: NSLayoutAttribute!) { self.view = view self.attribute = attribute } }然后对NSLayoutAttribute进行了封装,目前就这么简单啦,后面如果有更多的需求和精力的话,再完善功能!!
如果这段简单的代码能入得了看管的法眼,想要拿来试一试的话,欢迎去github上下载 示例代码。 使用时只需要将DEMO项目中的Layout文件夹拖放到你自己的项目中就可以像示例中的代码那样使用了。另外 UIView+Extensions.swift 对 UIView 进行了一些属性扩展,可能跟你自己写的有冲突,使用时需要注意。
写在最后:欢迎swift同学交流学习!!站内撕我~~
新闻热点
疑难解答