【问题标题】:Why is there an frame rectangle and an bounds rectangle in an UIView?为什么 UIView 中有一个框架矩形和一个边界矩形?
【发布时间】:2010-10-19 11:19:14
【问题描述】:

好吧,虽然是在漆黑的夜晚,但我不明白为什么会有两个不同的矩形:框架和边界。

据我了解,一个矩形就足以完成所有工作。相对于另一个坐标系定位视图本身,然后将其内容裁剪为指定大小。你还会用两个矩形做什么?它们之间又是如何互动的?

谁有好的解释? Apple 文档中拿着水果的孩子的那句话不太好理解。

【问题讨论】:

    标签: ios iphone


    【解决方案1】:

    这是备忘单:

    • frame 是视图所在的位置(相对于父视图)
    • bounds 是视图允许绘制(相对于自身)的位置

    更多说明:

    如果您将视图定位在其父视图中,您几乎总是会更改框架原点。

    如果你在 UIView 绘制的地方进行剪辑,你几乎总是会修改它的边界。

    请注意,您可以使用大于框架的边界。也就是说,你可以画出你所在位置的“界限之外”。

    【讨论】:

    • 所以框架类似于相对于超级视图坐标系的起始坐标,并且从该起点开始,边界剪辑将在相对于视图坐标系的坐标中完成?
    • 我注意到边界总是有 0,0 起点。所以边界总是从 0 开始。我说的对吗?
    • 通常边界的原点是 0,0。但这不是必须的。
    • "bounds 是允许视图绘制的位置(相对于自身)",仅当 clipsToBounds 为 NO 时才成立。
    • 你真的能有一个比另一个大吗?文档说The size of the bounds rectangle is coupled to the size of the frame rectangle, so that changes to one affect the other.developer.apple.com/library/ios/documentation/uikit/reference/…
    【解决方案2】:

    Frame在superview的坐标系中,bounds在view的坐标系中。从我的角度来看,两者兼而有之很方便。框架似乎是两者中更有用的,除非在某些情况下我不知道子视图在哪里可以具有与父视图完全不同的坐标系(例如像素缩放不同)。

    【讨论】:

    • 有。如果你改变子视图的变换属性,例如通过设置它的旋转,它的边界将不会改变,但它的坐标系统将不同于父视图的坐标系。
    【解决方案3】:

    我最近遇到了边界问题,并做了一些实验。 bounds 属性确实限制了 UIView 可以绘制的位置,但 限制其子视图。限制控件的另一件事是触摸事件分派。据我所知,视图不会接收超出其范围的触摸事件。此外,任何超出父视图边界的子视图也不会接收到触摸事件。在这些情况下,您必须非常小心地更新容器视图的边界,因为它的子视图的大小和位置发生了变化。一切都会正常绘制(因为子视图不会被其父视图的边界剪裁)但不会收到触摸。

    (这确实应该是对之前帖子的回复,但是由于我还不能回复,所以卡在这里......)

    【讨论】:

    • UIViews 有一个clipsToBounds 属性,可以防止其子视图在线条之外着色。
    • 如果你覆盖 pointInside:withEvent 你可以从你的视图框架之外拦截触摸事件。非常适合使按钮比它们看起来更大。
    • 如果应用了变换,触摸事件是否会转换回边界坐标系?
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多