2014-09-14 19 views
12

Jaki jest najlepszy sposób wykrywania orientacji urządzenia w rozszerzeniu aplikacji? Miałem mieszane rezultaty z rozwiązań, jakie znajdują się tutaj:Jaki jest najlepszy sposób wykrywania orientacji w rozszerzeniu aplikacji?

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

Get device current orientation (App Extension)

Mam spojrzał na klasy wielkości oraz UITraitCollection i okazało się, że urządzenie nieprecyzyjnie informuje, że w układzie pionowym, gdy jest w rzeczywistości w krajobrazie (nie jestem pewien, czy to jest błąd systemu operacyjnego, czy też nie mam pytania o właściwe interfejsy API).

Jaki jest najlepszy sposób realizacji:

  • przyrządu orientacja prąd gdy rozszerzenie jest najpierw ładowany
  • orientacja urządzenie będzie obracać się
  • orientacji urządzenie nie obracają się

Dziękujemy,

Odpowiedz

18

Zmierzyłem się z tym problemem m i przejrzałem twoje przykłady, ale nie było dobrego rozwiązania tego. Jak to rozwiązałem: Stworzyłem klasę, która wykonuje pewne obliczenia wartości UIScreen i zwraca orientację urządzenia zdefiniowaną przez siebie.

Klasa Header:

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

@interface InterfaceOrientation : NSObject 

+ (InterfaceOrientationType)orientation; 

@end 

Realizacja:

@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 

kładę go viewWillLayoutSubviews lub viewDidLayoutSubviews metod połowu orientacja zmienia zdarzenie.

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

W przypadku, gdy chcesz uzyskać dokładną stronę orientacji urządzenia (lewo, prawo, do góry nogami) to podejście nie rozwiąże problemu. Po prostu zwraca orientację pionową lub poziomą.

Mam nadzieję, że ci to pomoże.

+0

Pobiegłem ten kod i go i wrócił krajobrazu, gdy urządzenie było rzeczywiście portret? Ciągle jestem zdezorientowany tą zmianą orientacji w ios 8. O ile wiem, rama się nie zmieni, ale granice z orientacją. Czy to jest po prostu zadawnione, czy? – user519274

+0

user519274 - Dziękuję za komentarz. To nadal działa. Czy umieściłeś kod we właściwym miejscu? Powinien być w viewWillLayoutSubviews lub viewDidLayoutSubviews metod UIViewController. –

+0

Ale jak uzyskać orientację urządzenia, to landScapeLeft lub ladnScapeRight, takie jak ten http://stackoverflow.com/questions/25462091/get-device-current-orientation-app-extension –

1

Możesz uzyskać orientację urządzenia na przedłużeniu, dodając obserwatora na UIApplicationWillChangeStatusBarOrientationNotification, a następnie wyodrębniając orientację w następujący sposób.

- (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 
} 

Dzięki

Powiązane problemy