上节主要说了,bounds和frame的定义,可能很抽象;这节主要介绍下,bounds和frame的使用方法和运行效果.
ps:控件中的偏移是以原始状态参考的,橘黄色View是暂时虚拟出来的;
如下图所示,有个自定义坐标系(x,y),红色view(redView),控件(switch),还有个半透明的橘黄色View(为redView的内容View,在未偏移时,是和红色redView重合的,因此先隐藏起来)
控件初始状态下frame和bounds显示.png
当我们需要改变redView的位置时,我们习惯性的就是改变frame,这个是没错的,因为frame是相对父类坐标系偏移的.下图是redView偏移(30,30)后的效果图,可以清楚的看到橘黄的view到现在还没有偏移.这是因为橘黄的view是redView的内容View(包括开关控件),是跟着Frame一起变化的.
//执行如下代码
CGRect frame = self.redView.frame;
frame.origin.y = 30;
frame.origin.x = 30;
self.redView.frame = frame;
redView执行frame偏移之后的显示.png
如果我改变redView的bounds会有什么效果了?如下图所示,为改变bounds后的效果:
//执行如下代码
CGRect bounds = self.redView.bounds;
bounds.origin.y = -30;
bounds.origin.x = -30;
self.redView.bounds = bounds;
redView执行bounds偏移之后的显示.png
至此可以清楚的看到redView内容View已经偏移了,而其上的开关控件也随之一起偏移了,以为开关控件的父控件是redView,所以redView的内容View发生偏移,控件的位置也会发生偏移;
本章总结:
到底在什么时候选用frame,什么时候选用bounds了?我觉得如果只是单纯的修改控件的位置,那么我建议用frame.因为如果frame和bouns同时变,会导致后面运行的时候得不到自己想要的效果,这种问题是很难发现的,所以我建议注意变量唯一原则,这样更好的利于我们开发.
当然也有例外得控件,比如UIScrollView,UITableView,UIWebView他们就是个例外,他们的bouns可能会变化的比较频繁.如有兴趣,请关注下节文章bounds和frame的探究(三);
网友评论