使用SnapKit约束label、scrollview和tableview

    xiaoxiao2021-03-25  144

    Snapkit:https://github.com/SnapKit/SnapKit

    一、约束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在使用第三方类库时,使用cocoaPods是非常方便的,具体使用方法可以参考:CocoaPods安装和使用教程 的安装使用方法。今天讨论的问题是,我在使用的时候遇到了一些问题" 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) }

    内容大概就这么多吧,别急着赶路,把路填平了,才能跑起来。

    转载请注明原文地址: https://ju.6miu.com/read-2101.html

    最新回复(0)