4

我看到很多代码解释了如何在视图中居中子视图。代码示例通常如下所示:

SubView.center = view.center;

有人可以向我解释这是如何工作的吗?我只是不明白。

给出视图的view.center中心点。例如宽度为 100,高度为 100,它将返回 (50,50)。我得到它。

设置subview.center对我来说很奇怪。 subview.center将返回子视图的中心点。不知何故,将其设置为 (50,50) 会将其父视图中的子视图定位到 50/50 的坐标。但是如果子视图本身的宽度为 50,高度为 50,则访问此属性将返回(25,25)。

不懂我的意思?这里的概念对我来说很奇怪,因为 setter 和 getter 执行不同的功能。

如果有人可以解释这一点,请做。或者,如果我离基地很远,我也想知道。我是 iOS 开发新手。

如果我是正确的并且这确实是它的工作方式,你会不会认为这是一种反模式。当然,在 .NET 中,类似这样的东西将是一种反模式。也许不适合 Obj-C?

4

4 回答 4

7

在视图中居中子视图。我认为以下代码是正确的。

斯威夫特 3.0:

SubView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY );

斯威夫特 2.2:

SubView.center = CGPointMake( CGRectGetMidX( view.bounds ), CGRectGetMidY( view.bounds ) );
于 2014-04-24T08:48:37.503 回答
2

所以在设置它时,它是在它的超级视图中设置它。获取子视图中心时,它会为您提供实际的视图中心。

所以 50 的一半是 25,因此是 25,25。您想要子视图的中心而不是其父视图的中心,因此它没有理由返回其父视图的中心坐标,只是它自己的。

为了更具技术性,它必须与视图的 Frame 和 Bounds 相关(getter 使用视图的bounds获取中心,而 setter 使用视图的frame)。是一个链接,描述了它们是什么以及它们有何不同。

于 2013-02-01T14:39:53.877 回答
1

view.center 给出了视图在视图的超级视图坐标空间中的中心点。因此,它允许您在其超级视图中重新定位视图。

如果您有一个视图大小 {100,100} 并将其设置为中心 {200,200} - 它的中心点将从其超级视图的原点定位 {200,200}。实际上,它将从超级视图的原点插入 150 个点。

因此 view.center 和 view.bounds.width 彼此不相关。但是 view.center 和 view.frame.origin 之间存在关系(在示例中为 {150,150})。

这允许您通过使用它的 frame 属性或通过设置它的 center 和 bounds 属性来固定视图对象的大小和位置。

您描述的中心不是视图的属性,但可以通过 {view.bounds.size.width/2,view.bounds.size.height/2} 获取和设置。

于 2013-02-01T14:40:10.090 回答
0

来自 UIView 的类引用:“中心在其父视图的坐标系内指定”。因此,在您的示例中,如果您在超级视图中将中心设置为 (50,50)(通过 setter 方法),则子视图将在那里居中。如果你读回它(通过 getter),它也将是 (50,50)。

于 2013-02-01T14:44:17.037 回答