【问题标题】:Last line of NSAttributedString not rendered in UILabelNSAttributedString 的最后一行未在 UILabel 中呈现
【发布时间】:2014-05-04 11:35:17
【问题描述】:

我的文本包含我试图在视图上呈现的 HTML 格式。目前我正在使用NSAtributedStringUILabel 中显示文本。

我获取属性字符串如下:

NSString *htmlString = @"<html>"
    "  <head>"
    "    <style type='text/css'>"
    "      body { font: 12pt 'Helvetica'; color: #111111; }"
    "    </style>"
    "  </head>"
    "  <body>";
    htmlString = [htmlString stringByAppendingString:self.descriptionText];
    htmlString = [htmlString stringByAppendingString:@"</body></html>"];

    NSError *err = nil;
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithData: [htmlString dataUsingEncoding:NSUTF8StringEncoding]
                                                                          options: @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType}
                                                               documentAttributes: nil
                                                                            error: &err];

然后将其分配给我标签的attributedText 属性。属性 self.descriptionText 是一个 NSString,它可以包含简单的 HTML 标记,例如 p 标签或带有内联样式的 span 标签。在另一个 StackOverflow 帖子中发现了将字符串包装在 HTML 文档中的技术。

UILabel 设置为 Lines = 0 和 Line Breaks = Word Wrap。我看到的行为是标签正确增长以适应整个字符串,但字符串的最后一行永远不会呈现,无论字符串有多长。

这是一个带有两个标签的屏幕截图。顶部标签(带有黄色背景)中包含我的 HTML 属性字符串。您可以看到标签本身已调整大小以允许 3 行文本,但只呈现了两行,其余的被截断。第二个标签(带有红色背景)已为其 Text 属性分配了一个纯字符串,并且绘制得很好。

示例图像中使用的 HTML 字符串包含以下文本:

<p>With the world&#39;s longest fan-vaulted ceiling, an original Reubens painting, and an excellent collection of medieval stained glass, this chapel has intrigue from multiple angles</p>

一个可接受的答案将解释我如何防止最后一行被截断或提供一种简单的替代方法来将 HTML 文本呈现到视图。谢谢。

【问题讨论】:

  • 字符串 htmlString 只是纯文本还是 html 标记?如果是这样,请告诉我们字符串。
  • htmlString 确实包含简单的 HTML 标记。为了清楚起见,我添加了更多代码。
  • 我认为问题在于标签高度。尝试将标签矿石的高度设置为比当前高度。
  • @PoojaM.Bohora 我正在使用自动布局,我不希望参与在我的视图中手动布局元素的业务。考虑到标签在运行时大于其在 IB 中的大小这一事实,自动布局似乎正在尝试工作。我确实尝试在代码中增加标签高度的大小,但它没有明显的效果。我认为自动布局正在撤消我的更改。

标签: html ios objective-c uilabel nsattributedstring


【解决方案1】:

好的,我想通了。这不是一个明显的解决方案,但我在发现它后确实做了一个手掌。

问题是p 标签被赋予了边距和/或填充,这将文本推到UILabel 的边界之外。我不知道为什么在计算字符串的大小时没有考虑到它,但我不再关心了。

解决方案是我将p {margin:0; padding:0;} 添加到我在HTML 字符串前面添加的样式标记中。现在所有的字符串都在 UILabel 中正确绘制了。

【讨论】:

  • 谢谢!我有完全相同的问题,这解决了它。
  • 我遇到了同样的问题,但是删除段落间距确实看起来不太好。相反,我在末尾添加了一个“
    ”,这也有效!
【解决方案2】:

刚刚也遇到了这个。显然,在显示具有 NSParagraphStyleAttributeName 属性集的 attributedText 时,UILabel 在计算正确大小时遇到​​了一些困难。

我通过从NSMutableAttributedString 中删除此属性解决了我的问题,然后将其分配给我的标签,如下所示:

[mutableAttributedString removeAttribute:NSParagraphStyleAttributeName range:NSMakeRange(0, mutableAttributedString.length)];

效果是一样的,但是感觉比预置一些内联css要整洁一些。

【讨论】:

  • 这个解决方案似乎也对我有用。我想所需的解决方案取决于您是否关心

    标签的样式。

  • 我没有深入研究它,但是如果您想将特定样式应用于

    标签,我认为您也可以通过NSParagraphStyleAttributeName 来实现。通过这种方式,您可以轻松地确保样式在整个应用程序中得到一致应用。当然,不利的一面是,根据您应用的样式,您可能会再次出现截断的线条。

  • 如果要保留该属性,请尝试将 minimumLineHeight 添加到 NSParagraphStyle。这为我解决了问题。
【解决方案3】:

我在使用新的 iOS 11 时遇到了同样的问题。

我的解决方案是插入一个 CSS 行高。虽然它不影响显示的行高,但它解决了问题,现在所有的行都显示了?

body {font-size:14px;line-height:14px;}p {margin:0;padding:0;line-height:14px;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多