博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS视图View 的frame与bounds的区别
阅读量:2384 次
发布时间:2019-05-10

本文共 1939 字,大约阅读时间需要 6 分钟。

    在学习IOS一段时间后,突然对view 的frame和bounds这两个属性搞迷糊了,不知两者的区别了,只记得以前有学过,今天重新再复习一下,看来好记性不如烂笔头,做个笔记,帮助自己记忆和快速复习。

基本区别:

bounds是指这个view在它自己坐标系的坐标和大小,而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块。

很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。绝对坐标。。。相对坐标。。。比如屏幕旋转的时候就要以相对来重绘。 
frame 如果一个按钮,是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标

我也想知道任何一个uiview如何求得它在屏幕上的坐标()。

一、首先列一下公认的资料:

先看到下面的代码你肯定就明白了一些:

-(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本身的坐标系统,默认永远都是0,0点,除非认为setbounds),而frame的原点却是任意的(相对于父视图中的坐标位置)。

再来看张图就明白了,

165306_iO8i_2557944.jpg

        frame: 该view在父view坐标系统中的位置和大小。(参照点是,父坐标系统)

        bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
        center:该view的中心点在父view坐标系统中的位置和大小。(参照点是,父坐标系统)

我个人认为,bounds稍微有点费解,稍不留神,想的多了,就会绕进去。每个view都有一个本地坐标系统。这个坐标系统作用比较重要,比如触 摸的回调函数中的UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。当然bounds这个属性也是参照这个本地坐标系统来的。其实本地 坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,当然最上面的一层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。通过修改view的bounds属性可以修改本地坐标系统的原点位置。

所以,我个人认为,bounds影响到子view的位置和大小。

二、demo演示:

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 250)];    [view1 setBounds:CGRectMake(-20, -20, 280, 250)];    view1.backgroundColor = [UIColor redColor];        // 添加到self.view    [self.view addSubview:view1];    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上,[此时view1坐标系左上角起点为(-20,-20)]    [view1 addSubview:view2];    NSLog(@"view2 frame:%@===view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

170354_J4M4_2557944.jpg

170502_jaxS_2557944.jpg

(log输出日志表明,每个新的view默认的bounds其实都是(0,0))

延伸阅读: frame在项目中的相关应用示例:

转载于:https://my.oschina.net/corwien/blog/657464

你可能感兴趣的文章
New Tool: The PenTesters Framework (PTF) Released
查看>>
Detecting and Defending against PowerShell Shells
查看>>
NagVis实物监控工具
查看>>
nginx - low risk webdav destination bug
查看>>
Lessons Learned from Building and Running MHN, the World's Largest Crowdsourced Honeynet
查看>>
Logwatch Linux/Unix系统日志检测软件
查看>>
减少Linux下Squid服务器的TIME_WAIT套接字数量
查看>>
/etc/sudoers中的含义
查看>>
Five must-know open source SDN controllers
查看>>
Finding Bad Guys with 35 million Flows, 2 Analysts, 5 Minutes and 0 Dollars
查看>>
SANS FOR572 Logstash
查看>>
apt成熟度模型
查看>>
Digital Forensics Framework v0.4.3 available
查看>>
linux设置bond网卡绑定
查看>>
Is your .svn showing (like 3300 other sites)?
查看>>
PCI DSS Update Could Include Virtualization Security(转载自baoz)
查看>>
List of Windows Auto Start Locations
查看>>
OSSIM 2.1 - Multiple security vulnerabilities
查看>>
PHP文件上传源码分析(RFC1867)
查看>>
关于php5.*后的时区问题 date_default_timezone_set ();
查看>>