首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在UILabel中对不同大小的文本进行顶部对齐

在UILabel中对不同大小的文本进行顶部对齐
EN

Stack Overflow用户
提问于 2013-03-21 07:55:17
回答 3查看 11.2K关注 0票数 24

如何在UILabel中对不同大小的文本进行顶部对齐?一个例子是在价格横幅中将较小尺寸的美分金额与较大尺寸的美元金额进行顶部对齐。

iOS6中的UILabel支持NSAttributedString,这让我可以在同一个UILabel中拥有不同大小的文本。但是,它似乎没有顶部对齐文本的属性。实现这一点的选择是什么?在我看来,提供一个自定义绘制逻辑来基于自定义属性字符串键进行顶部对齐可能是最好的,但我不知道如何进行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-27 07:23:11

我用一个标签就能达到你想要的效果。

使用一些数学运算,您可以偏移较小文本的基线,以获得您想要的结果。

Objective-C

代码语言:javascript
复制
- (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;
    }
}

斯威夫特

代码语言:javascript
复制
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
    }
}

这会产生以下结果:

票数 56
EN

Stack Overflow用户

发布于 2015-10-14 04:38:12

太不幸了。我没有足够的声誉来评论我在经过一点修改后使用得很好的答案。我只想指出,用smallfont代替font来换取美分,这可能是一个打字错误。

以下是修改后的代码

代码语言:javascript
复制
- (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;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-03-21 08:54:46

一种可能的方法是使标签与您输入的文本的大小完全相同。

代码语言:javascript
复制
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;

请参阅此similar SO post for more details

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15537033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档