2014-09-14 4 views
12

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

How to detect Orientation Change in Custom Keyboard Extension in iOS 8?

Get device current orientation (App Extension)

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

Что является лучшим способом для достижения:

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

Спасибо,

ответ

18

Я столкнулся с этой проблемой м и просмотрел ваши примеры, но не было хорошего решения. Как я его разрешил: я создал класс, который выполняет некоторые вычисления значений 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 
} 

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

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

+0

Я побежал этот код и он, и он вернулся пейзаж, когда устройство было на самом деле портрет? Я все еще смущен тем изменением ориентации ios 8. Насколько я знаю, рамка не изменится, но границы с ориентацией. Теперь это просто почитается или? – user519274

+0

user519274 - Спасибо за комментарий. Он по-прежнему работает. Вы ввели код в нужное место? Это должно быть в viewWillLayoutSubviews или viewDidLayoutSubviews методы UIViewController. –

+0

Но как получить ориентацию устройства - landScapeLeft или ladnScapeRight, как этот http://stackoverflow.com/questions/25462091/get-device-current-orientation-app-extension –

1

Вы можете получить ориентацию устройства в расширении, добавив наблюдателя в 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 
} 

Благодаря

 Смежные вопросы

  • Нет связанных вопросов^_^