zoukankan      html  css  js  c++  java
  • UIView的frame和bounds区别

    UIView的frame和bounds区别

    iOS中,大家肯定对view和frame都不陌生,我们设置view在父view中的位置和大小时,只需要设置frame就可以了。

    可能大家也有查过网上的一些资料,可能也会得知frame是相对于superview坐标系的,而bounds则相对于view自身的坐标系,但是frame究竟是怎样表示坐标的呢,其实这就和bounds有关了。

    值得肯定的是frame.size 和bounds.size 肯定一样,但是UIView中,frame其实是不存储的,而是动态计算的,改变center,改变bounds大小,或者改变transfrom都可能会导致frame的改变。 

    UIView的frame是一个动态的,官方文档中有提到

    // animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
    @property(nonatomic) CGRect frame;

    大意是说,如果我们的view有transform,则frame不能反映其在父view中的实际位置,需要用bounds+center来反映。

    假定我们的view没有transform。 每次我们设置frame时,则系统首先会设置

    bounds.origin = 0,0
    bounds.size = frame.size

    然后会继续设置

    center.x = frame.origin.x + frame.size.width / 2
    center.y = frame.origin.y + frame.size.height / 2

    也就是说 设置frame时,我们的bounds和center都会发生变化,但是view的位置是由center和bounds共同决定的,完全可以不依赖于frame。

    每次我们访问frame时,其实也是通过center和bounds计算。

    frame.size = bounds.size
    frame.origin.x = center.x - bounds.size.width / 2
    frame.origin.y = center.y - bounds.size.height / 2

    当然期间如果有transform,则会考虑到transfrom,比如大小缩小到0.9倍,则center不变,frame.size 变为 0.9倍,origin也会跟着变。 transform不会影响到view的bounds和center,但是会影响到frame。 

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    redis可编译
    不要用Serverzoo 提供的CloudLinux 的五大原因 Linode 強大VPS 資源為你解密
    linux加载指定目录的so文件
    超级rtmp服务器和屌丝wowza
    标准IO: 文件的打开与关闭函数 fopen & fclose
    《gdb调试之基础篇》
    linux信号Linux下Signal信号太详细了,终于找到了
    【干货】Chrome插件(扩展)开发全攻略
    斯坦福开源无Bug的随机计算图Certigrad
    心跳包:告诉别人,我还活着
  • 原文地址:https://www.cnblogs.com/wahy/p/4817199.html
Copyright © 2011-2022 走看看