В iOS 8 вызывается поддерживаемыйInterfaceOrientations, несмотря на то, что shouldAutoRotate = NO; вид все еще вращается

У меня есть приложение, предназначенное для запуска Пейзажа. Это приложение 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?


person JeffB6688    schedule 03.10.2014    source источник
comment
Случается и на текущей iOS 12. В их документации по-прежнему упоминается, что supportInterfaceOrientations не будет вызываться, если shouldAutorotate = NO, но это все еще для меня.   -  person stonedauwg    schedule 23.01.2019