我NSAttributedString
用来生成具有两种不同大小的字符串。默认情况下,它的底部对齐方式如下所示:
但我想将它垂直居中,如下所示:
需要明确的是,这是一个单一的属性字符串,而不是两个或更多。这是一个描述我的问题的简化示例,我实际上想做的事情更复杂。
我NSAttributedString
用来生成具有两种不同大小的字符串。默认情况下,它的底部对齐方式如下所示:
但我想将它垂直居中,如下所示:
需要明确的是,这是一个单一的属性字符串,而不是两个或更多。这是一个描述我的问题的简化示例,我实际上想做的事情更复杂。
我想说最简单的事情就是操纵NSBaselineOffsetAttributeName
相关文本的属性:
NSBaselineOffsetAttributeName
此属性的值是一个 NSNumber 对象,其中包含一个浮点值,该值指示字符与基线的偏移量,以磅为单位。默认值为 0。
要居中,您需要将大文本的高度与较小文本的高度之间的差值减半,然后将其用作基线调整。
这是一个使用NSBaselineOffsetAttributeName
.
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];
YasT在 Swift 中的回答:
斯威夫特 4
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 + 1, length: smallString.utf16.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()
斯威夫特 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 + 1, 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()
更好的解决方案是从字体排版计算 NSBaselineOffsetAttributeName (短文https://www.raizlabs.com/dev/2015/08/advanced-ios-typography/)
为属性字符串的第二部分设置属性。
secondPartAttributes[NSBaselineOffsetAttributeName] = @((firstFont.xHeight - secondFont.xHeight)/2);