NSView的边界与框架

界限和框架有什么区别? 事实上,为什么“界限”还存在? “边界”的大小等于框架的大小,边界的原点应始终为0,0。

从“用于iOS的视图和窗口架构编程指南:

视图对象使用其框架,边界和中心属性跟踪其大小和位置:

框架属性包含框架矩形,它在其超级视图的坐标系中指定视图的大小和位置。

bounds属性包含边界矩形,它在视图的本地坐标系统中指定视图的大小(及其内容的起点)。

center属性包含superview坐标系中视图的已知中心点。

这是一个很好的可视化解释:

在这里输入图像说明

边界的起源并不总是0,0。 如果您在滚动过程中观察如何更改UIScrollView的属性,很容易理解框架和边界之间的区别。

例如,您具有带有帧(0,0,320,460),界限(0,0,320,460)和ContentSize(640,460)的UIScrollView。 它的框架总是(0,0,320,460),但边界的X坐标将根据滚动的距离而改变。

如果您想要更改UIScrollView(例如以dynamic方式创build和移除页面),可能会很有用,所以您想知道滚动的距离。

第一个答案中的苹果文档不包括在旋转到横向后在框架和边界上发生了什么。 所以要更加完整,你应该知道窗口的框架和根视图在旋转之后不会改变,但是边界是这样做的。 请参阅这篇文章了解更多细节,使用框架作为纵向方向以外的参考。

从文章:

如果你的视图控制器有顶层的非窗口视图(即它是最底层的视图控制器),那么

 self.frame 

总是在纵向方向。 世界卫生大会? 是的,总是用肖像 – 你的观点的转变有什么变化。 所以你的

 self.bounds 

总是准确的(记住最后一点),但是

 self.frame 

因为每个视图的框架是根据超视图的坐标报告的,并考虑到应用到视图的任何变换,所以可能会或可能不会给出用户真正看到的宽高比。

视图框架是可以完全适合的矩形的大小。 它总是好像界限和框架是相同的,但事实并非如此。 考虑一个正方形,只是旋转大约45度!

在这里,这个旋转的正方形的框架将是完全填充它的矩形,所以它将不同于这个对象的边界。

PS主要是在旋转的对象框架和边界往往不同。