2014-09-14 4 views
12

Wie kann die Ausrichtung eines Geräts in einer Anwendungserweiterung am besten erkannt werden? Ich habe gemischte Ergebnisse mit Lösungen, die ich hier gefunden habe:Wie erkenne ich die Ausrichtung in einer App-Erweiterung am besten?

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

Get device current orientation (App Extension)

Ich habe in Größenklassen sah und UITraitCollection und stellte fest, dass das Gerät ungenau berichtet, dass es im Portrait, wenn es ist in der Tat in Landschaft (nicht sicher, ob dies OS-Fehler ist, oder ich nicht die richtigen APIs die richtige Weise abfragen).

Was ist die beste Methode zur Durchführung:

  • Die aktuelle Ausrichtung des Gerätes, wenn die Verlängerung erste
  • Die Orientierung geladen wird das Gerät auf
  • Die Ausrichtung der Vorrichtung zu
  • hat drehen dreht

Vielen Dank,

Antwort

18

Ich konfrontiert mit diesem Problem Ich habe auch Ihre Beispiele durchgesehen, aber es gab keine gute Lösung. Wie ich es gelöst habe: Ich habe eine Klasse erstellt, die einige Berechnungen der UIScreen-Werte durchführt und die selbstdefinierte Geräteausrichtung zurückgibt.

Klasse Rubrik:

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

@interface InterfaceOrientation : NSObject 

+ (InterfaceOrientationType)orientation; 

@end 

Umsetzung:

@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 

Ich habe es zu viewWillLayoutSubviews oder viewDidLayoutSubviews Methoden der Ausrichtung ändert Ereignis zu fangen.

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

Falls Sie eine genaue Seite der Geräteausrichtung (links, rechts, oben nach unten) zu erhalten, diesen Ansatz wird Ihr Problem nicht lösen. Es gibt nur die Hoch- oder Querformatausrichtung zurück.

Ich hoffe, es wird Ihnen helfen.

+0

lief ich diesen Code und es und es zurück Landschaft, wenn das Gerät tatsächlich Porträt ist? Ich bin immer noch verwirrt über diese Orientierungsänderung der ios 8. Soweit ich weiß, wird sich der Rahmen nicht ändern, aber Grenzen haben mit der Orientierung getan. Jetzt ist es nur verehrt oder? – user519274

+0

user519274 - Vielen Dank für den Kommentar. Es funktioniert noch. Hast du den Code an die richtige Stelle gesetzt? Es sollte in ViewWillLayoutSubviews oder ViewDidLayoutSubviews-Methoden von UIViewController sein. –

+0

Aber wie man Geräteausrichtung bekommt, ist landScapeLeft oder ladnScapeRight wie dieses http://stackoverflow.com/questions/25462091/get-device-current-orientation-app-extension –

1

Sie können die Geräteausrichtung in Erweiterung abrufen, indem Sie einen Beobachter in UIApplicationWillChangeStatusBarOrientationNotification hinzufügen und anschließend die Ausrichtung wie folgt extrahieren.

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

Dank

Verwandte Themen