bounds和frame的探究(二)

上节主要说了,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的探究(三);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容