【问题标题】:UILabel with NSAttributedString is clipping content带有 NSAttributedString 的 UILabel 正在剪辑内容
【发布时间】:2013-09-12 08:28:18
【问题描述】:

我设置了一个带有自动布局的 UILabel,它的高度基于其固有的内容大小,这样当其中有更多行时它会变得更高。我需要它与同一视图中的其他元素一起居中。一切都是默认的,它工作得很好。

但是,我使用了一种自定义字体,其中的空间有点太大。我已经设置了一个 NSMutableParagraphStyle,如下所示:

NSMutableParagraphStyle *headlineParagraphStyle = [NSMutableParagraphStyle new];
headlineParagraphStyle.lineSpacing = 0.0f;
headlineParagraphStyle.maximumLineHeight = 20.0f;
headlineParagraphStyle.hyphenationFactor = 0.0f;
headlineParagraphStyle.alignment = NSTextAlignmentLeft;

然后我创建一个 NSAttributedString 并将其设置为 UILabel 的 -attributedText:

NSString *uppercaseHeadline = self.currentStory.headline.uppercaseString;
NSAttributedString *attributedHeadline = [[NSAttributedString alloc] initWithString:uppercaseHeadline attributes:@{NSParagraphStyleAttributeName: headlineParagraphStyle}];
self.headlineLabel.attributedText = attributedHeadline;

结果是文本看起来不错,但它被推到 UILabel 顶部上方并在顶部被剪掉,而标签底部仍有额外空间:

这也会使其他项目相对于该标签中的文本居中,因为您可以看到两行之间的空间与标签框架的中心不一致。

我怎样才能告诉 UILabel 让这个文本居中,这样顶部就不会被剪掉,底部也没有空间?

【问题讨论】:

    标签: ios cocoa-touch uilabel


    【解决方案1】:

    我意识到在 iOS 7 发布并且该平台上的 NDA 解除后,我再也没有回来回答这个问题。从 iOS SDK 7.0 开始,可以使用 NSAttributedString 属性 NSBaselineOffsetAttributeName,这正是我需要做的。

    它在 iOS 6 中可用但“不再受支持”。但是,在使用 iOS 7 SDK 构建时,它似乎做了正确的事情。

    编辑:如果不清楚,我不建议这样做。如果 Apple 表示不再支持它,那么依赖它可能不是一个好主意。它对我有用,但绝对不是一个长期的解决方案。

    【讨论】:

      【解决方案2】:

      我刚刚玩得很开心。无论出于何种原因,使用lineHeightMultiplemaximumLineHeight 和/或minimumLineHeight 都会像这样破坏偏移量。

      但是,使用lineSpacing(它不是绝对值而是相对值)将改变行间距,而不会弄乱偏移量。

      【讨论】:

        【解决方案3】:

        在 iOS 10 中,我的解决方案是只设置 maximumLineHeight 而不是设置 minimumLineHeight(否则,标签的顶部会被剪掉)。更改 lineSpacing 或 lineHeightMultiple 没有帮助。

        【讨论】:

        • 在 iOS 10 上同时设置 minimumLineHeightmaximumLineHeight 存在问题,但这似乎已在 iOS 11 中得到解决
        【解决方案4】:

        我觉得链接到“奇怪的采访”很重要:http://i.imgur.com/pFeqPHd.gif

        您可能需要编辑字体的 assender 属性,请参见此处:UIButton custom font vertical alignment

        【讨论】:

        • 我从来没有设法让它工作。调整字体的上升和下降属性似乎对最终渲染没有影响。
        【解决方案5】:

        在我的情况下 numberOfLines = 0 是需要的 否则,与直觉相反,换行符后的行被剪断

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 2013-06-29
          • 2019-12-15
          相关资源
          最近更新 更多