2014-10-16 6 views
2

Мое приложение запускает второй экран (внешний монитор), но я вижу некоторые «странные» вещи относительно вращения (вещи, которые не происходят на iOS7)Проблемы с автозагрузкой со вторым UIScreen на iOS8.0 (и 8.1)

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

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

Благодаря

@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 

ответ

5

OK - исправлен его.

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

self.externalWindow.rootViewController = externalViewController; 

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

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

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

+0

одна другая ошибка - не сделать внешний UIWindow «ключ» - это портит много первых Ответчик вещей. – Scotty

0

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

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 
0

Я просто преобразовать 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); 
    } 
}