即使我们更改原点,边界也不会改变其位置。
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 ?"我想。 我在网上搜索得很厉害。所以,我发现了一些事实。
Bounds字面意思是边界线。 iOS只能在该边界线内绘制图片。正如您在上图中所看到的,UIButton也有Bounds,当它超过Bounds时,图片被剪切并绘制。
这并不重要,但我试着测试一下。
----三分之三---- bounds.origin 在视图层次结构中也很有用。但它与Frame的工作方式不同。
框架易于理解。 ViewController的RootView 将从顶部到按钮为700.
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应该像这样工作。
但是, Bounds 不会自行移动,只会移动它下方的 Subview 。我不明白这一部分。
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 ------------ ----------------
现在我通过研究UIScrollView获得了界限的概念!
CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x;
CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y;
这是对的。
是的,我同意这张照片看起来很晕眩!如果我滚动向上滚动视图,并且bounds.origin.y将增加并且offset.y将增加,并且在scrollview的frame.origin.y中附加的子视图将不更改,但iOS使用该公式计算要绘制的子视图(CompositedPosition)的位置!看起来子视图 UP !。
简而言之,界限改变 - > iOS使用该公式计算 - >画!
答案 0 :(得分:1)
首先,请用英语或其他支持的语言发布。
第二,我想我可能已经理解了你的目标,这是一般的简单答案。
首先有一个坐标系统,但每个视图也有自己的协调系统。视图的每个子视图都在超视图坐标系内定义。
我会尝试说更多,但我纯粹是拍照。即使在帖子中也是英文的,我也很难相信这篇文章是所提问题的最小例子