3

我正在向我的 ViewController 询问它的 view.center 属性并绘制一个新的 UIView 以这个“中心”为中心......我得到 (160, 250) 作为响应。但是当新的 UIView 绘制它时,它位于中心下方......所以我想知道是谁给了我这个信息以及它与什么有关?如果考虑到状态栏的 20px 高度,这显然是视图中心相对于 WINDOW 的位置。这会将视图的中心向下推 10 像素。但是在绘制 myView 时,它似乎是相对于 ViewController.view 而不是 Window 绘制的,因此它出现在中心下方 20px 处...

我希望 ViewController 给我它的中心 (160, 230),这样我就可以在它的中心绘制......我是否需要手动考虑状态栏并每次从高度中减去 20?还是我忽略了一些视图空间翻译?从 ViewController.m:

- (void)setUpMyView {
// Create my view

MyView *aView = [[MyView alloc] init];
self.myView = aView;
[aView release];
myView.center = self.view.center;
NSLog(@"CenterX: %f, Y: %f", self.view.center.x, self.view.center.y);
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_2);
myView.transform = transform;

[self.view addSubview:myView];

}

控制台:CenterX:160.000000,Y:250.000000

4

3 回答 3

10

它实际上不是“说谎”,而是在不同的坐标系中给你一个答案。

当您获取或设置视图的中心时,它是相对于其父级的坐标系计算的。self.view的父级是应用程序的窗口,因此您推测它的中心是 (160, 250)。但是myView的父级是self.view,它有自己的局部坐标系。在这种情况下,该坐标系比窗口的坐标系低 20 个像素。

你想要的是self.myView在它自己的坐标系中找到中心。有两种方法可以做到。

1)您可以根据bounds属性计算它,该属性CGRect指定视图在其自己的坐标系中的边界:

myView.center = CGPointMake(self.view.bounds.size.width / 2,
                            self.view.bounds.size.height / 2);

2) 或者您可以使用UIView'convertPoint:fromView:方法将窗口坐标系中的坐标转换为self.view:

// 传递 nil 作为源视图以从窗口的坐标系转换
myView.center = [self.view convertPoint:self.view.center fromView:nil];
于 2009-07-08T08:54:45.253 回答
0

在询问其中心和大小之前,可能会将其添加到子视图中。

MyView *aView = [[MyView alloc] init];
self.myView = aView;
[aView release];
[self.view addSubview:myView]; // add it to the subview first before asking center.
myView.center = self.view.center;
NSLog(@"CenterX: %f, Y: %f", self.view.center.x, self.view.center.y);
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_2);
myView.transform = transform;
于 2009-07-02T02:20:54.353 回答
0

我想我知道答案。你的观点是正确的!

您忘记添加 iPhone 状态栏是从屏幕顶部向下 20 像素,因此包含在您的视图中心。答对了。

于 2009-07-02T12:13:56.720 回答