часов назад я опубликовал вопрос об организации портретного и ландшафтного режима в iPhone, и теперь я думаю, что знаю, как это сделать, используя willRotateToInterfaceOrientation: duration.
Первый экран - «Просмотр карты» с одной кнопкой, которая ведет к «Настройка просмотра». Вид карты не поддерживает поворот, но для вида настроек я сделал отдельный вид для портрета и пейзажа, и они меняются местами соответственно при повороте.
, ,
Как вы можете видеть, когда нажата кнопка «Настройка», «Настройка» добавляется в стек просмотра как обычно. Так что в основном я использую три контроллера вида; Настройка, Настройка ландшафта и Настройка портрета.
Я все еще обнаружил проблему с поворотом изображения в iPhone, когда использую navigationViewController. Сегментированное управление не работает. он вылетает без сообщения об ошибке. Раньше он работал нормально, без поворота.
rotateViewController.m
Это контроллер корневого представления.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
-(IBAction) buttonPressed{
Setting *settingViewController = [[Setting alloc] initWithNibName:@"Setting" bundle:[NSBundle mainBundle]];
UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController: settingViewController];
[self.navigationController presentModalViewController:navController1 animated:YES];
[settingViewController release];
[navController1 release];
}
Setting.m
Этот контроллер представления делает только обмен местами при повороте и показывает соответствующий вид между портретом и ландшафтом.
В Setting.m я меняю вид следующим образом;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
NSLog(@"to Right");
SettingLandscape *setting_landscape = [[SettingLandscape alloc] initWithNibName:@"SettingLandscape" bundle:[NSBundle mainBundle]];
self.view = setting_landscape.view;
[setting_landscape release];
}
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
NSLog(@"to Left");
SettingLandscape *setting_landscape = [[SettingLandscape alloc] initWithNibName:@"SettingLandscape" bundle:[NSBundle mainBundle]];
self.view = setting_landscape.view;
[setting_landscape release];
}
if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
NSLog(@"to Portrait");
SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
self.view = settingportrait.view;
[settingportrait release];
}
if (toInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) {
NSLog(@"to PortraitUpsideDown");
SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
self.view = settingportrait.view;
[settingportrait release];
}
}
В viewWillAppear, настройка контроллера вида также имеет;
self.title = @"Shell ";
self.navigationController.navigationBarHidden = NO;
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(Done)] autorelease];
и Готово
- (void) Done{
[self dismissModalViewControllerAnimated:YES];
}
SettingLandscape.m
Этот вид накладывается при повороте вида. Этот контроллер представления имеет свою панель навигации.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.title = @"Setting Landscape";
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
в viewDidLoad;
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"landscape:viewDidLoad");
//self.title = @"SettingLandscape";//not working!!
//self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done1" style:UIBarButtonItemStylePlain target:self action:@selector(Done)] autorelease];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
stringflag4MapType = [[NSString alloc] initWithString:@"blah"];
stringflag4MapType = [defaults stringForKey:@"flag4MapType"];
if (![stringflag4MapType isEqualToString:@"Hybrid"] && ![stringflag4MapType isEqualToString:@"Standard"] && ![stringflag4MapType isEqualToString:@"Satellite"]) {
segmentedControl4MapType.selectedSegmentIndex = 0;
}else if ([self.stringflag4MapType isEqualToString:@"Standard"]) {
segmentedControl4MapType.selectedSegmentIndex = 0;
}else if ([self.stringflag4MapType isEqualToString:@"Satellite"]) {
segmentedControl4MapType.selectedSegmentIndex = 1;
}else if ([self.stringflag4MapType isEqualToString:@"Hybrid"]) {
segmentedControl4MapType.selectedSegmentIndex = 2;
}
и следующий вызов не вызывается. странный. В любом случае вращение не имеет значения.
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
NSLog(@"to Portrait");// does not print out.
SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
self.view = settingportrait.view;
[settingportrait release];
}
if (toInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) {
NSLog(@"to PortraitUpsideDown");
SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
self.view = settingportrait.view;
[settingportrait release];
}
}
Хорошо, теперь, как вы можете видеть из этих снимков, есть две панели навигации, и у каждой есть своя кнопка панели, Готово и Элемент. Кнопка «Готово» поступила из меню «Настройка», а кнопка «Элемент» - из меню «Настройка порта» или «Настройка ландшафта» Селектор всех кнопок один и тот же, что приводит к просмотру карты. Кнопка Done работает нормально, но кнопка Item вылетает. Мне нужна кнопка на панели навигации после поворота, которая действует как кнопка возврата. Думаю, однажды я сделал 'self.view = settingportrait.view;' проблема начинается.
Причина, по которой мне нужна работа с кнопкой «Элемент», заключается в том, что сегментированный элемент управления начал падать, когда я добавляю код для поддержки вращения. Если я нашел причину, как заставить работать кнопку «Элемент», то есть в представлении вращения, я думаю, что смогу заставить работать и сегментированный элемент управления.
Вы можете скачать весь код на https://github.com/downloads/bicbac/rotation-test/rotate-1.zip