Swift: 如何在使用 AutoLayout 时调整 UITextView 中的字体大小?

Swift: How to resize the font size within a UITextView while using AutoLayout?

我已经 Swift 编程一周了,我想用自动布局构建我的第一个应用程序。 我的应用程序的当前状态是我在 ViewController 中生成了一堆 PictureCell。它们的大小基于滑块值(也在 ViewController 中计算)。这很好用。

我的难题是自定义 PictureCell 的内部。我的目标是在单元格中有一个标签,当我调整单元格大小时字体大小会自动调整。

在当前状态下,我可以根据需要调整 Cell 和 UITextView 的大小,但我无法调整 Textview 中字体的大小,因为它的常量只是在初始化时调用(我猜)。

我怎样才能很好地解决这个问题?

由于不理解 Swift 的逻辑,我必须 post PictureCell 的整个代码:

class PictureCell: UICollectionViewCell {
override init(frame: CGRect) {
    super.init(frame: frame)
    self.translatesAutoresizingMaskIntoConstraints = false
    self.layer.cornerRadius = self.bounds.width / 20
    self.clipsToBounds = true

    setupViews()
}

let descriptionTextView: UITextView = {
    let textView = UITextView()
    textView.text = "Header"
    textView.textColor = .black
    textView.backgroundColor = .white
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.textAlignment = .center
    textView.isEditable = false
    textView.isScrollEnabled = false
    textView.sizeToFit()
    textView.font = UIFont.boldSystemFont(ofSize: textView.contentSize.height / 2) // Resize that

    textView.layer.borderWidth = 2
    textView.layer.borderColor = UIColor.red.cgColor

    return textView
}()


var mainPicture: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    imageView.clipsToBounds = true

    return imageView
}()

 func setPictureForIndex(index: Int)  {
    self.mainPicture.image = UIImage(named: "color\(index)")
}

func setupViews() {
    addSubview(mainPicture)
    confMainPicture()

    addSubview(descriptionTextView)
    confDescriptionTextView()
}

func confMainPicture() {
    mainPicture.translatesAutoresizingMaskIntoConstraints = false
    mainPicture.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
    mainPicture.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
    mainPicture.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    mainPicture.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}

func confDescriptionTextView(){
    descriptionTextView.translatesAutoresizingMaskIntoConstraints = false
    descriptionTextView.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
    descriptionTextView.heightAnchor.constraint(equalTo: mainPicture.heightAnchor, multiplier: 0.25).isActive = true
    descriptionTextView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
}

文字太小

很好

太大不好看

这段代码或多或少解决了我的问题: 如果 Cell 真的很小,它不能正常工作,但它比起点更好,也许有人可以使用它。

class PictureCell: UICollectionViewCell {
override init(frame: CGRect) {
    super.init(frame: frame)
    self.translatesAutoresizingMaskIntoConstraints = false
    self.layer.cornerRadius = self.bounds.width / 20
    self.clipsToBounds = true
    setupViews()
}
//MARK: -

var cellIdetifier = Int()

var mainPicture: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    imageView.clipsToBounds = true
    imageView.layer.cornerRadius = imageView.bounds.width / 20
    return imageView
}()

var descriptionBox: UIView = {
    let descVie = UIView()
    descVie.backgroundColor = UIColor(red: 0.1 , green: 0.1, blue: 0.1, alpha: 0.5)
    descVie.layer.borderWidth = 0.5
    descVie.layer.borderColor = UIColor.black.cgColor
    descVie.clipsToBounds = true
    descVie.layer.cornerRadius = descVie.bounds.height / 5
    return descVie
}()

lazy var descLabel: UITextField = {
    let label = UITextField()
    label.textColor = .white
    label.textAlignment = .center
    label.clipsToBounds = true
    label.font = UIFont.systemFont(ofSize: 15)
    label.adjustsFontSizeToFitWidth = true
    label.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    label.sizeToFit()
    label.layoutIfNeeded()
    label.isUserInteractionEnabled = false
    return label
}()

func setPictureForIndex(index: Int, name: String)  {
    self.descLabel.text = name
    self.mainPicture.image = UIImage(named: "color\(index)")
}
// MARK: -
// MARK: Layout
func setupViews() {
    addSubview(mainPicture)
    addSubview(descriptionBox)
    descriptionBox.addSubview(descLabel)
    confBounds()
}

func confBounds() {
    mainPicture.translatesAutoresizingMaskIntoConstraints = false
    mainPicture.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
    mainPicture.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
    mainPicture.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    mainPicture.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

    descriptionBox.translatesAutoresizingMaskIntoConstraints = false
    descriptionBox.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
    descriptionBox.heightAnchor.constraint(equalTo: mainPicture.heightAnchor, multiplier: 0.25).isActive = true
    descriptionBox.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    descriptionBox.bottomAnchor.constraint(greaterThanOrEqualTo: mainPicture.topAnchor, constant: 1)

    descLabel.translatesAutoresizingMaskIntoConstraints = false
    descLabel.widthAnchor.constraint(equalTo: descriptionBox.widthAnchor).isActive = true
    descLabel.heightAnchor.constraint(equalTo: descriptionBox.heightAnchor).isActive = true
    descLabel.bottomAnchor.constraint(equalTo: descriptionBox.bottomAnchor).isActive = true
    descLabel.heightAnchor.constraint(equalTo: descriptionBox.heightAnchor).isActive = true
}

}