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
本文深入解析了iOS开发中视图的frame与bounds属性的区别。frame基于父视图坐标系定位,调整会影响视图位置;bounds则定义自身坐标系内的位置与大小,其变化不会影响自身位置但会改变子视图布局。通过实例代码展示了两者在实际应用中的作用。

353

被折叠的 条评论
为什么被折叠?



