如何计算UITextView
第一基线位置?
我试过这样计算:
self.textView.font!.descender + self.textView.font!.leading
但是,我得到的价值不正确。任何想法,提示?
答案 0 :(得分:4)
Apple document
中有一张图表根据我的理解,font.descender + font.leading
给出了第一条基线与第二条线的起点之间的距离。
如果font.lineHeight
没有秘密填充,我会想象 UITextField
会给你正确的号码。
修改强>
UITextField
和UITextView
共享相同的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"
结果:
答案 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)