在NSAttributedString中垂直放置两种不同大小的字体
我使用NSAttributedString
生成两个不同大小的string。 默认情况下,其底部alignment如下所示:
但是我想垂直居中,像这样:
要清楚,这是一个单一的属性string,不是两个或更多。 这是一个简单的例子来描述我的问题,我实际上想要做的更复杂。
我要说的最简单的事情就是操纵有问题的文本的NSBaselineOffsetAttributeName
属性:
NSBaselineOffsetAttributeName
此属性的值是一个NSNumber对象,其中包含一个浮点值,用于指示该字符与基线的偏移量(以磅为单位)。 默认值是0。
为了居中,您需要将大文本的高度和较小文本的高度之间的差异减半,然后将其用作基线调整。
这是一个使用NSBaselineOffsetAttributeName
垂直alignment较小文本的工作示例。
NSString *bigString = @"BIG"; NSString *smallString = @"Small String"; NSString *fullString = [NSString stringWithFormat:@"%@ %@", bigString, smallString]; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:fullString]; NSRange bigStringRange = NSMakeRange(0, bigString.length); NSRange smallStringRange = NSMakeRange(bigStringRange.length, smallString.length); [string beginEditing]; //Set big string font and size [string addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:28.0] range:bigStringRange]; //set small string font and size [string addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:18.0] range:smallStringRange]; //Set small string baseline offset [string addAttribute:NSBaselineOffsetAttributeName value:[NSNumber numberWithFloat:3.0] //adjust this number till text appears to be centered range:smallStringRange]; [string endEditing];
更好的解决scheme是从字体排版计算NSBaselineOffsetAttributeName(简短的文章https://www.raizlabs.com/dev/2015/08/advanced-ios-typography/ )
为属性string的第二部分设置属性。
secondPartAttributes[NSBaselineOffsetAttributeName] = @((firstFont.xHeight - secondFont.xHeight)/2);
亚斯特在斯威夫特的回答 :
Swift 3
let bigString = "BIG" let smallString = "Small String" let fullString = "\(bigString) \(smallString)" let string = NSMutableAttributedString(string: fullString) let bigStringRange = NSRange(location: 0, length: bigString.utf16.count) let smallStringRange = NSRange(location: bigStringRange.length, length: smallString.utf16.count) let bigStringFontSize: CGFloat = 28 let smallStringFontSize: CGFloat = 18 string.beginEditing() string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange) string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange) string.addAttribute(NSBaselineOffsetAttributeName, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange) string.endEditing()
斯威夫特4
let bigString = "BIG" let smallString = "Small String" let fullString = "\(bigString) \(smallString)" let string = NSMutableAttributedString(string: fullString) let bigStringRange = NSRange(location: 0, length: bigString.count) let smallStringRange = NSRange(location: bigStringRange.length, length: smallString.count) let bigStringFontSize: CGFloat = 28 let smallStringFontSize: CGFloat = 18 string.beginEditing() string.addAttribute(.font, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange) string.addAttribute(.font, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange) string.addAttribute(.baselineOffset, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange) string.endEditing()