一个失败的简单测试:创建一个只有一个子视图(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}];
}
行间距与该属性不存在时相同。 有什么东西能让这个成功吗? 我输入了荒谬的数字只是为了表明它不会改变......
这是 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。
我不知道这是否足以满足您的目的,但我可以通过设置最小和最大行高来调整行距。此外,为了使用字体,我将其放入文本视图的
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似乎可以为我解决这个问题;
对于这个特定的字符串,您需要设置
paragraphSpacing
lineSpacing
,我相信它只是 iOS 上还不支持。
正如 nacho4d 回答的那样,在 iOS 6
和 maximumLineHeight 并直接在 UITextView 中设置字体,而不是在 NSAttributedString 中,因为在这种情况下行高将被覆盖。 请注意,当您在UITextView中设置字体时,
UITextView的“editable”属性应设置为YES,否则属性文本不会受到影响。 这些问题仅存在于 iOS 6 中。在
iOS 7及以上版本一切正常; 就我而言,所有段落样式都不起作用。解决方法是在标签上进行任何框架调整后在标签上设置属性文本。 :)