Правильное использование iOS willRotateToInterfaceOrientation
У меня очень простой UIViewController, и я пытаюсь выяснить, как использовать willRotateToInterfaceOrientation. мой UIViewController имеет очень простой метод viewDidLoad:
-(void)viewDidLoad {
[super viewDidLoad];
theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)];
theBar.tintColor = [UIColor orangeColor];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"The Title"];
item.hidesBackButton = YES;
[theBar pushNavigationItem:item animated:YES];
[item release];
[self.view addSubview:theBar];
}
В общем, у меня просто UINavigationBar наверху моего контроллера. Вот и все. Я реализовал несколько методов ротации, основанных на том, что я нашел в Интернете:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) {
theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 640, 48)];
}
}
Итак, я запускаю приложение в портретном режиме, а затем поворачиваю в ландшафтном режиме. И в основном theBar
все еще остается нормального размера и не изменяется. Я уверен, что это глупый вопрос, но как правильно использовать возможность вращения? Я хочу сделать так, чтобы он также работал, если приложение запускается в ландшафтном режиме. Как лучше всего инициализировать мои компоненты при первом запуске UIViewController, помня о том, что мне нужна поддержка обеих ориентаций, а также помня о том, что я хочу иметь возможность изменять размер всего, основываясь на изменениях ориентации на протяжении всего периода? из жизни UIViewController? Спасибо!
1 ответ
То, что вы хотите сделать, это изменить фрейм вашего существующего объекта theBar, а не создавать новый. Вы можете сделать это примерно так:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation
duration:(NSTimeInterval)duration {
CGRect f = CGRectMake(0,
0,
CGRectGetWidth(self.view.frame),
CGRectGetHeight(theBar.frame);
theBar.frame = f;
}
Обратите внимание, что значение self.view.frame
используется, который содержит значения после поворота. Также обратите внимание, что функция, которую я здесь использую, отличается от вашей. Я не проверял это с функцией, которую вы используете, поэтому я не могу сказать, сработает ли это или нет. Наконец, вы можете избежать всего этого, просто установив маску autoresizing на theBar в viewDidLoad
вместо:
[theBar setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];