ios开发约束问题

UITextView 高度计算不准确

2018-08-09  本文已影响176人  落夏简叶

代码基于swift4.0

注意: 如果UITextView高度计算觉得不正确,试着计算高度时带上行间距、字体等属性,并确保计算时的属性与textView的属性保持一致!

上面的tip设置成了一致计算的高度还不正确,则可以尝试用一下方式解决。

首先需要说明UITextView里面有一个textContainer属性,而textContainer自带默认的属性如下图所示:

textContainer.png

一、如果文本没有要显示textView右侧滑动的需求(或者可以接受右侧文本基本挨着indicatorBar)

  1. 效果
textViewWithoutIndictor.png
  1. 代码
override func viewDidLoad() {
        super.viewDidLoad()
        let massage = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptat"
         
        //1.设置textView的属性
        let para = NSMutableParagraphStyle()
        para.lineSpacing = 20
        para.alignment = .left
        guard let textFont = textView.font else {
            return
        }
        let attr = [NSAttributedStringKey.font: textFont, NSAttributedStringKey.paragraphStyle: para]
        textView.attributedText = NSAttributedString(string: massage, attributes:attr)
        
        //2.根据字符串计算textView的高度
        let padding = textView.textContainer.lineFragmentPadding //重要代码
        let constraintRect = CGSize(width: textView.frame.size.width, height: .greatestFiniteMagnitude)
       textView.textContainerInset = UIEdgeInsets(top: 0, left: -padding, bottom: 0, right: -padding)  //重要代码
        
        let height = ceil(textView.text.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: attr, context: nil).height)
        
        //3.设置textView的高度
        textViewHeightConstraint.constant = height
    }

这里需要注意的是textView.textContainer.lineFragmentPadding。计算的时候是根据textView的宽度来计算的,但是textView里面的文本距离左和右分别还右一个padding=5。更改其textContainerInset之后计算的高度就是正确的。

二、如果文本可能会显示textView右侧滑动指示器(例如,当超过某个固定的高度则划动,小于这个高度则根据文本计算UITextView的高度)

  1. 效果


    textViewHeightRight.png
  2. 代码

//其他代码不变
//2.根据字符串计算textView的高度
   let padding = textView.textContainer.lineFragmentPadding
   //计算的时候减去左右两边的padding
   let constraintRect = CGSize(width: textView.frame.size.width - 2 * padding, height: .greatestFiniteMagnitude)     //代码1
       
   //最后计算出的结果加上下的inset 
   let height = ceil(textView.text.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: attr, context: nil).height) + 2 * 8  //代码2
        
   //3.设置textView的高度
   textViewHeightConstraint.constant = height

三、错误高度展示

  1. 如果上面代码1中不加 - 2padding 代码2中不+28

    textViewWrong1.png
  2. 如果代码1减了,代码2中未+2*8


    textViewWrong2.png
上一篇下一篇

猜你喜欢

热点阅读