NSView的bounds和frame有什么区别?

44

“bounds”和“frame”的区别在哪里?实际上,“bounds”为什么会存在?“bounds”的大小等于“frame”的大小,“bounds”的原点应始终为0,0。


1
可能是Cocoa:frame和bounds有什么区别?的重复问题。 - daisy
5个回答

92

根据iOS的视图和窗口架构编程指南:

一个视图对象使用其frame、bounds和center属性跟踪其大小和位置:

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

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

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

这里是对上述解释的很好的可视化:

enter image description here


7
没问题。看到了您的问题。边界始终为原点的0,0,而大小是相同的。那么既然框架已经包含了所有边界信息,为什么还需要边界呢? - AWF4vk
2
我从未真正看过这个。但很明显你需要两个引用。因为40,40对于视图内容的起点来说不正确,但对于视图在父视图中的位置的参考是正确的。我还猜测视图需要知道自己的内容空间(边界),并提供它应该在哪里的信息(框架)。这些信息可能看起来相同,但实际上是两个不同的东西。将它们视为视图所在的参考框架和形状的边界。 - markhunte
12
虽然这个回答基本上是正确的,但由于它是一个关于 Mac 的问题(它被标记为 NSView),相关文档应该是《Cocoa 视图编程指南》,而不是你链接的 iOS 版本。请注意,在 Mac 上默认情况下,坐标系是翻转的,原点位于左下角。 - Rob Keniger
7
视图本身可以旋转,与框架无关。在这种情况下,框架保持不变,但边界 CGRect 会被旋转。@David - 11684
@David,视图的bounds.size可能与其frame.size不同,其原点不一定是{0,0}。如果示例中的边界为{10,10,220,360},则图像将显示为裁剪。苹果公司的视图编程指南:视图几何有更好的可视化效果。 - Elise van Looij

9
边界的起点不总是0,0。如果您观察UIScrollView在滚动期间如何更改边界属性,就可以轻松理解框架和边界之间的区别。
例如,您有一个UIScrollView,其框架为(0,0,320,460),边界为(0,0,320,460)和ContentSize(640,460)。它的框架始终为(0,0,320,460),但边界的X坐标将根据滚动距离而改变。
如果您想更改UIScrollView中的某些内容(例如动态创建和删除页面),则了解滚动距离可能会很有用。

8
第一个回答中的苹果文档并未涉及在旋转至横向方向后,框架和边界会发生什么。因此,为了更完整,您应该知道窗口和根视图的框架在旋转后不会改变,但边界会发生变化。请参阅此文章以了解更多细节,并注意使用框架作为除竖向以外的参考。
从文章中可以得到以下信息:

If your view controller has the top-level non-window view (i.e., it’s the bottom-most view controller), then

self.frame

is always in portrait orientation. Wha? Yes, always in portrait – what changes is the transform of your view. So your

self.bounds

is always accurate (keeping in mind the last point), but

self.frame

may or may not give the aspect ratio that the user is really seeing, since each view’s frame is reported in terms of the superview’s coordinates, and takes into account any transforms applied to the view.


1
一个视图框架是它完全适合的矩形大小。它似乎总是与边界相同,但事实并非如此。考虑一个正方形,只是旋转了约45度!在这里,旋转正方形的框架将是完全填充它的矩形,因此它将与该对象的边界不同。顺便说一下,大多数旋转对象中的框架和边界往往不同。

0

frame 是在父视图坐标系中的坐标值

bounds 用于绘制视图内容,当绘制完成后,系统会使用变换操作将内容分配到视图的 frame 中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接