web-dev-qa-db-ja.com

UILabelの高さを動的に計算する方法

私は次のコードを持っています:

label.numberOfLines = 0; // allows label to have as many lines as needed
label.text = @"some long text";
[label sizeToFit];

ラベルの高さをポイント単位で取得するにはどうすればよいですか?

19
cdub

次の方法を使用して、動的UILabelの高さを計算します。

- (CGFloat)getLabelHeight:(UILabel*)label
{
    CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [label.text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:label.font}
                                                  context:context].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}
53
Salman Zaidi

高さを取得する最も簡単な方法はsizeThatFitsです。次のように使用します。

Objective-C

CGFloat maxLabelWidth = 100;
CGSize neededSize = [label sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)];

Swift 3.0

let maxLabelWidth: CGFloat = 100
let neededSize = label.sizeThatFits(CGSize(width: maxLabelWidth, height: CGFloat.greatestFiniteMagnitude))

ラベルに必要な高さはneededSize.heightです。
ラベルのサイズがCGSizeに収まる十分な場所があることを確認するために、サイズの高さにCGFLOAT_MAXを使用していることに注意してください。

ラベルの高さは、ラベルの幅にも依存します。そのため、maxLabelWidthを追加しました。ラベルが100pt幅または200ptの場合、違いが生じます。

お役に立てれば!

編集:必ずlabel.numberOfLines = 0;を設定してください。そうでない場合、neededSizeはテキストが1行にあるサイズを返します。

編集:追加Swiftバージョン、命名は少し奇妙ですが、greatestFiniteMagnitudeはCGFLOAT_MAXの正しい同等物のようです。

53
Fabio Berger

[label sizeThatFits:label.frame.size];を使用するだけで、指定されたテキストに適合するラベルのサイズが返されます。または、 question に従うこともできます

6
iHulk

UICollectionViewまたはUITableViewでヘッダー/セルの高さを推定するメソッドでラベルが取るサイズを推定する場合は、次のようにします。

  1. ラベルが取るmaxWidthを設定します
  2. 新しいUILabelを作成し、numberOfLinesを0に設定します
  3. カスタムフォントを使用している場合、カスタムフォント名やフォントサイズなどのフォント属性を追加します
  4. このラベルのテキストを設定し、sizeThatFitsを使用して推定高さを取得します。ラベルの高さはneededHeight.height

Swiftバージョン

let maxLabelWidth:CGFloat = collectionView.frame.width - 20
let label = UILabel()
label.numberOfLines = 0
let addressFont = [ NSFontAttributeName: UIFont(name: "OpenSans", size: 12.0)! ]
let addr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
label.attributedText = NSMutableAttributedString(string: addr , attributes: addressFont )
let neededSize:CGSize = label.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max))
let labelHeight = neededSize.height

@FabioBergerに感謝

6
kishorer747

ラベルを動的に作成できます:

-(CGRect)newLableSize:(NSString *)lableString
{
     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
     [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

        CGFloat tempwidth = YourStaticLabelWidth * ScreenWidth / 320;
        NSMutableArray *array=[[NSMutableArray alloc]initWithObjects: lableString,nil];
       CGRect newLabelsize = [[array objectAtIndex:0] boundingRectWithSize:CGSizeMake(tempwidth, MAXFLOAT)  options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:selectFont,NSParagraphStyleAttributeName:paragraphStyle} context:nil];   

        NSLog(@"New Label Size Width  : %f",newLabelsize.size.width);
        NSLog(@"New Label Size Height : %f",newLabelsize.size.height);

        return newLabelsize;
}
2
sohil

サルマン・ザイディの答えを少し編集して、自分でうまく機能するようにしました。 heightForRowAtIndexPath:でラベルの高さを取得しようとしているときなど、ラベルに直接アクセスできない場合に適切に機能します

-(CGFloat)getLabelHeight:(CGSize)labelSize string: (NSString *)string font: (UIFont *)font{

    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [string boundingRectWithSize:labelSize
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:context].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}
2
Shayno
- (CGFloat)getTextHeightByWidth:(NSString*)text textFont:(UIFont*)textFont textWidth:(float)textWidth {

    if (!text) {
        return 0;
    }
    CGSize boundingSize = CGSizeMake(textWidth, CGFLOAT_MAX);
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.height;
}

- (CGFloat)getTextWidthByHeight:(NSString*)text textFont:(UIFont*)textFont textHeight:(float)textHeight {

    if (!text) {
        return 0.0f;
    }
    CGSize boundingSize = CGSizeMake(CGFLOAT_MAX, textHeight);

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                         attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.width;
}
1

labelに2行の高さを調整しています

lblUserQuestion.preferredMaxLayoutWidth = 100.0f;

100.0f、それは私が欲しかったサイズであり、別の行、

[lblUserQuestion sizeToFit];

私の方法の完了は、

UILabel *lblUserQuestion = [[UILabel alloc] initWithFrame:CGRectMake(61, 25, self.frame.size.width-61-20, 37.0f)];
    lblUserQuestion.numberOfLines= 0;
    lblUserQuestion.font =[UIFont fontWithName:@"HelveticaNeue-Thin" size:14.];
lblUserQuestion.adjustsFontSizeToFitWidth = YES;
    lblUserQuestion.minimumScaleFactor = 0.5;
    lblUserQuestion.preferredMaxLayoutWidth= 100.0f;
    lblUserQuestion.text = _photoToVote.label; 
1