YYTextView与AutoLayout混用Demo

import UIKit
import YYText
import SnapKit

class YYCell: UITableViewCell {

    fileprivate static let fontSize: CGFloat = 24
    fileprivate static let font = UIFont.systemFont(ofSize: YYCell.fontSize)

    fileprivate lazy var wrapView: UIView = {
        let v = UIView()
        return v
    }()

    fileprivate lazy var textView: YYTextView = {
        let tv = YYTextView()
        tv.isEditable = false
        tv.textContainerInset = UIEdgeInsets.zero
        tv.isScrollEnabled = false
        return tv
    }()

    fileprivate var tvHeightConstraint: Constraint? = nil

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func setupUI() {
        contentView.addSubview(wrapView)
        wrapView.addSubview(textView)

        wrapView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }

        textView.snp.makeConstraints { (make) in
            make.top.equalToSuperview().offset(20)
            make.leading.trailing.bottom.equalToSuperview()
            tvHeightConstraint = make.height.equalTo(0).priority(.high).constraint
        }

    }

    func bindData(_ n: Int) {

        let text1 = NSMutableAttributedString(string: "一二三四五上山打老虎")
        text1.yy_font = YYCell.font

        let text2 = NSMutableAttributedString(string: "一二三四五上山打老虎结束")
        text2.yy_font = YYCell.font

        let attrText = NSMutableAttributedString(attributedString: text1)

        for _ in 0...min(n, 50) {
            for i in 0...TTSystemFaceAgent.sharedAgent.count {
                if let img = TTSystemFaceAgent.sharedAgent.getUIImage(ofIndex: i) {
                    let att = NSMutableAttributedString.yy_attachmentString(withEmojiImage: img, fontSize: YYCell.fontSize)
                    attrText.append(att!)
                }
            }
        }
        attrText.append(text2)
        attrText.yy_lineSpacing = 5

        textView.attributedText = attrText

        let size = CGSize(width: UIScreen.main.bounds.width, height: 9999999)
        let layout = YYTextLayout(containerSize: size, text: attrText)
        let height = ceil(layout?.textBoundingRect.height ?? 0)

        _ = tvHeightConstraint?.update(offset: height)
    }

}

主要是YYTextView不支持Autolayout,需要搞一个YYTextLayout算一下,然后再更新autolayout约束。另外为了避免冲突,搞了个优先级。

Leave a Reply

Your email address will not be published.