在NSAttributedString中垂直居中两种不同大小的字体

时间:2013-10-21 06:12:45

标签: ios nsattributedstring

我使用NSAttributedString生成两个不同大小的字符串。默认情况下,其底部对齐方式如下所示:

baseline aligned sizes

但我想垂直居中,就像这样: vertically centered sizes

要清楚,这是一个单独的属性字符串,而不是两个或更多。这是一个简单的例子来描述我的问题,我真正喜欢做的事情更复杂。

4 个答案:

答案 0 :(得分:84)

我想说最简单的事情就是操纵相关文字的NSBaselineOffsetAttributeName属性:

  

NSBaselineOffsetAttributeName

     

此属性的值是一个NSNumber对象,其中包含一个浮点值,指示角色与基线的偏移量(以磅为单位)。默认值为0.

要居中,您需要考虑大文本的高度和较小文本的高度之间的差异并将其减半,然后将其用作基线调整。

答案 1 :(得分:22)

以下是使用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];

答案 2 :(得分:3)

更好的解决方案是从字体排版计算NSBaselineOffsetAttributeName(短文https://www.raizlabs.com/dev/2015/08/advanced-ios-typography/

为属性字符串的第二部分设置属性。

secondPartAttributes[NSBaselineOffsetAttributeName] = @((firstFont.xHeight - secondFont.xHeight)/2);

答案 3 :(得分:3)

Swift中的

YasT's answer

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()

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 + 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()