bounds 以及 frame 的区别
最近被问了bounds与frame的区别,当时只想到了frame是父类坐标系,bounds是自身坐标系。后来经过API的查询,API确实说的很对,但是当时没看懂,不过还是靠代码实验了出来。
先给大家看两个代码,说明一下frame和bounds的坐标系关系。
`-(CGRect)frame{
return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}`
所以我们不论怎么改一个对象的bounds的origin属性,这个对象的坐标都是显示在(0,0)点,以为显示的self.window,是frame决定的,而bounds是自身的偏移,下面会分开介绍的bounds的两个属性。
不过我要介绍一个下面很有用的数学知识,重点:图形是靠坐标系建立的,而坐标系是客观存在的,所以frame和bounds是两个坐标系,frame是父类的坐标系,bounds是自身的坐标系。
代码说明 bounds 的 origin属性
`- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
UIView *superView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.window addSubview:superView];
superView.bounds = CGRectMake(50, 50, 100, 100);
superView.backgroundColor = [UIColor redColor];
UIView *view1 = [[UIView alloc] init];
view1.frame = CGRectMake(0, 0, 100, 100);
view1.backgroundColor = [UIColor blackColor];
[superView addSubview:view1];
NSLog(@"%@",view1);
return YES;
}`
像前面说的 bounds 是以自身为坐标系 CGRectMake(50, 50, 100, 100) 就是向右偏移了50,向下偏移了50,但是真实显示出来的坐标还是 (100,100),这是因为Frame CGRectMake(100, 100, 100, 100),而我们显示的self.window的坐标系,frame是父类的坐标系superView
是加载在self.window上的,相当于整个坐标系跟着superView向右偏移了50,向下偏移了50。所以无论bounds的origin属性怎么改,显示的坐标都是(100,100),因为我们显示的是self.window。当然这并不是说bounds属性没有用,当我们在superView上在添加一个view1,并且让view1.frame = CGRectMake(0, 0, 100, 100),如果superView没有修改bounds属性,那么应该是view1覆盖住superView,但是因为修改bounds属性,我们可以发现它的坐标是(50,50),这就是我开始说的两个坐标系的问题。self.window的坐标系跟随着superView向右偏移了50,向下偏移了50,就相当于superView的坐标系相对于self.window的坐标系向左偏移了50,向上偏移了50。
重点2:我们可以看到手机上确实如我们所说那样显示了,但是视图关系为什么不是那样的呢,这就是我要告诉大家的,视图关系只可以参考,不能全信,因为它会骗人的。第一点视图关系显示的坐标系是superView的,第二点superView因为bounds所产生的偏移,在手机上用的是手机常用笛卡尔左手坐标系,而视图层用的数学常用笛卡尔右手坐标系,不知道的可以百度一下。
最麻烦的过去了,下面介绍一下bounds 的 size属性。
代码说明 bounds 的 origin属性
`- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
UIView *superView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.window addSubview:superView];
superView.bounds = CGRectMake(0, 0, 200, 200);
superView.backgroundColor = [UIColor redColor];
UIView *view1 = [[UIView alloc] init];
view1.frame = CGRectMake(0, 0, 100, 100);
view1.backgroundColor = [UIColor blackColor];
[superView addSubview:view1];
NSLog(@"%@",view1);
return YES;
}`
这代码显示出来的图形,大家估计又要迷惑了,其实很简单,我们用frame定义位置的时候,点 指的是左上角的点,而bounds 的 点 是自己的中心点。当然了上面的这么东西API里有着很详细的概述,奈何博主英文实在堪忧啊,看的迷迷糊糊,当然代码实验完了之后发现人家说的真的是对的,反正我看的那块说的都是对的,只是有些可能我还没有看到。
反正是总结完了。