UITextView lineHeightMultiple剪辑文本的顶部,第一行

时间:2015-06-15 12:53:58

标签: ios uitextview nsattributedstring

在iOS 8中,我有一个香草UITextView,当lineHeightMultiple应用于NSMutableParagraphStyle lineHeightMultiple时会剪切第一行的顶部,见下图:< / p>

Text Clipping

似乎clipsToBounds = false除了后续行之外还影响第1行文本。

UITextView上设置UITextView至少会启用剪裁的部分,但您可以从下面的图片中看到,现在文字的顶部明显高于它{s}帧:

Text Above Frame

我可以通过在有问题的clipsToBounds = false上设置顶部约束来补偿WKWebView来解决此问题,但这对我来说就像是黑客攻击。

我还尝试使用line-height作为违规文本,只设置了css lineSpacing属性,这样就可以了。在UITextView中,必须有一些我缺少的东西。

此外,根据文档,将段落样式的The distance in points between the bottom of one line fragment and the top of the next. **This value is always nonnegative.** This value is included in the line fragment heights in the layout manager. 设置为小于0没有任何影响:

contentInset

我还尝试设置UITextView的{​​{1}}以及使用系统字体,两者都没有影响。

此设置的示例代码如下:

let text = "THIS IS A MULTILINE RUN OF TEXT"

let font = UIFont(name: "MyFontName", size: 31.0)!
// let font = UIFont.systemFontOfSize(31.0)

let paragraph = NSMutableParagraphStyle()
paragraph.lineHeightMultiple = 0.75
paragraph.alignment = NSTextAlignment.Center

let attributes = [
    NSParagraphStyleAttributeName: paragraph,
              NSFontAttributeName: font
]

titleView.attributedText = NSAttributedString(string: text, attributes: attributes)

// titleView.contentInset = UIEdgeInsets(top: 50.0, left: 0.0, bottom: 0.0, right: 0.0)
titleView.clipsToBounds = false

有没有人遇到过这个并且克服了或者是最重要的约束黑客唯一的方法去哪了?

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。

我使用NSBaselineOffsetAttributeName补偿它。

您应该使用:

let attributes = [
    NSParagraphStyleAttributeName: paragraph,
    NSFontAttributeName: font,
    NSBaselineOffsetAttributeName: -5
]

您还必须设置较低的paragraph.lineHeightMultiple。

有点棘手,但确实有效。

答案 1 :(得分:0)

Cooliopas是对的,但我最终在标签扩展中使用它,并且需要更适合我的应用程序中许多不同大小的文本。我发现保持文本垂直居中的基线调整是文本高度的10%。

let attrString = NSMutableAttributedString(string: newText)

let style = NSMutableParagraphStyle()
style.alignment = self.textAlignment
style.lineSpacing = 1.0
style.lineHeightMultiple = 0.75

var baselineOffset : CGFloat = -5 //-5 is a default for this in case there is no attributedText size to reference
if let size = self.attributedText?.size(){
  baselineOffset = size.height * -0.1
} else {
  NSLog("attributedText = nil, setting lineHeightMultiple to -5 as a default for ", newText)
}

attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSMakeRange(0, attrString.length))
attrString.addAttribute(NSBaselineOffsetAttributeName, value: baselineOffset, range: NSMakeRange(0, attrString.length))
self.clipsToBounds = false

self.attributedText = attrString

答案 2 :(得分:0)

替代方法-使用带有两个标签的堆栈视图,并将堆栈视图间距设置为顶部标签的字体的降序。