Objective-C日记-Bounds和Frame

今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之。

一、问题来源

网上有关bounds和frames的比较的文章主要就是一篇:http://blog.csdn.net/mad1989/article/details/8711697,核心思想是bounds的坐标系是相对于自己而言,而frames的坐标系是相对于父视图,主要的演示代码如下:

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[view1 setBounds:CGRectMake(-20, -20, 200, 200)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];//添加到self.view
NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));  

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

如果按以上代码运行可以得到期望的结果:

2017-03-12 21:32:04.474 BoundsAndFrame[5910:450792] view1‘s frame {{20, 20}, {200, 200}}=========view1 bounds:{{-20, -20}, {200, 200}}

2017-03-12 21:32:04.475 BoundsAndFrame[5910:450792] view2 frame:{{0, 0}, {100, 100}}=========view2 bounds:{{0, 0}, {100, 100}}

我们想将这个图形结果进行一些更改:

1、将红色区域变成正方形,并将其宽度加长一倍,变成400。

2、将黄色图形向下移动,使其上边缘距红色图形内部边缘底部为10。如下图所示:

将其代码更改为:

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[view1 setBounds:CGRectMake(-20, -190, 400, 200)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];//添加到self.view
NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));  

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds)); 

但得到的结果如下所示,并不是我们想要的。

2017-03-12 21:40:57.170 BoundsAndFrame[5950:457772] view1‘s frame {{-80, 20}, {400, 200}}=========view1 bounds:{{-20, -190}, {400, 200}}

2017-03-12 21:40:57.170 BoundsAndFrame[5950:457772] view2 frame:{{0, 0}, {100, 100}}=========view2 bounds:{{0, 0}, {100, 100}}

二、问题分析

按上面比较bounds和frames区别的那篇文章来讲,

[view1 setBounds:CGRectMake(-20, -190, 400, 200)];

这个语句中的setBounds方法的功能是将本view的bounds坐标原点强制设置成(-20,-190),并将CGRect的宽和高设置成(400,200)。

按计算,被转换过后的view1的frame坐标应该还是(20,20),宽高(400,200)。

三、问题解决

那篇比较bounds和frames的文章中有一个重要的问题没有提到,最后在Apple的API Reference中找到答案:

Changing the bounds size grows or shrinks the view relative to its center point.(对形状边界进行扩大或缩小,是相对于其中心点进行的。)

我概括使用bounds属性进行坐标和大小变换的原则:以中心为原点进行缩放,先宽高后坐标。

是要先进行宽和高的变换,比如这上面那句

[view1 setBounds:CGRectMake(-20, -190, 400, 200)];

宽度的变换是以中心为原点,向两边各延长100,高为200不变。

大小变换完成之后,再将得到的图形的原点(左上角顶点)的bounds坐标设置为(-20,-190)。

这样,再进行计算,便得到了上述结果。

时间: 2024-10-24 23:18:18

Objective-C日记-Bounds和Frame的相关文章

一张图让你明白IOS中bounds和frame的区别

很多人在学习的就搞混了bounds和frame的区别,大家可以看看这张图就会明白它俩的区别: frame: 该view在父view坐标系统中的位置和大小.(参照点是,父亲的坐标系统) bounds:该view在本地坐标系统中的位置和大小.(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点) center:该view的中心点在父view坐标系统中的位置和大小.(参照点是,父亲的坐标系统) 看上图中,如果将ViewA的bounds设置为(-200,-100,550,400)

UIView 中bounds和frame的差别

搞iOS开发的童鞋基本都会用过UIView,那他的bounds和frame两个属性也不会陌生,那这两个有什么实质性的区别呢? 先看到下面的代码你肯定就明白了一些: -(CGRect)frame{     returnCGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height); } -(CGRect)bounds{     returnCGRectMake(0,0,

IOS bounds 与 frame的区别

今天写案例代码,发现资料上设置一个UIButton的frame时,是这样设置的 btnCover.frame = self.view.bounds; 但是我自己一开始是这样写的 btnCover.frame = self.view.frame; 后来,我发现,两个不同的写法都达到了我想要的想过,也就是UIButton的大小和父容器的大小一致,我就纳闷了,既然是同样的效果,为什么即有bounds又有frame.后来经查,发现如下区别: -(CGRect)frame{ return CGRectMa

关于 bounds 和 frame

-(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的原点是(0,0)点(就是view本身的坐标系统,默认

iOS frame和Bounds 以及frame和bounds区别

frame frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的.位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有的坐标系,如下图: iOS坐标系 在iOS坐标系中以左上角为坐标原点,往右为X正方向,往下是Y正方向 frame中的位置是以父视图的坐标系为标准来确定当前视图的位置 同样的默认情况下,本视图的左上角就是子视图的坐标原点 更改frame中位置,则当前视图的位置会发生改变 更改frame的大小,则当前视

UI部分bounds和frame

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    //设置viewController的背景色,准确的说,我们是设置viewController的View的背景色    self.view.backgroundColor=[UIColor magentaColor];        //新建一个UIView        UIView *bl

bounds和frame的区别?

frame和bounds都市用来描述一块区域的 frame是以父控件的左上角为原点,可视范围相对于父控件 bounds:描述是可视范围在内容哪个区域,相对于内容. 可视化区域在内容中显示区域,bounds的x,y可以改(改的是内容原点的位置) 任何控件都有自己的内容,而且这个内容无限大 子控件都市相对于内容 UIView *redView = [[UIView alloc] init]; redView.frame = CGRectMake(50, 50, 200, 200); redView.

iOS界面篇 - bounds和frame的相同和区别

相同点: 他们都是CGRect类型,且拥有属性origin(x, y),  size(weight, height) 不同点: bounds是你画的视图的边界,和父视图没有半毛钱关系 frames则一定是相对于父视图而言的 在通常情况下他们是相似的,但是特殊情况,比如旋转的时候,他们就不一样了 广说太抽象了 还是用实际图形来表达一下吧 旋转以后 这下明白了吧 (再看不懂不要说你太...)

bounds 和frame区别

仔细看下这个图就知道了