先看看苹果官方文档对这连个的方法的解释:
- (CGSize)sizeThatFits:(CGSize)size; // return 'best' size to fit given size. does not actually resize view. Default is return existing view size
- (void)sizeToFit; // calls sizeThatFits: with current view bounds and changes bounds size.
意思是说:
- (CGSize)sizeThatFits:(CGSize)size; 会返回一个最适合的 Size,但是不会改变原来视图的frame 的size
- (void)sizeToFit; 内部会调用 - (CGSize)sizeThatFits:(CGSize)size; 方法获取一个最适合的size, 并使用这个size 来调整当前视图的frame 的size.
简单的说:- (CGSize)sizeThatFits:(CGSize)size;
和 - (void)sizeToFit;
都或获取一个最适合的Size
, 但是- (CGSize)sizeThatFits:(CGSize)size;
不会改变原始图的frame,仅仅是返回一个size, 而- (void)sizeToFit;
会为你计算一个最合适的Size
的同时,并根据这个Size
来调整你当前视图的frame
主要应用场景
- (CGSize)sizeThatFits:(CGSize)size;
主要用来计算Size, 比如动态调整TextView的高度
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) UITextView *textView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width
, 10)];
textView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:textView];
[textView sizeThatFits:CGSizeZero];
self.textView = textView;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self.textView];
}
-(void)textDidChange{
// CGSize sizeThatFits = [self.textView sizeThatFits:self.textView.contentSize];
// CGSize sizeThatFits = [self.textView sizeThatFits:CGSizeZero];
CGSize sizeThatFits = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, 500)];
NSLog(@"sizeThatFits: %@", NSStringFromCGSize(sizeThatFits));
self.textView.frame = CGRectMake( self.textView.frame.origin.x, self.textView.frame.origin.y, self.textView.frame.size.width, sizeThatFits.height);
}
@end
在使用UITextView
时,经过测试发现 - (CGSize)sizeThatFits:(CGSize)size;
计算出来的Size
和传入的参数没有直接关系(随便传), 方法内部最终都会根据视图内容来的出最合适的尺寸.
这实际上又从另一方面验证了官方的解释。
- (void)sizeToFit;
主要用来根据内容直接调整视图的尺寸