У меня есть приложение, предназначенное для запуска Пейзажа. Это приложение Cocos2D. Он работает нормально, пока я не добавлю еще одно окно (например, для показа рекламы) или если я не покажу контроллер модального представления.
Когда я это делаю, окно/представление все еще вращается, хотя я явно установил shouldAutoRotate = NO
Кроме того, Apple заявляет, что supportedInterfaceOrientations не будет вызываться, если shouldAutorotate возвращает NO. Однако он вызывается как до, так и после вызова shouldAutorotate. Почему это происходит и какое решение для управления автоповоротом в iOS 8?
Хотя я видел много проблем с SO, связанных с автоматическим поворотом в предыдущих версиях iOS (с наиболее подробным описанием того, как настроить управление автоповоротом, можно найти в shouldAutorotateToInterfaceOrientation не вызывается в iOS 6), ни один из них, по-видимому, не решает проблему вызова поддерживаемыхInterfaceOrientations, даже если shouldAutoRotate = NO; и вид все еще вращается, хотя ему говорят не вращаться.
Чтобы быть полностью подробным с моим объяснением, вот описание того, как я это настроил:
Во-первых, чтобы отобразить изображения запуска, мне пришлось установить ориентацию устройства в info.plist для поддержки всех ориентаций. В противном случае экран будет черным при запуске.
Далее, вот как реализован мой код:
- (void) applicationDidFinishLaunching:(UIApplication*)application
{
...
// Init the 2nd window
secondWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // secondWindow is defined as a UIWindow
// Init the second View Controller
nrViewController = [[NonRotatingViewController alloc] initWithNibName:nil bundle:nil]; // nrViewController is defined as a UIViewController
nrViewController.wantsFullScreenLayout = YES; // this insures that if the status bar it transparent, the view underlaps it
[secondWindow setRootViewController:nrViewController]; // The root view controller provides the content view of the window.
[secondWindow addSubview: nrViewController.view]; // Adds a view to the end of the receiver’s list of subviews
[secondWindow makeKeyAndVisible]; // make the receiver the main window and displays it in front of other windows
EAGLView *glView = [EAGLView viewWithFrame:[secondWindow bounds]
pixelFormat:kEAGLColorFormatRGB565 // kEAGLColorFormatRGBA8
depthFormat:0 // GL_DEPTH_COMPONENT16_OES
];
// attach the openglView to the director
CCDirector *director = [CCDirector sharedDirector];
[director setOpenGLView:glView];
[director setDeviceOrientation:kCCDeviceOrientationLandscapeRight];
// make the OpenGLView a child of the view controller
[nrViewController setView:glView]; // bug fix requires a non-rotating view controller and window on top of a rotating one.
}
NonRotatingViewController во втором окне возвращает NO, когда вызывается shouldAutorotate. Также 0 возвращается, когда вызывается supportInterfaceOrientations (хотя технически это не имеет значения, что я возвращаю, потому что Apple говорит, что это не должно вызываться).
Для контроллера модального представления и контроллера представления рекламы я пробовал как shouldAutorotate = NO, так и YES. Ни один из подходов не предотвратит вращение второго окна/nrViewController. Я провел дни, пробуя всевозможные комбинации, но ни одна из них не работает. Вы видите, что я могу делать неправильно?
Итак, чтобы повторить мой вопрос, почему вызывается supportInterfaceOrientations и почему представление все еще вращается, даже если shouldAutoRotate = NO?