如何使用

时间:2017-08-02 17:38:14

标签: ios uicollectionview uicollectionviewcell

这是一个很受欢迎的问题,但我仍然无法找到如何使用TextView内部为UICollectionViewCell 定义动态高度的简单答案。我找到了这个答案UICollectionView - dynamic cell height?,但我没有使用接口,我想要一个用代码构建的接口的解决方案。

import UIKit

class ResumeController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    let cellId = "cellId"

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        //layout.estimatedItemSize = CGSize(width: 100, height: 100)
        layout.minimumLineSpacing = 0

        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = .white
        cv.dataSource = self
        cv.delegate = self
        cv.translatesAutoresizingMaskIntoConstraints = false

        cv.register(FirmCell.self, forCellWithReuseIdentifier: self.cellId)

        return cv
    }()

    override func viewDidLoad() {
        view.backgroundColor = .white
        setupViews()
    }

    func setupViews() {
        setupCollectionView()
    }

    func setupCollectionView() {
        view.addSubview(collectionView)

        collectionView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
        collectionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        collectionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath);
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: 100.0)
    }

}

class FirmCell : UICollectionViewCell {

    let imageView: UIImageView = {
        let iv = UIImageView()
        iv.backgroundColor = .orange
        //        iv.image = somelogo
        iv.contentMode = .scaleAspectFill
        iv.clipsToBounds = true
        iv.translatesAutoresizingMaskIntoConstraints = false
        return iv
    }()

    lazy var textView: UITextView = {
        let tv = UITextView()
        tv.isEditable = false
        tv.isSelectable = false
        tv.isScrollEnabled = false
        tv.attributedText = self.attributedText()
        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.layer.borderWidth = 0.5
        tv.layer.borderColor = UIColor.blue.cgColor
        return tv
    }()

    let separatorLine: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(white: 0.9, alpha: 1)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    func attributedText() -> NSAttributedString {
        let text = NSMutableAttributedString()

        // company
        var companyAttr = [String: Any]()
        companyAttr[NSFontAttributeName] = UIFont.systemFont(ofSize: 15, weight: UIFontWeightBold)
        companyAttr[NSForegroundColorAttributeName] = UIColor.black
        text.append(NSAttributedString(string: "line1" , attributes: companyAttr))

        // period
        var periodAttr = [String: Any]()
        periodAttr[NSFontAttributeName] = UIFont.systemFont(ofSize: 14)
        periodAttr[NSForegroundColorAttributeName] = UIColor.lightGray
        text.append(NSAttributedString(string: " line1" , attributes: periodAttr))

        // body
        var bodyAttr = [String: Any]()
        bodyAttr[NSFontAttributeName] = UIFont.systemFont(ofSize: 14, weight: UIFontWeightThin)
        bodyAttr[NSForegroundColorAttributeName] = UIColor.black
        text.append(NSAttributedString(string: "\na huge amount of text goes here ... trying to figure out a way to have different collectionview cells row height", attributes: bodyAttr))

        return text
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupViews() {
        setupImageView()
    }

    func setupImageView() {
        addSubview(imageView)

        imageView.topAnchor.constraint(equalTo: topAnchor, constant: 9.0).isActive = true
        imageView.leftAnchor.constraint(equalTo: leftAnchor, constant: 9.0).isActive = true
        imageView.heightAnchor.constraint(equalToConstant: 40.0).isActive = true
        imageView.widthAnchor.constraint(equalToConstant: 40.0).isActive = true

        setupTextView()
    }

    func setupTextView() {
        addSubview(textView)

        textView.topAnchor.constraint(equalTo: imageView.topAnchor, constant: 0).isActive = true
        textView.leftAnchor.constraint(equalTo: imageView.rightAnchor, constant: 7.0).isActive = true
        textView.rightAnchor.constraint(equalTo: rightAnchor, constant: -9.0).isActive = true
        textView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    }

}

有人可以提供一些指示吗?

0 个答案:

没有答案