如何计算UITextView相对于原点的第一个基线位置

时间:2016-03-10 16:37:52

标签: ios uitextview

如何计算UITextView第一基线位置?

enter image description here

我试过这样计算:

self.textView.font!.descender + self.textView.font!.leading

但是,我得到的价值不正确。任何想法,提示?

3 个答案:

答案 0 :(得分:4)

Apple document

中有一张图表

Figure 9-4  Font metrics

根据我的理解,font.descender + font.leading给出了第一条基线与第二条线的起点之间的距离。

如果font.lineHeight没有秘密填充,我会想象 UITextField会给你正确的号码。

修改

UITextFieldUITextView共享相同的UIFont属性。

对于UITextView,可以设置额外的textContainerInset

编辑2

进一步了解UITextView可以更好地了解可以实现的目标:

它实际上有textContainer属性,即NSTextContainer

  

NSTextContainer类定义了一个布局文本的区域。 NSLayoutManager对象使用一个或多个NSTextContainer对象来确定断行的位置,布置文本的部分,等等。

它已被layoutManager使用,理论上可以通过usedRectForTextContainer(_:)找到第一行文字顶部的填充。

一旦掌握了Mac,我就需要测试一下。 :)

答案 1 :(得分:1)

根据zcui93给出的文档,font.ascender将为您提供字体内基线的偏移量。要获得UITextView中需要添加的textContainerInset.top内的字体基线:

extension UITextView {
    func firstBaseline() -> CGFloat {
        let font = self.font ?? UIFont.systemFontOfSize(UIFont.systemFontSize())
        return font.ascender + textContainerInset.top
    }
}

如果没有设置字体,这里有一些假设默认为系统字体,但我不确定会有更好的猜测。

在操场上运行以下内容将证明效果:

class Container : UITextView {
    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        CGContextSaveGState(context)

        let containerRect = UIEdgeInsetsInsetRect(bounds, textContainerInset)
        UIColor(red: 1, green: 0, blue: 0, alpha: 0.25).setFill()
        CGContextFillRect(context, containerRect)

        let baseline = firstBaseline()

        UIColor(red: 1, green: 0, blue: 0, alpha: 0.75).setStroke()
        CGContextSetLineWidth(context, 1)
        CGContextMoveToPoint(context, containerRect.origin.x, baseline)
        CGContextAddLineToPoint(context, containerRect.origin.x + containerRect.width, baseline)
        CGContextStrokePath(context)

        super.drawRect(rect)
    }
}

let textView = Container(frame: CGRect(x: 0, y: 0, width: 100, height: 30))
textView.font = UIFont.systemFontOfSize(UIFont.systemFontSize())
textView.text = "My Text"

结果:

enter image description here

答案 2 :(得分:0)

在我的情况下,我正在扩展UITextField类,我只是想在textfield基线中绘制一条线,并且我成功使用以下块:

self.svwLine = UIView(frame: CGRectMake(0,self.frame.size.height+(self.font?.descender)!,self.frame.size.width,2))
self.svwLine.backgroundColor = UIColor.whiteColor()
self.addSubview(self.svwLine)