навигационный контроллер нажал ViewControllers не будет автоматически - PullRequest
2 голосов
/ 06 июля 2011

У меня проблемы с настройкой автоматического управления навигационным контроллером.Дисплей будет автоматически вращаться в начальном виде (контроллер корневого представления), но он не будет вращаться при любых новых отображаемых видах.Он сохраняет ориентацию вида, которая была у исходного изображения при нажатии.

В моем делегате приложения у меня есть контроллер навигации и выдвигаю его представление.

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

В контроллере корневого представления я разрешаю всеориентации и я выдвигаю другие виды на стек контроллера.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return YES;
}

ParkingListController *parklc = [[ParkingListController alloc] autorelease];
[[self navigationController] pushViewController:parklc animated:YES];

Я вижу "Да, мы должны!"регистрируется один раз при загрузке нового представления, но не запускается при фактическом повороте устройства.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    NSLog(@"Yes, we should!");
    return YES;
}

У меня нет переопределений init, и в info.plist перечислены все четыре ориентации.

Чего мне не хватает?Спасибо!

РЕДАКТИРОВАТЬ 2011-07-07:

Странно, но отображение карты, которое появляется при выборе элемента из табличного представления, выполняет автоматический поворот!Почему он может вращаться, когда табличное представление, из которого оно пришло, не может?

Ответы [ 4 ]

4 голосов
/ 07 июля 2011

Вы используете UINavigationController, и он должен вернуть true для вращения.Расширьте UINavigationController и используйте расширенный класс в Интерфейсном конструкторе.

#import <Foundation/Foundation.h>
@interface IRUINavigationController : UINavigationController {
}
@end

#import "IRUINavigationController.h"
@implementation IRUINavigationController
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self.visibleViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
} 
@end

Я использовал это много проектов, и он работает.

0 голосов
/ 09 июня 2012

Каждый контроллер представления, помещенный в стек контроллеров навигации, должен поддерживать одинаковую ориентацию.Это означает, что невозможно иметь некоторые контроллеры представления, поддерживающие только портрет, а другие - только альбомную.Другими словами, все контроллеры представления в одном и том же стеке навигационных контроллеров должны возвращать одно и то же в делегате:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Но есть простое решение для этого!Вот пример перехода от портрета к пейзажу.Вот шаги, чтобы сделать это, и ниже приведен код для его поддержки.

  1. Создайте «поддельный» контроллер представления, который будет корневым в дополнительном навигационном контроллере.Этот контроллер представления должен поддерживать ландшафт.
  2. Создать новый экземпляр UINavigationController, добавить экземпляр «поддельного» контроллера представления в качестве root и экземпляр вашего контроллера ландшафта в качестве второго контроллера представления
  3. Представьте экземпляр UINavigationController как модальный из родительского контроллера представления

Сначала создайте новый контроллер представления (FakeRootViewController) с этим кодом:

@interface FakeRootViewController : UIViewController
@property (strong, nonatomic) UINavigationController* parentNavigationController;
@end

@implementation FaceRootViewController
@synthesize parentNavigationController;
// viewWillAppear is called when we touch the back button on the navigation bar
(void)viewWillAppear:(BOOL)animated {
  // Remove our self from modal view though the parent view controller
  [parentNavigationController dismissModalViewControllerAnimated:YES];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
} 

Вот код для представленияконтроллер представления, который вы хотите показать в ландшафтном режиме:

FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton]; // Set back button
// The parent navigation controller is the one containing the view controllers in portrait mode.
fakeRootViewController.parentNavigationController = parentNavigationController;

UINavigationController* subNavigationController = // Initialize this the same way you have initialized your parent navigation controller.

UIViewController* landscapeViewController = // Initialize the landscape view controller

[subNavigationController setViewControllers:
   [NSArray arrayWithObjects:fakeRootViewController, 
                                               landscapeViewController, nil] animated:NO];

[_navigationController presentModalViewController:subNavigationController animated:YES];

Помните, что у landscapeViewController также должна быть эта реализация:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
} 
0 голосов
/ 06 июля 2011

Я бы предложил две вещи:

  1. убедитесь, что все ваши UIViewController s 'shouldAutorotateToInterfaceOrientation вернули ДА;

  2. поместите сообщение журнала в willRotateToInterfaceOrientation, чтобы убедиться, что представления реагируют на поворот устройства; shouldAutorotateToInterfaceOrientation - это метод, который может вызываться каркасом непредсказуемым образом (т. Е. Он не всегда вызывается при авторутировании).

Кроме того, оно должно работать.

0 голосов
/ 06 июля 2011

Вы гарантировали, что shouldAutorotateToInterfaceOrientation элемента ParkingListController также возвращает YES?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...