web-dev-qa-db-ja.com

テキストの長さに基づいてUILabelの幅を計算する方法は?

UILabelの横に画像を表示したいのですが、UILabelのテキストの長さは可変であるため、画像を配置する場所がわかりません。どうすればこれを達成できますか?

132
Sheehan Alam
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

-[NSString sizeWithFont:forWidth:lineBreakMode:]とは何ですか?

この質問には答えがあるかもしれません、それは私のために働いた。


2014年には、以下のNorbertの非常に便利なコメントに基づいて、この新しいバージョンで編集しました。これはすべてを行います。乾杯

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);
187
Aaron Saunders

yourLabel.intrinsicContentSize.width for Objective-C/Swift

140
Jakub Truhlář

スイフトで

 yourLabel.intrinsicContentSize().width 
49
Arshad

選択した回答は、iOS 6以下で正しいです。

IOS 7では、sizeWithFont:constrainedToSize:lineBreakMode:非推奨になりました。 boundingRectWithSize:options:attributes:context:を使用することをお勧めします。

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

戻り値はCGRectではなくCGSizeであることに注意してください。願わくば、それがiOS 7でそれを使用する人々の助けになることを願っています。

33
Chetan Shenoy

IOS8では、sizeWithFontは非推奨になりました。参照してください。

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

SizeWithAttributesに必要なすべての属性を追加できます。設定できるその他の属性:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

等々。しかし、おそらく他の人は必要ないでしょう

12
jarora
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
7
Honey Lakhani

Swift 4制約を使用しているユーザーに答える

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
5
iOS Lifee

アーロンのリンクを含む他のSO投稿をいくつか適用した後、私が思いついたものを次に示します。

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

この例では、テキストサイズに応じてUILabelのサイズを変更するMKAnnotationクラスにカスタムピンを追加しています。また、ビューの左側に画像が追加されるため、画像とパディングを処理するための適切な間隔を管理するコードの一部が表示されます。

重要なのは、CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];を使用してから、ビューの寸法を再定義することです。このロジックは任意のビューに適用できます。

アーロンの答えは一部の人には有効ですが、私にはうまくいきませんでした。これは、画像とサイズ変更可能なUILabelを使用したより動的なビューが必要な場合は、他の場所に行く前にすぐに試す必要があるはるかに詳細な説明です。私はすでにあなたのためにすべての仕事をしました!!

2
whyoz