技术分享-bounds的深入认识

---恢复内容开始---

make by -ljw

前言:初学者对bounds的认识是以自己的左上角为坐标原点,而且x/y一般是0,0

但是对bounds深入认识之后,我们应该对它重新认识

以下是对bounds的一些认识:

bounds: x/y一般为(0,0)默认矩形框和内容是重叠的,所以默认是(0,0)

改变一个控件的bounds x/y对控件不会影响,对子控件有影响

修改父控件的bounds为(20,20)那么子控件会相对于父控件上移(20,20)

一个控件的认识:

起码是由两大块组成:

1.矩形框:控件的显示位置和尺寸

2.内容:控件内部的东西,比如它的子控件

bounds:以控件自己内容的左上角为坐标原点,计算出来的矩形框位置和尺寸

所以,bounds是包含位置和尺寸的.

frame:以父控件内容左上角为坐标原点,计算出来的矩形框位置和尺寸

控件本身的位置尺寸是由frame决定的,所以修改bounds,父控件的位置是不会变的

变得是内容的位置.而子控件的位置会随着内容的位置而改变

而此时,子控件发生了偏移,但是子控件的frame不会发生改变,因为子控件的frame是以父控件内容左上角为坐标原点得,内容偏移了(30,30),但是子控件跟随着也偏移了(30,30),相对于内容还是(0,0)

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGRect bounds = self.redView.bounds;
    bounds.origin = CGPointMake(30, 30);
    self.redView.bounds = bounds;

    NSLog(@"%@", NSStringFromCGRect(self.s.frame));
}

实际应用:

scrollview:往下拽,那么子控件的bounds的Y是负数,往上拽,内容往上走,Y值会越来越大

往左拽,内容往左边走,那么相对于内容左上角为原点,X就是正数,越来越大

此时,bounds的尺寸是不变的,还是矩形框的宽高

bounds对contentOffset的影响:

scrollview往上下左右拽,contentOffset也会发生变化,而且变化的值跟bounds是一样的,代表内容的偏移

scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);

bounds对contentInset的影响:

设置内边距为64,那么内容x会使-64,因为内容往下偏移了.

所以修改内边距,可能会永久修改bounds的值,往下拽松手控件跟顶部永远会保留64的间距

实际应用:

tableView的cell设置额外的偏移量

self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);

scrollview同样;

验证:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%@", NSStringFromCGPoint(tableView.bounds.origin));
}

打印一下结果:

所以,bounds的origin跟contentOffset的值是一样的,而修改contentInset也会影响到这两者.

当一个控制器的scrollview套上一个导航控制器,那么scrollview里面的子控件会向下偏移64

就是说,处在导航控制器环境下,系统默认会自动调整距离顶部64的内边距, 那么bounds:-64  ,偏移量也是-64

是什么导致的呢?

隐藏导航条,那么距离顶部偏移量变成20,因为还有状态栏的20.

这样做是为了防止全屏使用scrollview时候挡住控件的显示了,最明显就是tableview的cell了

但是有多个scrollview情况下,只会调整一个

结论:哪个控件先添加,那么就调整谁.

但是很多情况是用不到的(一般用在tableview cell 比较常见).取消这种效果:

1.设置属性

self.automaticallyAdjustsScrollViewInsets = NO;

2.设置相应的偏移量抵消

self.scrollView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

官方文档描述

TabBarController对contentInset的影响:

如果scrollview被套上NavigationController和TabBarController,滚动到最上面,系统会自动下移64,滚到最下面,增加49.保证里面内容都能看到

iOS7之后,苹果做出了这样的效果,并且是可以穿透的. 但是只有TabBarController就不会有自动调整

打印结果:

总结:

frame和bounds的重新认识

  • frame

    • 父控件 内容的左上角为坐标原点, 计算出的控件自己 矩形框的位置和尺寸
  • bounds
    • 控件自己 内容的左上角为坐标原点, 计算出的控件自己 矩形框的位置和尺寸
  • 概括
    • frame.size == bounds.size
    • scrollView.bounds.origin == scrollView.contentOffset

bounds和frame的区别

矩形框和内容的理解

  • 矩形框

    • 控件自己的显示位置和尺寸
  • 内容
    • 控件内部的东西,比如它的子控件

---恢复内容结束---

时间: 05-15

技术分享-bounds的深入认识的相关文章

感知开源的力量-APICloud Studio开源技术分享会

2014.9.15 中国领先的"云端一体"移动应用云服务提供商APICloud正式发布 2015.9.15,APICloud上线一周年,迎来第一个生日 这一天,APICloud 举办APICloud Studio开源技术分享会 我们将对APICloud Studio进行技术开源的全面解析, APICloud Studio遵循Aptana3.0 GPL开源协议,源代码以无条件继承GPL开源协议的方式贡献给业界. 我们相信,通过开源技术分享,我们将和广大开发者一起,不断扩展主流HTML开发

Coding for Speed 技术分享

上周和公司技术同事们作了次<Coding for Speed>技术分享,本来这只是再普通不过的技术探讨和交流(虽然挂了个颇有噱头的名称),但分享的时候逻辑没理好,语速很快,时间也太紧,因此难言是合格的"分享"."探讨",所以我觉得有必要以简短的文章形式对原 PPT 作点补充,即便分享的内容很少也很简单. 本文将按原 PPT 的内容顺序分别作扩展说明或阐述,部分敏感信息将隐去,或只会简单提及. 作本技术分享的初衷,一是在工作中了解及接触了一些我个人认为可优

技术分享(持续更新)

这次的技术分享跟大家介绍一个出现在Tinder and Potluck中的动画效果实现思路,最贴心的是作者提供了OC和Swift两个版本来供开发者使用. OC:https://github.com/zhxnlai/ZLSwipeableView, Swift:https://github.com/zhxnlai/ZLSwipeableViewSwift 非常丝滑顺畅的效果,童鞋们都来上手实践一下吧~

尖峰7月线上技术分享--Hadoop、MySQL

7月2号晚20:30-22:30 东大博士Dasight分享主题<大数据与Hadoop漫谈> 7月5号晚20:30-22:30  原支付宝MySQL首席DBA分享主题<MySQL发展趋势,MySQL各个分支介绍>.<MySQL 5.6版本特性介绍及如何从MySQL 5.5向MySQL 5.6> 7月10号晚20:30-22:30 东大博士Dasight分享主题<Hadoop与Nosql技术的适用性分析> 7月12号晚20:30-22:30  原支付宝MySQ

GIS技术分享 -- 开篇

本人GIS小生一枚,学习和实践GIS已有一段时间.有一小小的愿望 - 希望能够利用自己从事GIS方面的经历,与大家共勉,让大家认识GIS.了解GIS,最终熟悉GIS技术与未来. 我主要写一些GIS的工程理论和技术,偏开发.现在我想我的线索可能是WebGIS,3DGIS两块内容的分享,所有的内容都会以实际开发一个GIS系统为例,探索相关理论和技术. 声明:本人也是在学习的路上,希望与各位们共同学习,共同进步! GIS技术分享 -- 开篇,布布扣,bubuko.com

【技术分享会】谈谈公司内部的技术分享

这段时间,为了促进程序同事间技术氛围,在公司内部组织开展技术分享会.形式很简单,每周进行一次技术分享:分享人由组员顺序安排:题材不限,可以是自己熟悉的技术,比如说服务端的开发者,分享后端定时器,消息队列等等,前端的开发者分享加载的模式,MVC模式等等,可以是一些通用的技术,比如数据结构,算法,代码风格,Effective 系列,调试技巧等,甚至可以是经典书的读后感等等,抑或是最近大家在研究一个开源的项目,也可以跟大家讲一下这个开源项目的框架:或许有些人利用业余时间做了一个小软件,也可以拿出来分享

【沙龙】2014 天山论剑 首届Oracle数据库技术分享交流沙龙

<2014 天山论剑 首届Oracle数据库技术分享交流沙龙>引言:牛顿说"我之所以成功,是因为我站在巨人的肩膀上".每个人都有思考的盲点,借由别人指出你的盲点,实现自我反省,是成功者具备的品质.遇到问题,不再自我摸索,找教练.你和什么样的人在一起,你就会变成什么样的人.只有改变才会带来改变,要想事情变好,只有你先变好. [活动目的] 为了帮助新疆区域内企业更好地利用数据库技术创造更多的利润,推动新疆地区ORACLE数据库技术在企业中的应用,帮助更多的技术人员提高自身的数据

恒天云技术分享系列4 – OpenStack网络攻击与防御

恒天云技术分享系列:http://www.hengtianyun.com/download-show-id-13.html 云主机的网络结构本质上和传统的网络结构一致,区别大概有两点. 1.软网络管理设备(如nova-network,open switch)部分替代硬件网络设备 . 2.多虚拟服务器共享一个宿主机物理网卡(使用Trunk技术). 那么对于云服务器的安全,我们也可以采用传统的网络安全技术去防御.对于云主机,我们同时也需要做好宿主机的防火墙配置,以及安全设置. 1.对于虚拟机进行虚拟

UWA 技术分享连载 转载

技术分享连载1 Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Update方法及其同类空方法,不知道是否还有其他因素? Q3:在Unity的内存管理机制中, Reserved Total 和 Used Total之间的关系是怎样的? Q4:纹理Atlas是建议合成一张2048(尺寸)的纹理还是四张1024的纹理? Q5:在把Unity升级到5.3之后,项目中缓存的粒子特