Каков наилучший способ определения ориентации в расширении приложения?

Каков наилучший способ определения ориентации устройства в расширении приложения? У меня были смешанные результаты с решениями, которые я нашел здесь:

Как определить изменение ориентации в пользовательском расширении клавиатуры в iOS 8?

Получить текущую ориентацию устройства (расширение приложения)

Я просмотрел классы размеров и UITraitCollection и обнаружил, что устройство неточно сообщает, что оно находится в портрете, когда оно фактически находится в ландшафте (не уверен, что это ошибка ОС, или я не запрашиваю правильные API-интерфейсы правильный путь).

Каков наилучший способ выполнения:

  • Текущая ориентация устройства при первой загрузке расширения
  • Ориентация устройства будет вращаться на
  • Ориентация устройства изменилась на

Спасибо,

Ответ 1

Я столкнулся с этой проблемой и просмотрел ваши примеры, но не было хорошего решения. Как я это разрешил: я создал класс, который выполняет некоторые вычисления значений UIScreen и возвращает самоопределяемую ориентацию устройства.

Заголовок заголовка:

typedef NS_ENUM(NSInteger, InterfaceOrientationType) {
    InterfaceOrientationTypePortrait,
    InterfaceOrientationTypeLandscape
};

@interface InterfaceOrientation : NSObject

+ (InterfaceOrientationType)orientation;

@end

Реализация:

@implementation InterfaceOrientation

+ (InterfaceOrientationType)orientation{

    CGFloat scale = [UIScreen mainScreen].scale;
    CGSize nativeSize = [UIScreen mainScreen].currentMode.size;
    CGSize sizeInPoints = [UIScreen mainScreen].bounds.size;

    InterfaceOrientationType result;

    if(scale * sizeInPoints.width == nativeSize.width){
        result = InterfaceOrientationTypePortrait;
    }else{
        result = InterfaceOrientationTypeLandscape;
    }

    return result;
}

@end

Я помещаю его в viewWillLayoutSubviews или viewDidLayoutSubviews методы, чтобы поймать событие изменения ориентации.

if([InterfaceOrientation orientation] == InterfaceOrientationTypePortrait){
     // portrait   
}else{
     // landscape   
}

Если вы хотите получить точную сторону ориентации устройства (влево, вправо, вверх ногами), этот подход не решит вашу проблему. Он просто возвращает либо портретную, либо альбомную ориентацию.

Надеюсь, это поможет вам.

Ответ 2

Вы можете получить ориентацию устройства в расширении, добавив наблюдателя в UIApplicationWillChangeStatusBarOrientationNotification и затем извлекая ориентацию следующим образом.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationWillChange:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
}

- (void)orientationWillChange:(NSNotification*)n
{
    UIInterfaceOrientation orientation = (UIInterfaceOrientation)[[n.userInfo objectForKey:UIApplicationStatusBarOrientationUserInfoKey] intValue];

    if (orientation == UIInterfaceOrientationLandscapeLeft)
        //handle accordingly
    else if (orientation == UIInterfaceOrientationLandscapeRight)
        //handle accordingly
    else if (orientation == UIInterfaceOrientationPortraitUpsideDown)
        //handle accordingly
    else if (orientation == UIInterfaceOrientationPortrait)
        //handle accordingly
}

Спасибо