3

Я прошу свой ViewController для его свойства view.center и рисую новый UIView, который центрируется вокруг этого «центра» ... Я получаю (160, 250) как ответ. но когда новый UIView рисует это ниже центр ... Так что мне интересно, кто дает мне эту информацию и с чем она связана? Очевидно, что центр представления относится к ОКНО, если вы принимаете во внимание высоту состояния 20px строки состояния. который будет толкать центр обзора вниз на 10 пикселей. но при рисовании myView это выглядит как отношение к ViewController.view, а не к окну, поэтому оно появляется на 20 пикселей ниже центра ...Мой UIViewController «лежит» о его центральном свойстве

Я бы ожидал, что 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

ответ

10

Это не «ложь» на самом деле, это дает вам ответ в другой системе координат.

Когда вы получаете или установить центр открывается видом, он рассчитывается относительно его родитель «s системы координат. Родителем 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) Или вы можете использовать «ы convertPoint:fromView:UIView метод для преобразования координат из системы координат окна в том, что из 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]; 
+0

Другая возможность состоит в том, что self.view.superview равна нулю. Я сам столкнулся с UITableViewController. –

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; 
0

Я думаю, что знаю ответ. Вы просматриваете центр правильно!

Вы забыли добавить строку состояния iPhone на 20 пикселей вниз от верхней части экрана и, следовательно, включены в ваш центр просмотра. Бинго.

Смежные вопросы