博客> IOS中frame和bounds的区别
IOS中frame和bounds的区别
2小时前 评论:0 阅读:1176 tanlong
ios frame 坐标 bounds

很多新手在frame和bounds这两个问题上搞不清楚,简单的说frame是参照父视图的坐标系统,而bounds是参照自身的坐标系统。首先来看看这张图。

 1.jpg

以下是我写的一个简单demo,并附上了图片。

1.frame和bounds的差异。

 frame: 指的是该view在fatherView坐标系统中的位置和大小。(参照的坐标起点是父视图的坐标系统)
 bounds:该view在本地坐标系统中的位置和大小。(参照点是自己的坐标系统,起点坐标为(0,0))
 例如,下方创建了view1和view2,view1和view2的bounds起点坐标都是{0,0}(此处起点亦为原点的意思)

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
UIView *view2 = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 200, 200)];
self.view.backgroundColor = [UIColor whiteColor];
view1.backgroundColor = [UIColor blueColor];
view2.backgroundColor = [UIColor greenColor];
[self.view addSubview: view1];
[view1 addSubview:view2];
NSLog(@"1.view1:frame:%@---------bounds:%@\n view1:frame:%@---------bounds:%@\n", NSStringFromCGRect(view1.frame),  NSStringFromCGRect(view1.bounds),
      NSStringFromCGRect(view2.frame),  NSStringFromCGRect(view2.bounds));

 屏幕快照 2016-07-28 下午9.19.13.png

 屏幕快照 2016-07-28 下午9.19.22.png

再修改view1以及view2的bounds,通俗来说
 1.修改自身的bounds并不会对本身的视图位置产生影响(即bounds改变,自身视图位置不动),而修改frame会。
 2.修改bounds会对子视图的位置产生改变,等同于修改了子视图对应的父视图的坐标系统,修改frame会对自身的位置尝试改变,子视图的对父视图相对位置不变。
 3.修改bounds和frame都不会对父视图的位置产生改变。     */

[view1 setBounds:CGRectMake(-30, -30, 300, 300)];
NSLog(@"2.view1:frame:%@---------bounds:%@\n view1:frame:%@---------bounds:%@\n", NSStringFromCGRect(view1.frame),  NSStringFromCGRect(view1.bounds),
      NSStringFromCGRect(view2.frame),  NSStringFromCGRect(view2.bounds));
[view1 setFrame:CGRectMake(0, 0, 300, 300)];
NSLog(@"3.view1:frame:%@---------bounds:%@\n view1:frame:%@---------bounds:%@\n", NSStringFromCGRect(view2.frame),  NSStringFromCGRect(view1.bounds),
      NSStringFromCGRect(view2.frame),  NSStringFromCGRect(view2.bounds));

 屏幕快照 2016-07-28 下午9.21.59.png

 屏幕快照 2016-07-28 下午9.22.12.png

如果修改过后的bounds视图大小大于frame,则视图会被撑大。(缩小同理)
   例如width增加了40,则会以center中心,中心静止不动,左右各往外增加20个单位坐标。  

[view1 setBounds:CGRectMake(-30, -30, 340, 340)];
NSLog(@"4.view1:frame:%@---------bounds:%@\n view1:frame:%@---------bounds:%@\n", NSStringFromCGRect(view1.frame),  NSStringFromCGRect(view1.bounds),
      NSStringFromCGRect(view2.frame),  NSStringFromCGRect(view2.bounds));

 屏幕快照 2016-07-28 下午9.23.14.png  屏幕快照 2016-07-28 下午9.23.20.png

收藏
1
sina weixin mail 回到顶部