web-dev-qa-db-ja.com

UILabelのテキストのピクセル幅

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は、ラベル全体と同じ長さの線で取り消されますが、テキストは短くなる可能性があります。線を適切に描画できるように、テキストの長さをピクセル単位で決定する方法はありますか?

また、他の解決策についても承知しています。

ベスト、エリック

77
Erik

NSStringには、このために使用できる sizeWithAttributes: メソッドがあります。 CGSize構造体を返すため、次のような操作を行って、ラベル内のテキストの幅を見つけることができます。

iOS 7以降

CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];

CGFloat strikeWidth = textSize.width;

iOS <7

IOS7より前は、 sizeWithFont: メソッドを使用する必要がありました。

CGSize textSize = [[label text] sizeWithFont:[label font]];

CGFloat strikeWidth = textSize.width;

UILabelには、上記のようにラベルのフォントの詳細を動的に取得するために使用できるフォントプロパティがあります。

お役に立てれば :)

194
Harry

より良い解決策、ここでは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
66
Aks

このサンプルが役立つことを願っています(iOS> 7)

NSString *text = @"    // Do any additional setup after loading the view, typically from a nib.";
CGRect rect = CGRectZero;
NSDictionary *attrDict = @{NSFontAttributeName : [UIFont systemFontOfSize:17]};

rect = [text boundingRectWithSize:CGSizeMake(100,9999)
                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                       attributes:attrDict
                          context:Nil];

UILabel *lbl = [[UILabel alloc] init];
lbl.text = text;
rect.Origin = CGPointMake(50, 200);
lbl.frame = rect;
lbl.lineBreakMode = NSLineBreakByWordWrapping;
lbl.numberOfLines = 0;
[self.view addSubview:lbl];
1
Yong