一、约束UILabel
这个其实本来是很简单的,被自己搞的复杂了,当设置UILabel的时候frame:CGRect.zero
就可以了,另外行数设置为:0,一定一定不要设置固定高度 /(ㄒoㄒ)/~~,frame里不要,约束里也不要,可以设置大于等于。
let lb = UILabel(frame: CGRect.zero)
lb.font = UIFont.systemFont(ofSize: 15)
// 设置为0, 才可以自动换行
lb.numberOfLines = 0
lb.text = "这本应该是iOS中一个标准、内置的解决空table和collection view的方式。默认的如果你的table view是空的,屏幕就是空的。但这不是你能提供的最好的用户体验。\n 用了这个库,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示给用户信息。很明显,每个iOS项目都应该采用。\n在使用第三方类库时,使用cocoaPods是非常方便的,具体使用方法可以参考:CocoaPods安装和使用教程 的安装使用方法。今天讨论的问题是,我在使用的时候遇到了一些问题"
superView.addSubview(lb)
// 一定要在加到父view后才可以用
lb.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(8)
make.left.equalToSuperview().offset(8)
make.right.equalToSuperview().offset(-8)
}
二、约束UIScrollView
由于UIScrollView比较特别,真正的高度是contentSize.height,其中的元素不能直接对UIScrollView约束。
解决的方法是,在其中加一个viewContainer (UIView),让scrollview的contentSize.height自适应viewContainer,而viewContainer的高度自适应与其中的各个控件。
import UIKit
import SnapKit
class rootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.gray
self.title = "自动布局"
// 如果使用了UINavigationController,scroll的上方会出现一片空白区域。设为false可以取消
// 只有当scroll为第一个控件的时候会出现
self.automaticallyAdjustsScrollViewInsets = false
let sc = UIScrollView(frame: CGRect.zero)
self.view.addSubview(sc)
sc.backgroundColor = UIColor.white
sc.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(120)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-15)
}
let viewContainer = UIView(frame:CGRect.zero)
sc.addSubview(viewContainer)
viewContainer.backgroundColor = UIColor.green
viewContainer.snp.makeConstraints { (make) in
make.edges.width.equalTo(sc)
make.top.equalTo(sc)
// 这个很重要!!!!!!
// 必须要比scroll的高度大一,这样才能在scroll没有填充满的时候,保持可以拖动
make.height.greaterThanOrEqualTo(sc).offset(1)
}
let lb = UILabel(frame: CGRect.zero)
lb.font = UIFont.systemFont(ofSize: 15)
lb.numberOfLines = 0
lb.textColor = UIColor.black
lb.text = "这本应该是iOS中一个标准、内置的解决空table和collection view的方式。默认的如果你的table view是空的,屏幕就是空的。但这不是你能提供的最好的用户体验。\n 用了这个库,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示给用户信息。很明显,每个iOS项目都应该采用。\n在使用第三方类库时,我在使用的时候遇到了一些问题"
viewContainer.addSubview(lb)
lb.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(8)
make.left.equalToSuperview().offset(8)
make.right.equalToSuperview().offset(-8)
}
let btn1 = UIButton(type: UIButtonType.system)
btn1.setTitle("显示更多",for: .normal)
btn1.frame = CGRect.zero
btn1.backgroundColor = UIColor.purple
btn1.setTitleColor(UIColor.white,for: .normal)
viewContainer.addSubview(btn1)
btn1.snp.makeConstraints { (make) in
make.top.equalTo(lb.snp.bottom).offset(5)
make.width.equalTo(100)
make.height.equalTo(30)
// 这个很重要,viewContainer中的最后一个控件一定要约束到bottom,并且要小于等于viewContainer的bottom
// 否则的话,上面的控件会被强制拉伸变形
// 最后的-15是边距,这个可以随意设置
make.bottom.lessThanOrEqualTo(viewContainer).offset(-15)
make.centerX.equalToSuperview()
}
}
func btnClick(sender:UIButton) {
let detail = DetailViewController()
self.navigationController?.pushViewController(detail,animated: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
三、约束UITableViewCell
基于上面的方法,这个就比较简单了,以前苦逼的计算每个cell的高度/(ㄒoㄒ)/~~
在这里可以直接把Cell当做上面的viewContainer就好了。重点是UITableView的属性设置:
tv = UITableView(frame: .zero,style: .plain)
// 可以自适应高度的重点就是这个
tv.estimatedRowHeight = 44
// 固定行高,我没看出这个的实际效果,谁能告知一下。。。\(^o^)/~
tv.rowHeight = UITableViewAutomaticDimension
self.view.addSubview(tv)
tv.snp.makeConstraints { (make) in
make.left.right.bottom.equalTo(self.view)
make.top.equalTo(self.view).offset(60)
}
内容大概就这么多吧,别急着赶路,把路填平了,才能跑起来。