sizeThatFitsとsizeToFitの違い
Difference Between Sizethatfits
1.1。
UIViewには、UIViewの適切なbounds.sizeを計算するためのsizeToFitメソッドがあります。自動レイアウトの制約付きビューは無効であることに注意してください。
testLabel.numberOfLines = 0 ///は行数を制限しないことと同等であり、sizeToFitにも影響します
二。
-(void)sizeToFit
-(CGSize)sizeThatFits:(CGSize)size
次のように説明されています:
sizeToFitを呼び出すと、sizeThatFitsメソッドが自動的に呼び出されます。
sizeToFitはサブクラスでオーバーライドしてはならず、sizeThatFitsをオーバーライドする必要があります
sizeThatFitsで渡されるパラメーターは、レシーバーの現在のサイズであり、適切なサイズを返します
sizeToFitはUIViewのフレームを変更できますが、sizeThatFitsはUIViewのフレームを変更しません
sizeToFitメソッドとsizeThatFitsメソッドは再帰的ではなく、サブビューを担当しません。彼らは自分自身にのみ責任があります。
3.3。
NSStringは、次のようにラベルに役立ちます。
1行のテキストのメトリックの計算(1行のテキストの場合)
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
複数行のテキストのメトリックの計算(複数行のテキストの場合、これは一般的に使用されます)
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
たとえば、マイクロブログセルを実行する場合、ラベルのテキストに基づいてラベルのサイズを計算することがよくあります。
ラベルのサイズを変更するためにサイズを取得するために、「sizeWithFont:constrainedToSize:」をよく使用します。
実際、これはラベルの「sizeToFit」に置き換えることができます。ラベルが「sizeToFit」を呼び出すと、ラベル自体のサイズが自動的に変更されるため、このメソッドには戻り値がありません。 ''の計算に満足できない場合は、UILabelを継承してラベルをカスタマイズし、ラベルの 'sizeThatFits:'メソッドを書き直すことができるため、カスタムラベルの 'sizeToFit'の動作が変更されます。
4.例
実際、UIViewのsizeToFitが呼び出されると、sizeThatFitsメソッドが呼び出されてUIViewのbounds.sizeが計算され、frame.sizeが変更されます。
#import 'MyLabel.h' @interface MyLabel() { CGSize _cacheSize1 } @end @implementation - (instancetype)initWithFrame:(CGRect)frame { //First step self = [super initWithFrame:frame] if (self) { _label1 = [UILabel new] _label1.numberOfLines = 0 _label1.backgroundColor = [UIColor orangeColor] } return self } - (void)layoutSubviews{ [super layoutSubviews] //third step _label1.frame= // Calculate the Label frame according to _cacheSize1 } - (CGSize)sizeThatFits:(CGSize)size { //Step 2 CGFloat w = size.width _label1.text = @'test text' _cacheSize1 = [_label1 sizeThatFits:CGSizeMake(w, MAXFLOAT)] Return CGSizeMake(size.width, custom height) } @end
転送
MyLabel *customerView = [[MyLabel alloc] init] [customerView sizeToFit] [self.view addSubview:customerView]