iPhone вращающийся вид в режиме навигации ViewController - PullRequest
0 голосов
/ 11 марта 2011

часов назад я опубликовал вопрос об организации портретного и ландшафтного режима в iPhone, и теперь я думаю, что знаю, как это сделать, используя willRotateToInterfaceOrientation: duration.

Первый экран - «Просмотр карты» с одной кнопкой, которая ведет к «Настройка просмотра». Вид карты не поддерживает поворот, но для вида настроек я сделал отдельный вид для портрета и пейзажа, и они меняются местами соответственно при повороте.

enter image description here, enter image description here, enter image description here

Как вы можете видеть, когда нажата кнопка «Настройка», «Настройка» добавляется в стек просмотра как обычно. Так что в основном я использую три контроллера вида; Настройка, Настройка ландшафта и Настройка портрета.

Я все еще обнаружил проблему с поворотом изображения в 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

Ответы [ 2 ]

1 голос
/ 09 мая 2011

https://github.com/downloads/bicbac/rotation-test/rotate-1.zip этот пример кода удивителен для меня. Это решает мою проблему с вращающимся представлением простым методом делегата

  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { вернуть ДА; }
0 голосов
/ 11 марта 2011
  • моя лучшая попытка ответить на вопрос, не глядя на код (сегодня вечером нет времени :()

Когда вы представляете настройку viewcontroller модально, ваш верхний viewcontroller настраивается.

Когда происходит вращение, вы загружаете view_troller setting_landscape или setting_portrait, но сохраняете вид только внутри setting_landscape | портрета. Таким образом, контроллеры setting_landscape / Portrait View * выпущены . Когда устройство поворачивается, оно, вероятно, «устанавливает» viewcontroller, получающий сообщение о вращении, а не «setting_landscape / Portrait», потому что они не помещаются в стек viewcontroller.

Итак, когда вы нажимаете на элемент или элемент управления, он вызывает делегат, который, вероятно, настроен на setting_landscape | портрет, который выпущен уже.

Что за сообщение в консоли вы получаете при сбое?

Моя рекомендация будет заключаться в том, чтобы создать настройку viewcontroller с сегментированным элементом управления, а затем использовать функцию willAnimateRotationToInterfaceOrientation: duration:, чтобы переместить сегментированный элемент управления в нужное положение и в кадр. Просто вернув ДА во все ориентации, вращение должно поддерживаться, не так ли?

Какова была причина использования двух отдельных viewcontroller для ландшафта / портрета? (Я делаю это иногда, но редко)

Редактировать * вам нужно использовать обратный вызов willAnimateRotationToInterfaceOrientation для анимации изменений, а не "willRotate ..."

...