在UITextView

时间:2018-06-05 08:25:03

标签: ios swift uitextview

我正在尝试测量线条的高度,以便在UITextView中的特定文字上放置叠加层。具体来说,我所说的行是用\n分隔的文本。所以一条线实际上可以跨越多条线,这就是我想要测量的。我尝试了几种不同的方法,但是,我似乎无法正确计算高度。我当前的方法的另一个弱点是它必须全部在主同步线程上计算,这不太理想,因为我有很多计算要做。

示例用户界面

measurement.font = UIFont(name: "Menlo", size: 16)
measurement.frame = CGRect(x: 0, y: 0, width: 10000, height: 50)

func heightForString(line: String) -> CGFloat {
    var height : CGFloat = 0
    measurement.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 10000)
    measurement.sizeToFit()
    height = measurement.frame.height
    print(height, lineHeight)
    measurement.frame = CGRect(x: 0, y: 0, width: 10000, height: 50)
    return height
}
// Comparing the returned height to measurement.font?.lineHeight and padding shows the results make little sense... :(

示例打印

应为1行

  

30.0 18.625

应为3行

  

43.6666666666667 18.625

1 个答案:

答案 0 :(得分:1)

func heightForString(line: String) -> CGFloat {
    let textView = UITextView()
    let maxwidth = UIScreen.main.bounds.width
    textView.frame = CGRect(x:0,y: 0,width: maxwidth,height: CGFloat(MAXFLOAT))
    textView.textContainerInset = UIEdgeInsets.zero
    textView.textContainer.lineFragmentPadding = 0
    textView.font = UIFont(name: "Menlo", size: 16)
    textView.text = line
    textView.isScrollEnabled = false
    textView.sizeToFit()
    return textView.frame.size.height
}