时间:2017-12-20 来源:

深入浅出了解frame和bounds

frame

frame的官方解释如下:

The frame rectangle, which describes the view’s location and size in its superview’s coordinate system.

This rectangle defines the size and position of the view in its superview’s coordinate system. Use this rectangle during layout operations to set the size and position the view. Setting this property changes the point specified by the center property and changes the size in the bounds rectangle accordingly. The coordinates of the frame rectangle are always specified in points.

它定义了一个view相对于父视图坐标系的位置和大小,网页外包接活它会影响center属性和bounds属性的size.
先看一下它究竟是什么?
它是一个CGRect类型,网页切图价格如下:

struct CGRect {    CGPoint origin;    CGSize size;};typedef struct CG_BOXABLE CGRect CGRect;struct CGPoint {    CGFloat x;    CGFloat y;};typedef struct CG_BOXABLE CGPoint CGPoint;/* Sizes. */struct CGSize {    CGFloat width;    CGFloat height;};typedef struct CG_BOXABLE CGSize CGSize;

其中的origin就是该view的位置,div+css制作它是一个CGPoint类型,div+css报价也是一个结构体,兼职手机网页制作包含了我们熟知的常用二维坐标系的x、y.根据x、y可以在坐标系里面唯一确定一个点.如下图:
frame

这个坐标系和我们平时接触的还不太一样,html静态页面制作它是向右向下为正方向.所以对于window来说,web切图报价其原点是左上角,psd转html40).按照原来常规的坐标系来说网页外包接活,-40).
在设置一个CGRect的时候web前端制作,其实现如下:

CG_INLINE CGRectCGRectMake(CGFloat x, CGFloat width,然后逐个赋值.
关于frame,0,200),高200的子视图(前提是没有改变父视图的bounds, which describes the view’s location and size in its own coordinate system.

The default bounds origin is (0, set the contentMode property to UIViewContentModeRedraw.
Changes to this property can be animated.

它也是描述的是视图的位置和大小符合w3c标准, 80, rect.size.height - 160)]; self.parentView.backgroundColor = [UIColor redColor]; [self.view addSubview:_parentView]; NSLog(@"frame:%@",NSStringFromCGRect(self.parentView.bounds)); NSLog(@"center:%@", 80}, 408}}bounds:{{0, {200, 284}

由此可见web前端制作,如果我们没有去更改bounds的值,web前端制作它默认的位置坐标点是(0, instead of the frame property, even when scaling or rotation factors are applied to the view's transform.

Changes to this property can be animated.

center是view的中点.该属性是想归于父类的坐标系确定的.从bounds小节里面的例子可以看到center的值符合w3c标准, relative to the center of its bounds.
Use this property to scale or rotate the view's frame rectangle within its superview's coordinate system. (To change the position of the view, the anchor point is equal to the center point of the frame rectangle. To change the anchor point, the transform property does not affect Auto Layout. Auto layout calculates a view’s alignment rectangle based on its untransformed frame.

它用于指定视图的变换.使用这个属性可以放大或者旋转视图承接网页制作,它的frame会因此改变,兼职手机网页制作是以中心点为变换的.看例子:

- (void)viewDidLoad {    [super viewDidLoad];       CGRect rect  = self.view.frame;    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, rect.size.width-120,NSStringFromCGRect(self.parentView.frame));    NSLog(@"bounds:%@",NSStringFromCGPoint(self.parentView.center));        self.parentView.transform = CGAffineTransformMakeRotation(60);       NSLog(@"after change transform,NSStringFromCGRect(self.parentView.frame));    NSLog(@"after change transform,NSStringFromCGRect(self.parentView.bounds));    NSLog(@"after change transform,NSStringFromCGPoint(self.parentView.center));}

看输出的结果:

frame:{{60, {200, 0}, 408}}center:{160,frame:{{2.5773352536321568, {314.84532949273569,bounds:{{0, {200,center:{160, 284}

如图:
transform
可以看出,兼职手机网页制作当我们对图像通过旋转web切图报价, 59.226689885086444}, 449.54662022982711}},59.2),大小也变成了双箭头黑线标注的大小.
因此得出结论:进行了transform变换,div+css制作其frame改变了承接网页制作,但是其bounds和center并没有修改.此时bounds的size和frame的size已经没有关系了.当没有进行任何transform时,兼职手机网页制作frame的size总是和bounds相等.

以上便是对frame、bounds、center和transform做了一个简单的介绍.

bounds的使用

接下来看一个例子(例子A):

- (void)viewDidLoad {    [super viewDidLoad];       CGRect rect  = self.view.frame;    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, rect.size.width-120,NSStringFromCGRect(self.parentView.frame));    NSLog(@"bounds:%@",NSStringFromCGPoint(self.parentView.center));     self.parentView.bounds = CGRectMake(-40, self.parentView.frame.size.width,frame:%@",bounds:%@",center:%@", 20, 100)];    self.childView.backgroundColor = [UIColor yellowColor];    [self.parentView addSubview:_childView];       NSLog(@"childView frame:%@",NSStringFromCGRect(self.childView.bounds));    NSLog(@"childView center:%@",然后对parentView的bounds进行修改和不修改进行了测试符合w3c标准,结果如下:
change bounds
你会发现当修改了parentView的bounds之后,符合w3c标准发现childView缺向右向下做了偏移.这里设置parentView的bounds的origin为(-40,-40)为何会发生这种情况呢?接下来先看一下下面这张图:
坐标系

+代表正方向,网页外包接活-代表负方向.

如果此时我们没有改变图中O的坐标web前端制作,20),-20),0),但是A坐标是不变的,html切图制作所以它会到黑色A处.所以你改变了原点坐标为负之后网页外包接活,20), 80, rect.size.height - 160)]; self.parentView.backgroundColor = [UIColor redColor]; [self.view addSubview:_parentView]; NSLog(@"parent change bound ,NSStringFromCGRect(self.parentView.frame)); NSLog(@"parent change bound ,NSStringFromCGRect(self.parentView.bounds)); NSLog(@"parent change bound ,NSStringFromCGPoint(self.parentView.center)); self.childView = [[ChildView alloc] initWithFrame:CGRectMake(self.parentView.frame.origin.x, 100,NSStringFromCGRect(self.childView.frame)); NSLog(@"childView ounds:%@",NSStringFromCGPoint(self.childView.center)); NSLog(@"\n--------\n"); CGRect parentBounds = self.parentView.bounds; [UIView animateWithDuration:2 animations:^{ self.parentView.bounds = CGRectMake(parentBounds.origin.x, parentBounds.size.width,parentView frame:%@",parentView ounds:%@",parentView center:%@",childView frame:%@",childView bounds:%@",childView center:%@",frame:{{60, {200,bounds:{{0, {200,center:{160, 288}, 100}}childView ounds:{{0, {100, 338}--------anim finished, 80}, 408}}anim finished, 400}, 408}}anim finished, 284}anim finished, 288}, 100}}anim finished, 0}, 100}}anim finished, 338}

运行效果是childView向上移动网页外包接活,然后停止.结果前后对比图如下:
animation bounds
直观来看,jpg或psd转html按说childView的frame改变了web前端制作,但是从console输出的结果来看,web前端制作childView的frame/bounds/center都没有改变承接网页制作,只有bounds改变了web切图报价,frame和center却没变,网站div+css从直观来看parentView没有任何更改.所以很有可能是parentView的bounds修改引起了childView的位置更改.这是为什么呢?这里先不说明为什么符合w3c标准,NSStringFromCGRect(_scrollView.frame)); NSLog(@"scrollview bounds:%@",NSStringFromCGPoint(_scrollView.center)); self.scrollView.contentSize = CGSizeMake(800, 100, 300)]; self.parentView.backgroundColor = [UIColor redColor]; [self.scrollView addSubview:_parentView]; NSLog(@"parentView frame:%@",NSStringFromCGRect(_parentView.bounds)); NSLog(@"parentView center:%@",NSStringFromCGRect(_scrollView.frame)); NSLog(@"didScroll scrollview bounds:%@",NSStringFromCGPoint(_scrollView.center)); NSLog(@"didScroll parentView frame:%@",NSStringFromCGRect(_parentView.bounds)); NSLog(@"didScroll parentView center:%@",NSStringFromCGPoint(_parentView.center)); printf("\n-------------------------------------------\n");}

当滚动视图的时候,div前端切图console输出结果如下:

scrollview frame:{{0, {320, 0}, 568}}scrollview center:{160, 100}, 300}}parentView bounds:{{0, {250, 250}didScroll scrollview frame:{{0, {320, -20}, 568}}didScroll scrollview center:{160, 100}, 300}}didScroll parentView bounds:{{0, {250, 250}-------------------------------------------didScroll scrollview frame:{{0, {320, 31.5}, 568}}didScroll scrollview center:{160, 100}, 300}}didScroll parentView bounds:{{0, {250, 250}-------------------------------------------didScroll scrollview frame:{{0, {320, 162}, 568}}didScroll scrollview center:{160, 100}, 300}}didScroll parentView bounds:{{0, {250, 250}

根据输出结果可以看到web前端制作,parentView的center、frame、bounds在滚动过程中都没有作出更改,web前端制作但是我们看到的它的位置的确改变了.而对于scrollView来说承接网页制作,其frame和center也没有更改,div前端切图但是bounds更改了.
这种现象和上面提到的(例子B)的现象一样web切图报价,都是对bounds进行了修改.然后子视图从新进行了布局.说道子视图重新布局,web切图报价让我想到了一个方法:

- (void)layoutSubviews;

从字面意思看就是布局某个视图的子视图符合w3c标准,那么会不会和这个方法有关呢?因此我在自定义的ZGUIScrollView里面实现了该方法:

- (void)layoutSubviews {    NSLog(@"scrollview's layoutSubViews called");    [super layoutSubviews];}

再次滚动界面,符合w3c标准发现每次滚动都会调用scrollview的layoutSubViews方法.苹果官方文档介绍:

Lays out subviews.

The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

它的作用就是布局一个视图上的子视图.确定子视图的大小和位置.如果你想强制布局更新,web前端制作你不能直接去调用这个方法承接网页制作,而是在下次更新图形之前调用setNeedsLayout方法,兼职手机网页制作如果你要立即更新视图布局web切图报价,调用layoutIfNeeded方法.

由此可知,网站div+cssUIScrollView的实现就是通过bounds来实现的.contentOffset是bounds的origin.然后当bounds修改之后符合w3c标准,会在layoutSubviews方法里面对子视图进行布局.对子类进行更新.
另外,符合w3c标准我们还可以用bounds实现如下效果:
bounds to set cell
图上右侧便是使用了bounds实现的效果.实现方式就是在自定义cell中重写drawReact:

- (void)drawRect:(CGRect)rect {     self.bounds = CGRectMake(self.bounds.origin.x, self.frame.size.width-20, self.frame.size.height - 5);    [super drawRect:rect];}

其实UITableView(它是UIScrollView)的实现也是类似,div+css制作更改了bounds,来实现滚动加载cell.

总结

对bounds和frame的理解就是这些,兼职手机网页制作其实系统用bounds的地方还是很多的.例如UIScrollView的实现就用到了.有疑问的话可以留言交流.

注:转赞请标明来源:张贵的博客

点击次数:14768
作者:
web前端行业资讯
Web new NewsList
Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日FiddlerCoreAPI开发(一)源码分析2017年12月20日程序员的自我救赎---3.2:SSO及应用案例2017年12月20日TCP头部分析与确认号的理解2017年12月20日42.Linux应用调试-初步制作系统调用(用户态->内核态)2017年12月20日我的第一个pythonweb开发框架(18)——前台页面与接口整合2017年12月20日Java数据结构和算法(十)——二叉树2017年12月20日dva+antd+mockjs实现基础用户管理2017年12月20日神经张量网络:探索文本实体之间的关系2017年12月20日最长公共子序列与最小编辑距离-你有更快的算法么?2017年12月20日Android关于AutoService、Javapoet讲解2017年12月20日AndroidIntentService的使用和源码分析2017年12月20日【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络GoogLeNet2017年12月20日闲话权限系统的设计2017年12月20日Cesium几个案例介绍2017年12月20日Sagit.FrameworkForIOS开发框架入门教程3:Start引导页及框架布局和隐藏事件的内幕2017年12月20日Mozilla刚刚推出旗下首款增强现实应用程序 ,,2017年12月14日谷歌即将让用户通过浏览器访问Chrome远程桌面 ,,2017年12月14日苹果收购Shazam并非只为音乐还有AR视觉识别技术 ,,2017年12月14日微软宣布投资5000万美元用于地球人工智能项目 ,,2017年12月14日AlphaGo教学工具正式上线柯洁称要"重新学围棋" ,,2017年12月14日Win10秋季创意者更新全面铺开毛玻璃特效:Skype加入 ,,2017年12月14日12月Android版本饼图发布:Oreo上线四月占比为0.5% ,,2017年12月14日苹果还是没有放弃?屏下指纹识别专利被曝光 ,,2017年12月14日高通网易达成合作:骁龙8系列芯片将为网易游戏提供优化 ,,2017年12月14日关于人工智能这份斯坦福深度报告说了你不知道的事 ,,2017年12月14日VisualStudio201715.6版本预览,增加新功能 ,,2017年12月14日Android的WebView中设置使用缓存将导致重定向页面的404结果不可见 【编程语言】2015年03月30日Android实现二维码扫描登录网页 【移动开发】2015年08月17日SpringMVC(4)数据绑定-1 【移动开发】2014年11月26日Finereport在企业级BI分析中的应用【编程语言】2015年08月14日hadoop中一些常用的命令介绍2014年01月29日小贝_redis安装与部署 【综合】2015年08月03日人月到底有多少神话色彩 【移动开发】2015年06月02日8.PMAC上位机-VC编程环境配置 【编程语言】2015年04月27日免费无限空间代码托管服务器svn服务器【移动开发】2015年05月11日Opera12.01正式版发布下载 ,,2016年07月24日hust1010TheMinimumLength 【编程语言】2015年06月17日申请信用卡窍门 【云计算】2015年07月16日thinkPHP模板的使用技巧(十三) 【互联网】2014年12月23日HDU5274Dylanslovestree(树链剖分)很巧的点权更新 【架构设计】2015年06月26日使用CNN(convolutionalneuralnets)检测脸部关键点教程(二):浅层网络训练和测试 【数据库】2015年06月01日MySQL之——服务器保持与MySQL的连接 【架构设计】2015年07月27日Android语音识别(本地+第三方) 【编程语言】2015年06月01日【IOS开发】Object-C语法之流程控制 【综合】2014年12月03日ARC-循环引用-解决办法【Web前端】2015年07月21日十大与死亡擦肩的名人:秦始皇统一中国前差点死掉【Web前端】2014年11月17日Javascript入门学习第九篇JavascriptDOM总结2014年01月29日浮动广告js类实现2014年01月29日一些设计上的原则【互联网】2015年04月03日用js实现小球的自由移动代码2014年01月29日HDU3681PrisonBreak(bfs+二分+状压DP) 【移动开发】2015年07月09日PHP的历史和优缺点2014年01月29日Spring(依赖注入框架) 【系统运维】2015年04月01日动态规划总结【模板】【数据库】2015年05月05日9种炫酷CSS3图片预览展示特效 【综合】2015年03月09日关于queryJavascriptCSSSelectorengine2014年01月29日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)