我的UIViewController对其中心属性“撒谎”

时间:2009-07-01 21:17:23

标签: iphone cocoa-touch uiview uiviewcontroller quartz-graphics

我问我的ViewController它的view.center属性并绘制一个新的UIView,它围绕着这个“中心”......我得到(160,250)作为回应。但是当新的UIView在中心下面绘制它时......所以我想知道是谁给了我这个信息以及它与它有什么关系?如果考虑状态栏的20px高度,这显然是视图中心与WINDOW的关系。这将推动视图中心向下10px。但是在绘制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];

}

console:CenterX:160.000000,Y:250.000000

3 个答案:

答案 0 :(得分:10)

它实际上不是“撒谎”,而是在不同的坐标系中给出答案。

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

您想要的是在{strong>拥有坐标系中找到self.myView的中心。有两种方法可以做到。

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

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

2)或者您可以使用convertPoint:fromView:的{​​{1}}方法将坐标从窗口的坐标系转换为self.view的坐标:

// Pass nil as the source view to convert from the window's coordinate system
myView.center = [self.view convertPoint:self.view.center fromView:nil];

答案 1 :(得分: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;

答案 2 :(得分:0)

我想我知道答案。你查看中心是正确的!

您忘记添加iPhone状态栏从屏幕顶部向下20px,因此包含在您的视图中心。宾果