在 iOS 8 中,当 UITextView 应用于 lineHeightMultiple 时,我有一个普通的 NSMutableParagraphStyle 剪辑第一行的顶部,见下图:

似乎 lineHeightMultiple 除了影响后续行之外,还影响文本的第一行。

clipsToBounds = false 上设置 UITextView 至少可以使剪切部分显示出来,但是您可以从下图中看到,现在文本的顶部显然位于其框架上方:

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

我还尝试使用 WKWebView 来处理违规文本,并仅设置 css line-height 属性,效果很好。但是,当涉及到 UITextView 时,我肯定缺少一些东西。

此外,根据文档,将段落样式的 lineSpacing 设置为小于 0 没有任何影响:

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.

我也尝试过设置 contentInsetUITextView 以及使用系统字体,两者都没有影响。

我此设置的示例代码如下:
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

有没有人遇到过这个问题并克服了这个问题,或者是顶级约束破解是唯一的出路?

最佳答案

我遇到过同样的问题。

我使用 NSBaselineOffsetAttributeName 补偿了它。

你应该使用:

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

您还必须设置较低的段落lineHeightMultiple。

有点棘手,但它有效。

关于ios - UITextView lineHeightMultiple Clips Top, first line, of Text,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30845705/

10-15 14:08