Проблемы автоповорота со вторым UIScreen на iOS8.0 (и 8.1)

Мое приложение управляет вторым экраном (внешний монитор), но я вижу некоторые «странные» вещи в отношении поворота (вещи, которых нет в iOS7)

Если я запускаю приложение (и подключаю второй экран) в альбомной ориентации, затем нажимаю кнопку «Домой», чтобы перевести приложение в фоновый режим, затем снова открываю приложение, тогда второй экран (прикрепленный к монитору) поворачивается на 90 градусов и использует только половина экрана. Никакое количество последующих вращений не исправляет это.

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

Спасибо

@interface AppDelegate ()

@property (nonatomic, strong) UIWindow* externalWindow;

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidConnect:) name:UIScreenDidConnectNotification object:nil];

    UIScreen* externalScreen = ([UIScreen screens].count > 1 ? [[UIScreen screens] objectAtIndex:1] : nil);
    if (externalScreen)
    {
        [self setupExternalScreen:externalScreen];
    }

    return YES;
}

- (void) screenDidConnect:(NSNotification *)aNotification
{
    UIScreen* externalScreen = (UIScreen*)aNotification.object;
    [self setupExternalScreen:externalScreen];
}

- (void)setupExternalScreen:(UIScreen*)externalScreen
{
    externalScreen.currentMode = externalScreen.preferredMode;

    self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreen.bounds];
    self.externalWindow.screen = externalScreen;
    self.externalWindow.clipsToBounds = YES;
    self.externalWindow.hidden = NO;
    [self.externalWindow makeKeyAndVisible];

    UIViewController* externalViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    externalViewController.view.backgroundColor = [UIColor redColor];
    self.externalWindow.rootViewController = externalViewController;
}
@end

person Scotty    schedule 16.10.2014    source источник


Ответы (3)


ОК - исправил.

Вместо того, чтобы установить

self.externalWindow.rootViewController = externalViewController;

Вместо этого просто добавьте представление в качестве подпредставления окна (не забывая сохранить ссылку на объект контроллера представления)

self.externalViewController.view.frame = self.externalWindow.frame;
[self.externalWindow addSubview:self.externalViewController.view];

Я предполагаю, что материал контроллера представления запутался.....

person Scotty    schedule 16.10.2014
comment
Еще одна ошибка — не делайте внешний «ключ» UIWindow — это испортит много вещей первого ответчика. - person Scotty; 17.10.2014

Другое решение, которое, похоже, работает: переопределить supportedInterfaceOrientations и shouldAutorotate в корневом контроллере окна:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate
{
    return NO;
}
person tjf    schedule 21.06.2015

Я просто трансформирую UIWindow, чтобы решить эту проблему.

CGRect frame = screen.bounds;

if (!self.secondWindow) {
    UIWindow *extWindow = [[UIWindow alloc] initWithFrame:frame];
    self.secondWindow = extWindow;
}

if ([[[UIDevice currentDevice] systemVersion] integerValue] == 8) {
    CGFloat magicAmount = (frame.size.width - frame.size.height) / 2;
    if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight) {
        float rotation = M_PI_2;
        self.secondWindow.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rotation), magicAmount, magicAmount);
    }
    else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {
        float rotation = -M_PI_2;
        self.secondWindow.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rotation), -magicAmount, -magicAmount);
    }
}
person Adam Różyński    schedule 28.08.2015