NSView的边界与帧

Dav*_*vid 43 cocoa objective-c nsview

边界和边框之间有什么区别?事实上,为什么"界限"甚至存在?'bounds'的大小等于帧的大小,bound的起源应始终为0,0.

Dan*_*Dan 91

从适用于iOS 的视图和窗口体系结构编程指南:

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

所述框架属性包含框架矩形,它指定了鉴于它的父的坐标系的尺寸和位置.

边界属性包含边界矩形,指定视图的视图自己的局部坐标系中尺寸(及其内容来源).

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

这是对该解释的良好可视化:

在此输入图像描述

  • 虽然这个答案通常是正确的,因为这是一个Mac问题(它被标记为`NSView`),相关文档是[查看可可编程指南](http://developer.apple.com/library/mac/#documentation /Cocoa/Conceptual/CocoaViewsGuide/Introduction/Introduction.html)而不是您链接到的iOS版本.请注意,在Mac上,默认情况下会翻转坐标系,原点位于左下角. (10认同)
  • 正确.看我的问题.原点的边界始终为0,0,大小相同.那么为什么还有界限,因为帧包含所有绑定的信息呢? (7认同)
  • 视图本身可以独立于框架旋转.在这种情况下,框架保持不变,但边界CGRect旋转@David (7认同)
  • 我从未真正看过这个.但似乎很清楚,你需要两个参考.因为40,40不适合视图内容的来源,但是对于视图在superview中的位置的参考是正确的.我还猜测视图需要知道它自己的内容空间(边界)并给出它应该在哪里(Frame)的信息.信息可能看起来相同,但实际上是两个不同的东西.将它们视为视图框架参考它的位置.它是塑造自身的边界 (2认同)

tag*_*kaZ 9

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

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

如果您想要更改UIScrollView中的某些内容(例如,以动态方式创建和删除页面),这将非常有用,因此您需要知道滚动距离.


Jim*_*Jim 8

第一个答案中的苹果文档没有涵盖旋转到横向方向后框架和边界发生的情况.所以为了更完整,你应该知道窗口的框架和根视图在旋转后不会改变,但边界确实如此. 有关详细信息,请参阅此文章,并使用框架作为纵向方向以外的任何参考.

来自文章:

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

self.frame
Run Code Online (Sandbox Code Playgroud)

始终处于纵向方向.世界卫生大会?是的,总是在纵向 - 你的观点转变了什么变化.所以你的

self.bounds
Run Code Online (Sandbox Code Playgroud)

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

self.frame
Run Code Online (Sandbox Code Playgroud)

可能会也可能不会给出用户真正看到的宽高比,因为每个视图的帧都是根据超视图的坐标报告的,并考虑了应用于视图的任何变换.