【问题标题】:Pixel Width of the text in a UILabelUILabel 中文本的像素宽度
【发布时间】:2010-11-23 08:43:30
【问题描述】:

我需要画一个划线的 UILabel。因此,我将 UILabel 子类化并实现如下:

@implementation UIStrikedLabel

- (void)drawTextInRect:(CGRect)rect{
    [super drawTextInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context,CGRectMake(0,rect.size.height/2,rect.size.width,1));
}
@end

发生的情况是,UILabel 被划线,一行与整个标签一样长,但文本可以更短。 有没有办法以像素为单位确定文本的长度,以便可以适当地绘制线条?

如果知道的话,我也愿意接受任何其他解决方案:)

最好, 埃里克

【问题讨论】:

    标签: iphone objective-c uilabel


    【解决方案1】:

    NSString 有一个sizeWithAttributes: 方法可用于此目的。它返回一个 CGSize 结构,因此您可以执行类似于以下的操作来查找标签内文本的宽度。

    iOS 7 及更高版本

    CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];
    
    CGFloat strikeWidth = textSize.width;
    

    iOS

    在 iOS7 之前,您必须使用 sizeWithFont: 方法。

    CGSize textSize = [[label text] sizeWithFont:[label font]];
    
    CGFloat strikeWidth = textSize.width;
    

    UILabel 有一个字体属性,您可以使用它来动态获取标签的字体详细信息,就像我在上面所做的那样。

    希望这会有所帮助:)

    【讨论】:

    • sizeWithFont 自 iOS7 以来已弃用。使用 CGSize textSize = [string sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14.0f]}];而是。
    • 你也可以使用label.attributedText.size
    【解决方案2】:

    Swift 中有更好的解决方案:
    更新:
    对于Swift 3/4

    @IBOutlet weak var testLabel: UILabel!
    // in any function
    testLabel.text = "New Label Text"
    let width = testLabel.intrinsicContentSize.width
    let height = testLabel.intrinsicContentSize.height
    print("width:\(width), height: \(height)")
    

    旧答案:

    yourLabel?.text = "Test label text" // sample label text
    let labelTextWidth = yourLabel?.intrinsicContentSize().width
    let labelTextHeight = yourLabel?.intrinsicContentSize().height
    

    【讨论】:

    • 这个 ios 7 兼容吗?
    • 这个选项明显更快
    • 新手问题.. 你不需要宽度/高度来创建标签吗?至少我是这样的。试图找到我正在创建标签的文本的宽度。 let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
    【解决方案3】:

    这会奏效。试试看

    NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
    CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
    lblDeliveryDateWidth = stringBoundingBox.width;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2010-10-28
      相关资源
      最近更新 更多