frame:根据父视图坐标系来控制自己的位置和大小,修改frame会引起视图位置的变化
bounds:该视图在自己坐标系的位置和大小,修改bounds并不会引起视图位置的变化,但是会引起子视图的位置的变化
主要原因是bounds改变的是自己的坐标系,而它的坐标系是子视图的frame的坐标系,所以子视图的位置会改变
如下代码可以验证:
#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; self.window.rootViewController = [[ViewController alloc] init]; [self.window makeKeyAndVisible]; // frame:根据父视图坐标系来控制自己的位置和大小,修改frame会引起视图位置的变化 // bounds:该视图在自己坐标系的位置和大小,修改bounds并不会引起视图位置的变化,但是会引起子视图的位置的变化 UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)]; view1.bounds = CGRectMake(50, 50, 200, 200); view1.backgroundColor = [UIColor cyanColor]; [self.window addSubview:view1]; NSLog(@"v1:frame = %@", NSStringFromCGRect(view1.frame)); NSLog(@"v1:bounds = %@", NSStringFromCGRect(view1.bounds)); UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; view2.backgroundColor = [UIColor purpleColor]; [view1 addSubview:view2]; NSLog(@"v2:frame = %@", NSStringFromCGRect(view2.frame)); NSLog(@"v2:bounds = %@", NSStringFromCGRect(view2.bounds)); return YES; } @end