39
[self.Review sizeToFit];

sizeToFit の前の結果:

NSStringFromCGRect(self.Review.frame): {{90, 20}, {198, 63}}

sizeToFit 後の結果:

NSStringFromCGRect(self.Review.frame): {{90, 20}, {181, 45}}

横幅はそのままでお願いします。高さだけ変えたい。オートマスクは

(lldb) po self.Review
(UILabel *) $1 = 0x08bb0fe0 <UILabel: 0x8bb0fe0; frame = (90 20; 181 45); text = 'I'm at Mal Taman Anggrek ...'; clipsToBounds = YES; opaque = NO; autoresize = LM+RM+H; userInteractionEnabled = NO; layer = <CALayer: 0x8bb68b0>>

これを行う方法があることを知っています: UILabelの幅をテキストサイズに合わせて調整および作成する方法は?

答えは奇妙です (フォント情報を再提供する必要があります)。または不明。

また、最大幅を定義し、sizeToFit がその最大幅よりも大きい幅を指定した場合にどうするかをプログラムに指示する必要があります。

を使用するという奇妙な解決策を使用しsizeWithFontます。UILabel は既にラベルのフォントを認識しているため、これは奇妙です。

実際、とにかく sizeToFit はどのように動作しますか? より薄い UILabel が必要か、より高い UILabel が必要かは、どのように決定されるのでしょうか?

4

10 に答える 10

44

sizeThatFits でも同じ結果が得られます。

CGSize size = [label sizeThatFits:CGSizeMake(label.frame.size.width, CGFLOAT_MAX)];
CGRect frame = label.frame;
frame.size.height = size.height;
label.frame = frame;

または、sizeToFit を使用します。

CGRect frame = label.frame;
[label sizeToFit];
frame.size.height = label.frame.size.height;
label.frame = frame;
于 2013-01-23T11:11:06.103 に答える
41

これがその方法です。ラベルには既にフォント情報が含まれているため、このメソッド呼び出しに含めるのは簡単です。

CGSize size = [label.text sizeWithFont:label.font
                     constrainedToSize:CGSizeMake(maxWidth, MAXFLOAT)
                         lineBreakMode:UILineBreakModeWordWrap]; 
CGRect labelFrame = label.frame;
labelFrame.size.height = size.height;
label.frame = labelFrame;

より最新のものを使用したSwiftバージョンboundingRectWithSize

let maxHeight = CGFloat.infinity
let rect = label.attributedText?.boundingRectWithSize(CGSizeMake(maxWidth, maxHeight), 
       options: .UsesLineFragmentOrigin, context: nil)
var frame = label.frame
frame.size.height = rect.size.height
label.frame = frame
于 2012-10-25T12:23:08.100 に答える
17

sizeToFit はうまく機能します。唯一の問題は、コントロールの現在のサイズに基づいていることです。

たとえば、ラベル付きのテーブル ビュー セルをリサイクルしている場合、前のセルでラベルの幅が縮小されている可能性があるため、sizeToFit の呼び出しが信頼できないように見える場合があります。

sizeToFit メッセージを送信する前に、コントロールの元の幅をリセットするだけです。

于 2013-12-12T13:52:27.337 に答える
2

@vatrif が指摘しているように、NSStringsize...メソッドを使用するべきではないと思います(内部的にはおそらくのメソッドのみを使用します)。 UILabelNSString

UILabelそれでも、の API は改善できると思います。そのため、カテゴリが最もエレガントなソリューションになると思います。

//  UILabel+Resize.h
@interface UILabel (Resize)
- (void)sizeToFitHeight;
@end

//  UILabel+Resize.m
@implementation UILabel (Resize)
- (void)sizeToFitHeight {
    CGSize size = [self sizeThatFits:CGSizeMake(self.frame.size.width, CGFLOAT_MAX)];
    CGRect frame = self.frame;
    frame.size.height = size.height;
    self.frame = frame;
}
@end

1つだけ:そのメソッドの適切な名前がわかりません:

  • sizeToFitHeight?
  • 高さに合わせますか?

コメントはとてもありがたいです、ありがとう!

于 2014-05-15T23:35:03.507 に答える
0

Mundiの回答のSwift 3 バージョン:

let maxHeight: CGFloat = 10000
let rect = label.attributedText!.boundingRect(with: CGSize(width: maxWidth, height: maxHeight),
                                                           options: .usesLineFragmentOrigin,
                                                           context: nil)
var frame = labe.frame
frame.size.height = rect.size.height
label.frame = frame
于 2016-12-16T02:59:01.813 に答える