24

一个失败的简单测试:创建一个只有一个子视图(UITextView)的新项目并将以下内容放入:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = 50.f;
    paragraphStyle.lineSpacing = 100.f;
    paragraphStyle.minimumLineHeight = 200.f;
    paragraphStyle.maximumLineHeight = 500.f;

    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];

    self.textView.attributedText = [[NSAttributedString alloc] initWithString:
    @"This is a test.\n Will I pass?" attributes:
    @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}

行间距与该属性不存在时相同。有什么东西可以成功吗?我输入荒谬的数字只是为了表明它不会改变......

4

6 回答 6

24

这是 NSHTMLWriter 中的一个错误,它是 UITextView 用来将属性文本转换为 HTML 的私有类。在内部,它通过 UIWebDocumentView 显示此 HTML。在我的文章中阅读更多关于 UITextView 内部工作的信息:http: //www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

问题来自于字体 CSS 速记中一个容易被忽略的专业。如果您使用字体简写指定像素大小,那么这将同时设置字体大小和行高。由于 NSHTMLWriter 将字体放在 line-height 之后,这会导致 line-height 被字体大小抵消。

请参阅此处了解我的雷达,其中包括对错误的完整分析:http: //www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

我建议你也提交一份错误报告并提及我的 Radar #12863734。

于 2012-12-16T16:48:10.210 回答
23

我不知道这是否足以满足您的目的,但我可以通过设置最小和最大行高来调整行距。此外,为了使用字体,我将其放入font文本视图的属性中,而不是将其作为NSFontAttributeName属性字典中的值传递。(也许这部分没有(很好)记录在案?)

关于你的属性

lineSpacing是从行的底部到上线的底部计算的,并且该空间被限制为 和 之间的minimumLineHeightmiximumLineHeight。我想说的是,您的属性中的某些值可能正在取消覆盖其他值。

此外,如果您只需要调整行之间的间距,您可能不需要使用paragraphStyle.lineHeightMultiple:)

编码

这对我有用:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 35.f;
paragraphStyle.maximumLineHeight = 35.f;

UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
NSDictionary *attributtes = @{
    NSParagraphStyleAttributeName : paragraphStyle,
};
self.textView.font = font;
self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
                                 attributes:attributtes];

补充笔记

似乎有日语/中文的情况,可能还有其他字符与同一行中的字母字符混合。它将使该线具有更大的领先地位,以解决您需要像我一样设置最小和最大线高的问题。渲染我的示例没有属性时,您可以看到问题。

于 2012-10-06T14:32:38.413 回答
9

设置 maximumLineHeight 似乎为我解决了这个问题;

CGFloat fontSize = 22.f;
titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle  alloc] init] autorelease];
paragraphStyle.maximumLineHeight = fontSize/2;
titleLabel.attributedText = [[[NSAttributedString alloc]
                              initWithString:@"This is a test.\nWill I pass?"
                              attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
                                             NSFontAttributeName : titleLabel.font}]
                             autorelease];

重叠线

于 2012-12-05T09:22:37.830 回答
5

对于这个特定的字符串,您需要设置paragraphSpacing。是什么lineSpacing,我相信它在 iOS 上尚不支持。

于 2012-09-24T09:57:28.140 回答
0

正如 nacho4d 回答的那样,在iOS 6中,您需要使用minimumLineHeightmaximumLineHeight并直接在UITextView中设置字体,而不是在NSAttributedString中,因为在这种情况下,行高将被覆盖。

请注意,当您在 UITextView 中设置字体时,UITextView可编辑”属性应设置为YES,否则属性文本不会受到影响。

这些问题仅存在于iOS 6中。在iOS 7及更高版本中一切正常;

于 2014-06-15T14:29:37.320 回答
0

就我而言,段落样式都不起作用。修复是在对标签进行任何框架调整之后在标签上设置属性文本。:)

于 2014-12-23T18:57:27.893 回答