iOS的坐标系如何运作?

时间:2017-07-06 00:35:41

标签: ios uiview frame bounds

很高兴见到你。我正在学习" Coordinate System" iOS的UIView。 框架易于理解,但 Bounds 不是

例如,当您更改原点时,Frame会按预期工作。 enter image description here

即使我们更改原点,边界也不会改变其位置。

enter image description here

import UIKit

class ViewController: UIViewController {

    var childView : UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let rect = CGRect(x: 20, y: 30, width: 200, height: 200)
        childView = UIView(frame: rect)
        childView.backgroundColor = UIColor.red
        self.view.addSubview(childView)
    }

    override func viewDidAppear(_ animated: Bool) {
        UIView.animate(withDuration: 5, animations: {
            self.childView.bounds = CGRect(x: 100, y: 150, width: 200, height: 200)
        })
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

"为什么我们需要 Bounds ?"我想。 我在网上搜索得很厉害。所以,我发现了一些事实。

---- ----第一  enter image description here

Bounds字面意思是边界线。 iOS只能在该边界线内绘制图片。正如您在上图中所看到的,UIButton也有Bounds,当它超过Bounds时,图片被剪切并绘制。

----第二---- 边界的大小和框架的大小是相同的。 enter image description here

这并不重要,但我试着测试一下。

----三分之三---- bounds.origin 在视图层次结构中也很有用。但它与Frame的工作方式不同。

框架易于理解。 ViewController的RootView 将从顶部到按钮为700.

enter image description here

import UIKit

class ViewController: UIViewController {

    var childView : UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let rect = CGRect(x: 100, y: 100, width: 200, height: 200)
        childView = UIView(frame: rect)
        childView.backgroundColor = UIColor.red
        self.view.addSubview(childView)
        self.view.backgroundColor = UIColor.cyan
    }

    override func viewDidAppear(_ animated: Bool) {
        UIView.animate(withDuration: 10, animations: {

        self.view.frame = CGRect(x: 0, y: 700, width: self.view.frame.size.width, height: self.view.frame.size.height)

        })
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

如果您查看iOS中的坐标系,您可以看到Frame应该像这样工作。  enter image description here

但是, Bounds 不会自行移动,只会移动它下方的 Subview 。我不明白这一部分。 enter image description here

import UIKit

class ViewController: UIViewController {

    var childView : UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let rect = CGRect(x: 100, y: 100, width: 200, height: 200)
        childView = UIView(frame: rect)
        childView.backgroundColor = UIColor.red
        self.view.addSubview(childView)
        self.view.backgroundColor = UIColor.cyan
    }

    override func viewDidAppear(_ animated: Bool) {
        UIView.animate(withDuration: 10, animations: {

        self.view.bounds = CGRect(x: 0, y: 700, width: self.view.frame.size.width, height: self.view.frame.size.height)

        })
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

所以,我在谷歌搜索它。 最后,我找到了一个数学公式,用于" SubView"更改 SuperView.origin.bounds 时重新定位。 (来源:article

CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x;
CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y;

顺便问一下,Apple为什么要使用这些公式?基本上,基于"坐标系统"我们认为,

CompositedPosition.x = View.frame.origin.x + Superview.bounds.origin.x;
CompositedPosition.y = View.frame.origin.y + Superview.bounds.origin.y;

这个公式不是更直观吗?

所以,我的问题是这些。

  1. 当我在原始状态下将 SuperView.bounds.origin.y 增加700时,为什么 SubView 向上移动不向下移动???
  2. 我应该接受这个公式并记住它吗?
  3. -------------------------------------------- -------------------

    ----------------------------编辑 - 1 ------------ ----------------

    现在我通过研究UIScrollView获得了界限的概念!

    CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x;
    CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y;
    

    这是对的。

    这是我理解的图片。 enter image description here

    是的,我同意这张照片看起来很晕眩!

    如果我滚动向上滚动视图,并且bounds.origin.y将增加并且offset.y将增加,并且在scrollview的frame.origin.y中附加的子视图将更改,但iOS使用该公式计算要绘制的子视图(CompositedPosition)的位置!看起来子视图 UP !。

    简而言之,界限改变 - > iOS使用该公式计算 - >画!

1 个答案:

答案 0 :(得分:1)

首先,请用英语或其他支持的语言发布。

第二,我想我可能已经理解了你的目标,这是一般的简单答案。

首先有一个坐标系统,但每个视图也有自己的协调系统。视图的每个子视图都在超视图坐标系内定义。

我会尝试说更多,但我纯粹是拍照。即使在帖子中也是英文的,我也很难相信这篇文章是所提问题的最小例子