Я создаю экземпляры UIView
в -viewDidLoad:
и добавляю их в качестве подпредставлений в свойство view
контроллера представления:
- (void) viewDidLoad {
[super viewDidLoad];
self.myView = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 280.0f, 210.0f)] autorelease];
// ...
[self.view addSubview:myView];
}
Затем я звоню -viewWillAppear:
, чтобы центрировать эти подпредставления:
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
}
Я также переопределяю -willRotateToInterfaceOrientation:duration:
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration {
[self adjustViewsForOrientation:newInterfaceOrientation];
}
Метод -adjustViewsForOrientation:
устанавливает центр CGPoint
различных объектов подпредставления в зависимости от ориентации устройства:
- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
myView.center = CGPointMake(235.0f, 42.0f);
// ...
}
else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
myView.center = CGPointMake(160.0f, 52.0f);
// ...
}
}
Когда загружен контроллер вида, экземпляры UIView
создаются и позиционируются на основе текущей ориентации устройства. Если впоследствии устройство поворачивается, виды перецентрируются в новые координаты.
Чтобы сделать это более плавным, в -adjustViewsForOrientation:
можно было бы использовать анимацию с помощью клавиш, чтобы подвиды более плавно перемещались из одного центра в другой. Но вышесказанное работает для меня, пока.