iOS中frame和Bounds之间的区别

frame

  frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的。位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有的坐标系,如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS坐标系

  • 在iOS坐标系中以左上角为坐标原点,往为X正方向,往是Y正方向

  • frame中的位置是以父视图的坐标系为标准来确定当前视图的位置

  • 同样的默认情况下,本视图的左上角就是子视图的坐标原点

  • 更改frame中位置,则当前视图的位置会发生改变

  • 更改frame的大小,则当前视图以当前视图左上角为基准的进行大小的修改

  bounds

  bounds是每个View都有的属性,这个属性我们一般不进行设置,他同样代表位置和大小;每个视图都有自己的坐标系,且这个坐标系默认以自身的左上角为坐标原点,所有子视图以这个坐标系的原点为基准点。bounds的位置代表的是子视图看待当前视图左上角的位置;bounds的大小代表当前视图的大小;

  • 更改bounds中的位置对于当前视图没有影响,相当于更改了当前视图的坐标系,对于子视图来说当前视图的左上角已经不再是(0,0), 而是改变后的坐标,坐标系改了,那么所有子视图位置也会跟着改变

  • 更改bounds的大小,bounds的大小代表当前视图的长和宽,修改长宽后,中心点继续保持不变, 长宽进行改变;通过bounds修改长宽看起来就像是以中心点为基准点对长宽两边同时进行缩放;

  frame和bounds

  有如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds

  

  View A是最顶层视图, 因此他的信息如下:frame origin:0, 0 size :550 * 400

  bounds origin:0, 0 size 550 * 400

  因为是View A是顶层视图,所以其实相当于覆盖在框架上,因此位置从父视图的(0, 0)开始,大小为550*400默认情况下,本视图的坐标系是没有发生改变的即当前视图(view A)的左上角就是所有子视图的原点,大小就是当前视图的大小.

  View B是View A的子视图,因此他的信息如下: frame origin:200, 100 size :200 * 250

  bounds origin:0, 0 size :200 * 250

  因为View B是View A的子视图,所以View B的frame位置需要以View A的左上角为参照,因此位置为(200, 100), 大小为200*250bounds在默认情况下本视图的坐标系是没有发生改变的即当前视图(view B)的左上角就是当前视图所有子视图的原点.

  上面这种是普通的情况,也就是没有更改bounds的时候,下面我们来看更改bounds的例子, 如下图:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds

  

  在上一个例子的基础上,我们更改了view A的bounds后,view B看待View A的左上角就已经发生改变了;这个时候我们看待View A的左上角就不是坐标原点了,而是我们通过bounds设置后的坐标,如图也就是(0, 100);在View B的frame没有保存不变的基础上,我们View B的位置向上移动了100

  在第一例的基础上,更改了bounds中X后,效果图如下:

【iOS技术文章】详解iOS开发中frame和Bounds之间的区别

iOS bounds 3

  总结

  1、frame不管对于位置还是大小,改变的都是自己本身

  2、frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置

  3、frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变

  1、bounds改变位置时,改变的是子视图的位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角

  2、bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就像缩放一样。

  

  转自:http://www.lanou3g.com/lozx/2582.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据库]-----mysql数据的冷热分离 第二版

1.前提 这次数据库的冷热分离算是第二次做了 其实之前已经做过一次冷热分离了,涉及到数据库复制时,当时是趋近于业务的(后面会详细讲),整体来讲不是很好用,这次算是重构了吧 做的最终结果还是和前一次一样: 数据库中的订单数据,是每时每刻都在增加 我们认为3个月以内的数据,用…

URL结构

一、概念 URL:统一资源定位符 (Uniform Resource Locator, URL)。 完整的URL由这几个部分构成:scheme://host:port/path?query#hash: scheme:通信协议,常用的有http、https、ftp、mailto等。 host:主机…

[数据库]-----记一次mysql分库的操作(冷热分离)

前提: 1.原有库是mysql数据库,已经根据用户pin分片 2.每片是一主两从 3.主表已经分过表了 4.数据库所在服务器为4C8G 5.库中数据量已经超过千万,而且以每天3万多的数据持续增长,将来每天或许会更多 6.库内数据为订单数据,每时每刻都有新的订单产生,每个…

使用OC进行iOS截屏,同时保证清晰度

一般情况下我们使用如下代码进行截屏:UIWindow *screenWindow [[UIApplication sharedApplication] keyWindow]; UIGraphicsBeginImageContext(screenWindow.frame.size); [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *screenIm…

[python]---从java到python(02)---多线程,队列

多线程测试 #!/usr/bin/env python # -*- coding:utf-8 -*-import threading import timeclass A(threading.Thread):def __init__(self):# 初始化改线程threading.Thread.__init__(self)def run(self):# 该线程要执行的程序内容for i in range(3):print("我是线程A&quo…

将iOS默认上下文坐标系改变为Quartz通常坐标系

由于iOS的UIKit默认的坐标系的原点处于视图的左上角,而Quartz的通常坐标系中的原点位于左下角。当我们使用UIKit的坐标操作CGContextRef的时候,绘制出来的图片是上下颠倒的。因此我们在使用Qaurtz处理图形的时候,往往需要将坐标系转为与Quart…

[python]---从java到python(03)---爬虫

1.简单网页 #!/usr/bin/env python # -*- coding:utf-8 -*-import urllib.requestfile urllib.request.urlopen("https://www.jd.com") data file.read() # dataline file.readline() print(data)fhandle open("E:/python/1_1.html", "wb"…

iOS网络请求认证挑战

一、引言 Http请求中认证挑战相关的代理如下: 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge:2.是否能够对一个保护空间进行认证(已废弃)- connection:canAuthenticateAgainstProtectionSpace:3.…

大数据相关整理

1.hdfs 1.1.namenode 所有文件的读写入口,用来保存文件的元信息 元信息包括: fsimage文件:文件权限信息文件在block块的偏移量文件的位置信息 editlogs文件:对文件的写操作日志文件写日志指令,为了安全同步&#xf…

OC编码规范

一、命名规范 1.类: (1)首字母大写,后续单词首字母大写。 (2)类名末尾要包含此类的类型,比如RootView,RootViewController。 2.属性 (1)属性名称首字母小写,后续首字母大写; (2)使用property,要保持必要的空格&#xf…

数据库---mysql的索引和引擎

mysql 的索引和引擎 mysql的数据都是存放在磁盘上的,都说索引会使查询变快,那么肯定是索引用了特殊的数据结构。 常见的数据结构有: hash hash就是咱们在hashMap中的那个hash,用hash确实快,而且时间复杂度是O&#x…

SQLite内置表SQLITE_MASTER

一、概述1.SQLite数据库中有一个内置表,名为SQLITE_MASTER,此表中存储着当前数据库中所有表的相关信息,比如表的名称、用于创建此表的sql语句、索引、索引所属的表、创建索引的sql语句等。2.SQLITE_MASTER表示只读的,只能对他进行…

redis单线程为什么还快的个人解释

面试的时候, 面试官问,redis是单线程还是多线程 答:单线程 面试官再问,单线程,为什么还快呢?不应该是多线程才更快吗?那这是不是有什么矛盾啊? 答:啊?&#x…

CDN的实现原理

一、传统模式 在描述CDN的实现原理前,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别: 用户提交域名→浏览器对域名进行解释→得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复…

数据库---事务的隔离级别

首先,我们下面说的数据库事务,都是使用INNODB引擎的结果。 MYISAM是没有事务的,也就没有下面这些说法。 1.数据库事务的四大特性: 原子性:事务包含的所有数据库操作要么全部成功,要不全部失败回滚一致性&…

iOS崩溃日志收集

一、概述iOS-App崩溃分为两种,一种是异常:NSException,一种是信号:Signal。二、异常崩溃1.NSException对象(1)reason:崩溃原因。(2)callStackSymbols:调用堆栈。(3)name:崩溃名称(4)userInfo&am…

统计iOS项目代码行数

打开终端,输入如下命令:find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" | xargs wc -l 此命令会迭代子目录,会统计每个源代码文件行数及总数,统计的行数包含空…

一个简单的权限系统模型

我们知道,一般说的简单的权限系统,都是使用shiro或者spring-security shiro之前用的比较多,原理也容易理解,算是比较成熟的权限方面的框架spring-security相对源码比较难懂,但由于与spring的完美融合,也有…

获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表

转载自:http://blog.csdn.net/jasonblog/article/details/49909163 如果要获取当前线程的调用栈,可以直接使用现有API:[NSThread callStackSymbols]。 但是并没有相关API支持获取任意线程的调用栈,所以只能自己编码实现。 1. 基础…

linux---基础01

Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机 Linux的目录结构 bin (binaries)存放二进制可执行文件 boot 存放用…