我的UIViewController对其中心属性"撒谎"

Mel*_*emi 3 iphone cocoa-touch quartz-graphics uiviewcontroller uiview

我问我的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];
Run Code Online (Sandbox Code Playgroud)

}

控制台:CenterX:160.000000,Y:250.000000

小智 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's convertPoint:fromView:方法将坐标从窗口的坐标系转换为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];