CGRect根据中心点定位

Posted

技术标签:

【中文标题】CGRect根据中心点定位【英文标题】:CGRect positioning according to center point 【发布时间】:2013-08-12 14:27:09 【问题描述】:

我正在尝试为 iPad 应用创建多个视图。首先,我创建了一个菜单视图,然后根据菜单创建了一个带有坐标的子菜单视图。所以它看起来像这样:

我做了什么:

self.view = [[UIView alloc] initWithFrame:CGRectMake(self.parentViewController.view.frame.size.width, 0, 150, screenHeight)];

但现在在子菜单上,我正在尝试创建内容视图,它是一个 UINavigationController。尝试做同样的事情,我得到了这个结果:

我在做什么(这次在子菜单视图控制器上创建框架):

CGRect frame = CGRectMake(self.view.frame.origin.x + self.view.frame.size.width,
                            0,
                            [[UIScreen mainScreen] bounds].size.width - self.view.frame.origin.x - self.view.frame.size.width,
                            [[UIScreen mainScreen] bounds].size.height);

这是不言自明的,但是,我只是获取子菜单的原点并添加其宽度,以便获得右边缘坐标。

经过多次尝试,我设法让它工作,因为我注意到 CGRectMake 正在使用 UINavigationController 视图的中心来安排其位置。所以下面的代码:

CGRect frame = CGRectMake(self.view.frame.origin.x + self.view.frame.size.width + 259,
                            0,
                            [[UIScreen mainScreen] bounds].size.width - self.view.frame.origin.x - self.view.frame.size.width,
                            [[UIScreen mainScreen] bounds].size.height);

产生正确的位置。

发生了什么事?我认为 CGRectMake 原点总是在左上角,但是在这个特别的视图上实际上是中上角(或中中,不确定)。我做错了什么?

EDIT1:

这是正确位置框架的控制台输出:

注意导航栏现在是如何正确定位的:

但是 x 坐标不是 250(应该是,因为 menu.width + sub-menu.width = 250。)

EDIT2:

我最终放弃了。问题在于由 UINavigationViewController 创建的自动生成的 UINavigationBar。我似乎无法弄清楚如何配置它。如果有人知道答案,我会留下问题。

【问题讨论】:

这取决于您使用的视图。从技术上讲,原点始终位于 UI 元素对象的左上角。如果您让我们说另一个 UIView 对象作为您的子视图,那么您将不得不适应子视图的定位。它似乎从 self.view 的中间开始,但那是因为它会像在常规 self.view 中一样从 (0,0) 开始希望这会有所帮助 这可能对你有帮助:***.com/questions/6784823/… ***.com/questions/11251988/… 好吧,您必须了解什么是frame,什么是视图层次结构(frame 是相对于超级视图的左上角)以及可能还自动调整掩码大小。 CGRect 只是一组四个数字,没有别的。重要的是视图布局机制如何解释它。 @user2277872 导航栏是“自动”创建的,我只是分配并使用该框架启动了一个空白视图。这是为什么?我应该只创建一个视图来正确对齐导航栏吗? 【参考方案1】:

CGRect 的中心是由origin.x + ( size.width / 2 )origin.y + ( size.height / 2 ) 创建的CGPoint

【讨论】:

你不必手动计算这个,在CGGeometry.h中定义了称为CGRectGetMidXCGRectGetMidY的方法 我想这不是我要问的。 但它可以满足您的需求。 @abizern 不错。我认识 NS 的。不知道 CG 等价物。 如果可能的话,你应该考虑自动布局,因为它会让这变得非常容易。【参考方案2】:
UIButton* btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 70, 70)];
btn.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);

无论设备是什么,这都会使按钮居中

【讨论】:

我认为您的第二行中的意思是“btn.center”。【参考方案3】:

CGRectMake 只是创建一个 (x,y, witdh, height) 的结构。 设置正确的值是您的职责。

【讨论】:

您能详细说明一下吗?我的意思是我知道,但我是否设置了错误的值? 首先它有助于不内联调试。创建 4 个局部变量 x,y,w,h 并为其赋值,然后创建 CGRect。 2)您的 x 坐标看起来很奇怪 x + 宽度在视图之外。子视图框架的 x 必须在 frame.x 和 frame.x + 宽度之间。 但是 frame.x > xcoord > frame.x + width 不应该在子菜单中给我一个框架吗? 用更多信息编辑了问题

以上是关于CGRect根据中心点定位的主要内容,如果未能解决你的问题,请参考以下文章

动态调整大小的视图定位

关于CGRect包含交错,边缘,中心的检测

crt100中心定位好但是电脑小票数值低

IOS_地图与定位

CSS / CGRect 定位

Ipad CGRect 中心