使UITextView高度动态,出现约束乘数问题

时间:2018-09-14 00:47:21

标签: ios swift xcode constraints uitextview

我有一个包含五个单元格的UICollectionView。在那里,我有一个UIImageView,两个UILabel和一个UITextView。我想根据它包含的文本来更改textview的高度,因此之后,我可以根据UITextView的高度和它们上方的标签来设置整个单元格的高度。让我来演示with a screenshot

因此,如您所知,红色背景显示UITextView的高度不正确。我这样设置UITextView:

    let commentTextView: UITextView = {

    let textView = UITextView()
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.text = "This is just some text to act as a description"
    textView.textContainerInset = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
    textView.font = UIFont.systemFont(ofSize: 16.0)
    textView.textColor = UIColor.darkGray
    textView.isEditable = false
    textView.isSelectable = false
    textView.backgroundColor = UIColor.red

    textView.frame.size.width = (UIScreen.main.bounds.width - 16 - 16 - 60 - 8)

    let numberOfLines = (textView.contentSize.height / textView.font!.lineHeight)
    var textViewHeight = (textView.font?.lineHeight)! * floor(numberOfLines)

    textView.frame.size.height = textViewHeight

    return textView

}()

我认为这不会产生错误的高度。我认为可以在我的约束中找到问题,该约束具有高度约束(如果删除它,UITextView会消失)。如果更改乘数(当前设置为0.3),则会有不同的高度,但是我希望它是动态的。因此,我认为,我需要在乘数内设置一个动态变量,但是我不知道如何构成它。有人可以帮忙吗?这是我的限制条件:

        // top constraints
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .top, relatedBy: .equal, toItem: workoutLabel, attribute: .bottom, multiplier: 1, constant: 2)])

    // left constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .left, relatedBy: .equal, toItem: profilePictureImageView, attribute: .right, multiplier: 1, constant: 16)])

    // right constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .right, relatedBy: .equal, toItem: self.commentTextView.superview, attribute: .right, multiplier: 1, constant: -16)])

    // height constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 0.3, constant: 1)])

干杯!

3 个答案:

答案 0 :(得分:0)

您可以考虑采用另一种方法处理dynamic height中的UITextView。关于intrinsic content size众所周知。您可以使用该技术实现动态高度。

答案 1 :(得分:0)

最初回答here

请勿更改或为您的UITextView添加任何框架。只要给它leadingtrailingtopbottom约束即可。然后,如果您的单元格具有自动调整大小的功能,则无需为文本视图计算任何内容。

使用自动版式动态调整单元格大小时,您实际上不需要实现sizeThatFits(...)。如果约束设置正确,则只需要禁用UITextView的滚动即可。

来自代码:

yourTextView.scrollEnabled = false

来自IB:

选择您的文本视图并打开属性检查器,然后

enter image description here


现在,如果您在使单元格具有动态尺寸方面遇到问题,请查看this answer

答案 2 :(得分:0)

就像昨天提到的,我让textview根据@nayem的答案调整了它的大小-谢谢!

但是,我在使像元高度动态化方面面临另一个问题。我研究了不同的解决方案,除了我自己计算高度并将其设置为要使用的高度时,什么都没有做。这适用于Simulator中的所有设备,只是想知道这是否是正确的方法。下面的代码在顶部,左侧和右侧设置了约束。

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

    let dummyText = "Just a long text to see what will happen to the cell. Will it adapt or not? Let's find out!"

    let rectWidth = view.frame.width - 32 - 60 - 16

    let rect = NSString(string: dummyText).boundingRect(with:CGSize(width: rectWidth, height: 1000), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)], context: nil)

    let variableHeight = 16 + 20 + 2 + 20 + 2 + 16 + rect.height

    return CGSize(width: view.frame.width, height: variableHeight)

}

这是最好的方法吗?以后会不会引起问题?