如何在UILabel中对不同大小的文本进行顶部对齐?一个例子是在价格横幅中将较小尺寸的美分金额与较大尺寸的美元金额进行顶部对齐。
iOS6中的UILabel支持NSAttributedString
,这让我可以在同一个UILabel中拥有不同大小的文本。但是,它似乎没有顶部对齐文本的属性。实现这一点的选择是什么?在我看来,提供一个自定义绘制逻辑来基于自定义属性字符串键进行顶部对齐可能是最好的,但我不知道如何进行。
发布于 2014-08-27 07:23:11
我用一个标签就能达到你想要的效果。
使用一些数学运算,您可以偏移较小文本的基线,以获得您想要的结果。
Objective-C
- (NSMutableAttributedString *)styleSalePriceLabel:(NSString *)salePrice withFont:(UIFont *)font
{
if ([salePrice rangeOfString:@"."].location == NSNotFound) {
return [[NSMutableAttributedString alloc] initWithString:salePrice];
} else {
NSRange range = [salePrice rangeOfString:@"."];
range.length = (salePrice.length - range.location);
NSMutableAttributedString *stylizedPriceLabel = [[NSMutableAttributedString alloc] initWithString:salePrice];
UIFont *smallFont = [UIFont fontWithName:font.fontName size:(font.pointSize / 2)];
NSNumber *offsetAmount = @(font.capHeight - smallFont.capHeight);
[stylizedPriceLabel addAttribute:NSFontAttributeName value:smallFont range:range];
[stylizedPriceLabel addAttribute:NSBaselineOffsetAttributeName value:offsetAmount range:range];
return stylizedPriceLabel;
}
}
斯威夫特
extension Range where Bound == String.Index {
func asNSRange() -> NSRange {
let location = self.lowerBound.encodedOffset
let length = self.lowerBound.encodedOffset - self.upperBound.encodedOffset
return NSRange(location: location, length: length)
}
}
extension String {
func asStylizedPrice(using font: UIFont) -> NSMutableAttributedString {
let stylizedPrice = NSMutableAttributedString(string: self, attributes: [.font: font])
guard var changeRange = self.range(of: ".")?.asNSRange() else {
return stylizedPrice
}
changeRange.length = self.count - changeRange.location
// forgive the force unwrapping
let changeFont = UIFont(name: font.fontName, size: (font.pointSize / 2))!
let offset = font.capHeight - changeFont.capHeight
stylizedPrice.addAttribute(.font, value: changeFont, range: changeRange)
stylizedPrice.addAttribute(.baselineOffset, value: offset, range: changeRange)
return stylizedPrice
}
}
这会产生以下结果:
发布于 2015-10-14 04:38:12
太不幸了。我没有足够的声誉来评论我在经过一点修改后使用得很好的答案。我只想指出,用smallfont
代替font
来换取美分,这可能是一个打字错误。
以下是修改后的代码
- (NSMutableAttributedString *)styleSalePriceLabel:(NSString *)salePrice withFont:(UIFont *)font
{
if ([salePrice rangeOfString:@"."].location == NSNotFound) {
return [[NSMutableAttributedString alloc]
initWithString:salePrice];
} else {
NSRange range = [salePrice rangeOfString:@"."];
range.length = (salePrice.length - range.location);
NSMutableAttributedString *stylizedPriceLabel =
[[NSMutableAttributedString alloc] initWithString:salePrice];
UIFont *smallfont = [UIFont fontWithName:font.fontName
size:(font.pointSize / 2)];
NSNumber *offsetAmount = @(font.capHeight - smallfont.capHeight);
[stylizedPriceLabel addAttribute:NSFontAttributeName
value:smallfont
range:range];
[stylizedPriceLabel addAttribute:NSBaselineOffsetAttributeName
value:offsetAmount
range:range];
return stylizedPriceLabel;
}
}
发布于 2013-03-21 08:54:46
一种可能的方法是使标签与您输入的文本的大小完全相同。
CGRect labelFrame;
//Set the origin of the label to whatever you want
labelFrame.size = [label.text sizeWithFont:label.font]; //If using NSString
labelFrame.size = [label.text size]; //If using NSAttributedString
label.frame = labelFrame;
https://stackoverflow.com/questions/15537033
复制相似问题