iOS-Swift-SnapKit实现历史记录自由展示

2019-01-25  本文已影响0人  Janise001
历史搜索.pic.jpg 这是闲鱼上的搜索记录展示,每个单独的item的宽度没有限定,由每个item内部的宽度撑开,文字展示完整,每个item之间等距,靠左边依次排序,我选择用UICollectionView来实现,实现得有瑕疵,可全部撑开cell展示,不能靠左展示,还需要优化。 视图层

不废话,上代码:
cell中直接添加的label,label使用SnapKit自动布局设置与父视图的边距约束,

import UIKit
import SnapKit
class TagCell: UICollectionViewCell {
    lazy var tagLabel: UILabel = {
        let label = UILabel()
        label.textColor = UIColor.black
        label.font = UIFont.systemFont(ofSize: 16)
        label.numberOfLines = 1
        label.textAlignment = .center
        return label
    }()
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.contentView.addSubview(tagLabel)
        tagLabel.snp.makeConstraints { (make) in
            make.left.equalToSuperview().offset(10)
            make.top.equalToSuperview().offset(5)
            make.center.equalToSuperview()
        }
        self.contentView.backgroundColor = UIColor(red: 246/255, green: 246/255, blue: 246/255, alpha: 1)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

设置类继承UICollectionViewDelegateFlowLayout,由此可使用方法

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

具体使用见下,设置代理、数据源、cell数量、cell中label展示文字

import UIKit

class TagCollection: UICollectionView,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
    
    var itemString: [String] = [] {
        didSet {
            self.reloadData()
        }
    }
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: layout)
        self.register(TagCell.self, forCellWithReuseIdentifier: "cell")
        self.dataSource = self
        self.delegate = self
        self.backgroundColor = UIColor.white
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return itemString.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! TagCell
        cell.tagLabel.text = self.itemString[indexPath.row]
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 0.01, height: 50)
    }
}

viewcontroller中添加collectionview,这里要注意的是collectionview的初始化中collectionViewLayout参数要设置为UICollectionViewFlowLayout(),设置最小间隔和最小行距,和预估cell的大小,iOS 10.0版本之前的需要指定预估大小,10.0之后的版本使用UICollectionViewFlowLayout.automaticSize获取,初始化完成后设置数据。

import UIKit
import SnapKit
class ViewController: UIViewController {
    let arr:[String] = ["电饼铛",
                        "洗碗机",
                        "兔笼子",
                        "豆浆机",
                        "破壁机",
                        "快餐保温",
                        "煎饼"]
    var tagCollectionView: TagCollection? = nil
    override func viewDidLoad() {
        super.viewDidLoad()
        let frame = CGRect(x: 20, y: 100, width: self.view.bounds.width-40, height: self.view.bounds.height-300)
        let layout = UICollectionViewFlowLayout()
        layout.minimumLineSpacing = 5
        layout.minimumInteritemSpacing = 5
        layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
        if #available(iOS 10.0, *) {
            layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        }else {
            layout.estimatedItemSize = CGSize(width: 50, height: 50)
        }
        self.tagCollectionView = TagCollection(frame: frame, collectionViewLayout: layout)
        self.view.addSubview(self.tagCollectionView ?? UICollectionView())
        self.tagCollectionView!.itemString = self.arr
    }
}

这次比较受益的是学习到了SnapKit自动布局的使用和UICollectionViewFlowLayout()的设置,相比于以往使用定值距离设置,SnapKit设置更灵活。
demo地址

上一篇下一篇

猜你喜欢

热点阅读