NSParagraphStyle 行间距被忽略

问题描述 投票:0回答:6

一个失败的简单测试:创建一个只有一个子视图(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}];
}

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

objective-c uitextview ios6 nsattributedstring
6个回答
24
投票

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

问题来自于 CSS 字体速记中一个容易被忽视的特性。如果您使用字体速记指定像素大小,则这会同时设置字体大小和行高。由于 NSHTMLWriter 将字体放在行高之后,这会导致行高被字体大小抵消。

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

我建议您也提交一份错误报告并提及我的雷达#12863734。


23
投票

我不知道这是否足以满足您的目的,但我可以通过设置最小和最大行高来调整行距。此外,为了使用字体,我将其放入文本视图的

font
属性中,而不是将其作为属性字典中
NSFontAttributeName
的值传递。 (也许这部分没有(很好)记录?)

关于你的属性

lineSpacing
是从该行的底部到上一行的底部计算的,并且该空间被限制为
minimumLineHeight
maximumLineHeight
之间的值。我想说的是,也许您的属性中的某些值是“取消”或“覆盖”其他值。 此外,如果您只需要调整行之间的间距,您可能不需要使用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];

补充说明
似乎存在日语/中文以及其他字符与字母字符混合在同一行中的情况。它将使该行具有更大的leading

,以解决您需要像我一样设置最小和最大行高的问题。 当渲染我的没有属性的示例时,您可以看到问题。

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


9
投票

    

overlapping lines对于这个特定的字符串,您需要设置

paragraphSpacing

5
投票
lineSpacing

,我相信它只是 iOS 上还不支持。

    
正如 nacho4d 回答的那样,在 

iOS 6

0
投票
minimumLineHeight

maximumLineHeight 并直接在 UITextView 中设置字体,而不是在 NSAttributedString 中,因为在这种情况下行高将被覆盖。 请注意,当您在UITextView中设置字体时,

UITextView

“editable”属性应设置为YES,否则属性文本不会受到影响。 这些问题仅存在于 iOS 6 中。在

iOS 7

及以上版本一切正常; 就我而言,所有段落样式都不起作用。解决方法是在标签上进行任何框架调整后在标签上设置属性文本。 :)


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.