Недавно созданное окно UIWindow находится в боковом положении, когда приложение открывается в альбомной ориентации.

У меня есть приложение для iPad, в котором я создаю новый UIWindow в начале приложения и покажу его, пока я делаю синхронизацию ресурсов. Когда приложение запускается, когда iPad находится в портретной ориентации, все в порядке. Однако, когда в альбомной ориентации, недавно созданный UIWindow's размер кажется хорошим, но он выглядит сбоку, а его координаты кажутся странными. Вот скриншоты как для портретной, так и для альбомной ориентации:

введите описание изображения здесь

введите описание изображения здесь

Ландшафт один получается поворотом вправо один раз.

Кусок кода, где я создаю и показываю UIWindow как следует:

UIWindow *window=[UIApplication sharedApplication].keyWindow;
self.progressWindow = [[UIWindow alloc] initWithFrame:window.frame];
self.progressWindow.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
self.progressWindow.windowLevel = UIWindowLevelAlert;

/* some other code to create the subviews */

[self.progressWindow makeKeyAndVisible];

Эта проблема возникает только на iOS 8.

2 ответа

Решение

Насколько я понял, вновь созданные окна UIWindow не поворачиваются автоматически при изменении ориентации. Я не знаю, является ли это новым для iOS 8 или это ошибка, но мне удалось преодолеть проблему с помощью следующего фрагмента кода:

UIWindow *window=[UIApplication sharedApplication].keyWindow;
self.progressWindow = [[UIWindow alloc] initWithFrame:window.frame];
self.progressWindow.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
self.progressWindow.windowLevel = UIWindowLevelAlert;

/* some other code to create the subviews */

[self handleOrientationChange];
[self.progressWindow makeKeyAndVisible];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOrientationChange) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];

Реализация для handleOrientationChange выглядит следующим образом:

#define DegreesToRadians(degrees) (degrees * M_PI / 180)

- (void)handleOrientationChange
{
    if (self.progressWindow)
    {
        // rotate the UIWindow manually
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        [self.progressWindow setTransform:[self transformForOrientation:orientation]];

        // resize the UIWindow according to the new screen size
        if ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)])
        {
            // iOS 8
            CGRect screenRect = [UIScreen mainScreen].nativeBounds;
            CGRect progressWindowFrame = self.progressWindow.frame;
            progressWindowFrame.origin.x = 0;
            progressWindowFrame.origin.y = 0;
            progressWindowFrame.size.width = screenRect.size.width / [UIScreen mainScreen].nativeScale;
            progressWindowFrame.size.height = screenRect.size.height / [UIScreen mainScreen].nativeScale;
            self.progressWindow.frame = progressWindowFrame;
        }
        else
        {
            // iOs 7 or below
            CGRect screenRect = [UIScreen mainScreen].bounds;
            CGRect progressWindowFrame = self.progressWindow.frame;
            progressWindowFrame.origin.x = 0;
            progressWindowFrame.origin.y = 0;
            progressWindowFrame.size.width = screenRect.size.width;
            progressWindowFrame.size.height = screenRect.size.height;
            self.progressWindow.frame = progressWindowFrame;
        }
    }
}

- (CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orientation {

    switch (orientation) {

        case UIInterfaceOrientationLandscapeLeft:
            return CGAffineTransformMakeRotation(-DegreesToRadians(90));

        case UIInterfaceOrientationLandscapeRight:
            return CGAffineTransformMakeRotation(DegreesToRadians(90));

        case UIInterfaceOrientationPortraitUpsideDown:
            return CGAffineTransformMakeRotation(DegreesToRadians(180));

        case UIInterfaceOrientationPortrait:
        default:
            return CGAffineTransformMakeRotation(DegreesToRadians(0));
    }
}

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

Общее приложение поддерживает ссылку на окно через свойство key- Window:

let w = UIApplication.sharedApplication().keyWindow

Эта ссылка, однако, слегка изменчива, потому что система может создавать временные окна и вставлять их в качестве ключевого окна приложения.

попробуйте вместо

[[UIApplication sharedApplication].delegate window]
Другие вопросы по тегам