带有NSAttributedString的UILabel是剪辑内容

时间:2013-09-08 20:17:25

标签: ios cocoa-touch uilabel

我有一个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 Clipping

这也会抛弃其他项目与此标签中文本的居中,因为您可以看到两条线之间的空格与标签框架的中心不对齐。

如何告诉UILabel重新输入此文字,以便顶部不会剪辑,底部没有任何空格?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

I just had a wild ride with this. For whatever reason, using lineHeightMultiple, maximumLineHeight, and/or minimumLineHeight blows the offset like this.

However, using lineSpacing (which is not an absolute value but a relative value) will change the spacing between lines without messing up the offset.

答案 2 :(得分:2)

我觉得链接到'奇怪的采访'非常重要:http://i.imgur.com/pFeqPHd.gif

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

答案 3 :(得分:2)

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