Frame,Bounds和Center的区别,联系

部分内容转载自:http://blog.csdn.net/mad1989/article/details/8711697

看一段Demo:

UIView *view1 = [[UIViewalloc]
initWithFrame:CGRectMake(20,20,
280,250)];

[view1 setBounds:CGRectMake(-20, -20,500,
500)];

view1.backgroundColor = [UIColorredColor];

[self.viewaddSubview:view1];//添加到self.view

NSLog(@"view1 frame:%@========view1 bounds:%@======view1 center:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds),NSStringFromCGPoint(view1.center));

[view1 setFrame:CGRectMake(50,50,
200,200)];

NSLog(@"again===view1 frame:%@========view1 bounds:%@======view1 center:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds),NSStringFromCGPoint(view1.center));

UIView *view2 = [[UIViewalloc]
initWithFrame:CGRectMake(0,0,
100,100)];

view2.backgroundColor = [UIColoryellowColor];

[view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-20,-20)]

NSLog(@"view2 frame:%@========view2 bounds:%@======view2 center:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds),NSStringFromCGPoint(view2.center));

再看下log日志:

2015-02-13 14:44:21.767    [37262:272312] view1 frame:{{-90, -105}, {500, 500}}========view1 bounds:{{-20, -20}, {500, 500}}======view1 center:{160, 145}

2015-02-13 14:44:21.768    [37262:272312] again===view1 frame:{{50, 50}, {200, 200}}========view1 bounds:{{-20, -20}, {200, 200}}======view1 center:{150, 150}

2015-02-13 14:44:21.768    [37262:272312] view2 frame:{{0, 0}, {100, 100}}========view2 bounds:{{0, 0}, {100, 100}}======view2 center:{50, 50}

可以得出这几个结论:

1.bounds和frame的size的width和height都一样

2.若frame改变,则bounds和center都改变

3.若bounds改变,则frame改变,但是center不变

4.bounds会影响当前view的subview的位置,但不会影响当前view的位置。

以上的结论有一个前提,就是view的transform属性的值是恒等变换的,(也就是CGAffineTransformIsIdentity()的值是YES)。

如果transform属性的值不是恒等变换的,那么frame属性的值就是为定义的,必须被忽略。在设置变换属性之后,要使用bounds和center属性来获取视图的位置和大小。

这种情况往往发生在对view的属性做transform变换之后。

以一个Demo来举例:

UIView *testView = [[UIView
alloc] initWithFrame:CGRectMake(0,
0, 100,
100)];

testView.backgroundColor = [UIColor
greenColor];

[self.view
addSubview:testView];

testView.transform =
CGAffineTransformMakeScale(0.5,
0.5);

NSLog(@"testView frame:%@========testView bounds:%@======testView center:%@",NSStringFromCGRect(testView.frame),NSStringFromCGRect(testView.bounds),NSStringFromCGPoint(testView.center));

打印的log日志如下:

2015-02-13 16:13:09.791    [39158:326284] testView frame:{{25, 25}, {50, 50}}========testView bounds:{{0, 0}, {100, 100}}======testView center:{50, 50}

此时

CGAffineTransformIsIdentity(testView.transform)为NO。

这就是一个不恒等变换,此时的位置要根据bounds和center来计算得出。设置

testView.transform =
CGAffineTransformIdentity;可以复原testView的位置,也就是frame为(0,0,100,100)。

时间: 2024-10-06 07:11:38

Frame,Bounds和Center的区别,联系的相关文章

ios开发之UIView的frame、bounds跟center属性的区别(附图)

博文暂时想到什么写什么,不顺理成章,不顺章成篇. 先看几个概念 坐标点Poit:向右侧为X轴正方向的值x,原点下侧为Y轴正方向的值y 大小Size:由宽度width和高度height构成,表示一个矩形 区域Rect:它有坐标点Poit和大小Size构成,表示一个区域,既有位置也有大小 相对:有参照物,因参照物的大小位置改变而改变 绝对:无参照物,大小位置固定 再看代码构成: 点由这样来创建,X轴大小和Y大小 CGPoint point = CGPointMake(80,40) 大小Size由这样

iOS开发——使用OC篇&frame,bounds,center,position,anchorPoint总结

frame,bounds,center,position,anchorPoint总结 图层的 position 属性是一个 CGPoint 的值,它指定图层相当于它父图层的位置, 该值基于父图层的坐标系. 图层的 bounds 属性是一个 CGRect 的值,指定图层的大小(bounds.size)和图层的 原点(bounds.origin).当你重写图层的重画方法的时候,bounds 的原点可以作为图形 上下文的原点. 图层拥有一个隐式的 frame,它是 position,bounds,an

IOS开发之深入坐标系frame、bounds、center、 transform的不同与联系

有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 1.1 frame属性 a.什么是frame 类型:CGRect结构体(size  origin) 作用:该视图左顶点在父视图的坐标系下的位置,以及该视图在父视图中占据的宽和高 b.直接修改了frame,其他属性如何变化? bounds:     会 center:       会 transform:  不会 c.什么时候使用frame 当把一个视图添加到父视图中时,一定要设定fr

初见IOS的UI之:UI控件的属性frame bounds center 和transform

这些属性,内部都是结构体:CGRect CGPoint CGFloat 背景知识:所有的控件都是view的子类,屏幕就是一个大的view:每个view都有个viewController,它是view的管家,每个view对应着一个viewController,来管理view. frame & bounds & center ======================================== 1> frame可以修改对象的位置和尺寸 2> bounds可以修改对象的尺

IOS开发之控件frame/bounds/center尺寸改变小技巧-简单给UIView新增分类(github链接)

大家是否还记得对控件的frame/bounds/center进行属性更改时的三部曲? 1>将结构体取出 2>改变取出后的结构体对应的数据 3>将修改后的结构体赋值给控件 CGRect frame = self.view.frame; // your code... frame.origin.x = frameX; // your code... self.view.frame = frame; 这在实际工作中需要更改相应属性的时候是很不方便的,所以考虑到直接在UIView的分类中添加相应

iOS编程(双语版)-视图-Frame/Bounds/Center

1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过视图的指定初始化器initWithFrame 下面来看个例子,该例子初始化了3个相互叠加的矩形区域 (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(113, 111, 132, 194)]; v1.backg

简述frame、bounds、center

frame是该视图在父视图坐标系统中的位置和大小.(参照父视图中的坐标系统) bounds是该视图在自身坐标系统中的位置和大小.(参照自身的坐标系统) center是该视图的中心点在父视图坐标系统中的位置. bounds会比较难理解,容易绕糊涂 下面看几个图 红色视图为父视图,当前父视图的bounds为(0,0) 蓝色视图为子视图,当前子视图的frame为(10,10) 红色视图为父视图,当前父视图的bounds为(10,10) 蓝色视图为子视图,当前子视图的frame为(10,10) 父视图的

margin:0 auto 与 text-align:center 的区别

基本概念:1.text-align: 属性规定元素中的文本的水平对齐方式;  该属性通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式;一般情况下设置文本对齐方式的时候使用此属性.例如:div { text-align: left; }  //文本居左对齐.所有浏览器都支持 text-align 属性:任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit".2.margin 是设置对象四边的外延边距,被称为外补丁或外边距.例如:

contentOffset,frame,bounds,contentSize,ContentInset

contentOffset, 在UIScrollview里面滚动条用的最多,比如网易新闻的滚动条,肯定会用到这个. 我认为:它是下一个要显示的图片的左上角.设置了这个左上角后,下一次滚动时,邮戳直接到了这个点,然后配合width和height,然后就把下一张图片显示出来了. 这个还有一个好处就是:这样设置后,下一次要显示这个UIImageView,但是,用户是看不出来变化的,大家总体感觉是一直往右滑的. 否则,如果直接设置他的坐标,就会给一种猛的返回的感觉. frame,用的太多了,它的坐标就是