it-swarm.com.de

Aktuelle Ausrichtung des iPad erhalten?

Wie erkenne ich in einem bestimmten Ereignishandler (nicht der Methode "sollAutorotateToInterfaceOrientation") die aktuelle iPad-Ausrichtung? Ich habe ein Textfeld, das ich in der Querformatansicht animieren muss (wenn die Tastatur angezeigt wird), nicht jedoch in der Hochformatansicht und möchte wissen, in welcher Ausrichtung ich mich befinde, um zu sehen, ob die Animation erforderlich ist.

62
MikeN

Orientierungsinformationen sind nicht sehr konsistent und es gibt verschiedene Ansätze. Wenn Sie sich in einem View-Controller befinden, können Sie die Eigenschaft interfaceOrientation verwenden. Von anderen Orten aus können Sie anrufen:

[[UIDevice currentDevice] orientation]

Alternativ können Sie anfragen, Orientierungsänderungsbenachrichtigungen zu erhalten:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];

Einige Leute möchten auch die Ausrichtung der Statusleiste überprüfen:

[UIApplication sharedApplication].statusBarOrientation
133
Paul Lynch

Meiner Ansicht nach 

[[UIDevice currentDevice] orientation];

ist nicht wirklich zuverlässig. Manchmal funktioniert es, manchmal nicht ... In meinen Apps verwende ich 

[[UIApplication sharedApplication]statusBarOrientation]; 

und es funktioniert super!

34
Samuel

Einer von:

  • Überprüfen Sie die interfaceOrientation-Eigenschaft des aktiven View-Controllers.
  • [UIApplication sharedApplication].statusBarOrientation.
  • [UIDevice currentDevice].orientation. (Möglicherweise müssen Sie -beginGeneratingDeviceOrientationNotifications aufrufen.)
9
kennytm

Ich habe einen Trick gefunden, um das FaceUp-Orientierungsproblem zu lösen !!!

Verzögern Sie die Orientierungsprüfung, bis die App gestartet wurde, und legen Sie Variablen, Ansichtsgrößen usw. fest.

//CODE

- (void)viewDidLoad {

  [super viewDidLoad];

  //DELAY
  [NSTimer scheduledTimerWithTimeInterval:0.5 
                     target:self 
                     selector:@selector(delayedCheck) 
                     userInfo:nil 
                     repeats:NO];

}


-(void)delayedCheck{

  //DETERMINE ORIENTATION
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){
      FACING = @"PU";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){
      FACING = @"PD";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){
      FACING = @"LL";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){
      FACING = @"LR";
  } 
  //DETERMINE ORIENTATION

  //START
  [self setStuff];
  //START

}


-(void)setStuff{

  if( FACING == @"PU" ){
          //logic for Portrait
  }
  else
  if( FACING == @"PD" ){
          //logic for PortraitUpsideDown
  }
  else{ 
  if( FACING == @"LL"){
          //logic for LandscapeLeft
  }
  else
  if( FACING == @"LR" ){
          //logic for LandscapeRight
  }

}

//CODE

In der 'setStuff'-Funktion können Sie Übersichten, Positionselemente usw. hinzufügen ... alles, was anfangs von der Ausrichtung abhängen würde !!!

: D

Chris Allinson

8
Chris Allinson

Sie können dies auf zwei Wegen erreichen:

1- Mit folgender Methode:

** Fügen Sie die folgende Zeile in die -(void)viewDidLoad-Methode ein:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];

dann fügen Sie diese Methode in Ihre Klasse ein

-(void)deviceRotated:(NSNotification*)notification
{

   UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
        //Do your textField animation here
    }
}

Die obige Methode überprüft die Ausrichtung, wenn das Gerät gedreht wird

2- Die zweite Möglichkeit besteht darin, die folgende Benachrichtigung in -(void)viewDidLoad einzufügen.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];

fügen Sie dann die folgende Methode in Ihre Klasse ein

-(void)checkRotation:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
         //Do your textField animation here
    }
}

Die obige Methode prüft die Ausrichtung der Statusleiste des iPads oder iPhones, und danach richten Sie Ihre Animation in der erforderlichen Ausrichtung aus.

3
Aragon

Für die Bestimmung von Landschaft vs. Porträt gibt es eine integrierte Funktion:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
2
caleb

[UIApplication sharedApplication].statusBarOrientation gibt das Porträt im iPad und das Porträt beim Hochfahren im iPad zurück

1
Firas KADHUM

Rufen Sie in Ihrem View-Controller den schreibgeschützten Wert von self.interfaceOrientation (die aktuelle Ausrichtung der Schnittstelle) ab. 

0
Marco

Ich habe viele der oben genannten Methoden ausprobiert, aber nichts schien für mich zu 100% zu funktionieren.

Meine Lösung bestand darin, im Root View Controller eine iVar mit der Bezeichnung Orientierung UIInterfaceOrientation zu erstellen.

- (void)viewDidLoad {

    [super viewDidLoad];
    orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use.
}


- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return YES;
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    orientation =  toInterfaceOrientation;

}

Dann können Sie an jedem Ort, an dem Sie die Ausrichtung überprüfen müssen, Folgendes tun:

 if(UIInterfaceOrientationIsPortrait(orientation)){
    // portrait
  }else{
   // landscape
  }

Es kann immer noch einen besseren Weg geben, aber dies scheint in 98% der Fälle zu funktionieren (ungeachtet von iOS5) und ist nicht zu schwer. Beachten Sie, dass iOS5 das iPad immer im Hochformat startet und dann einem Gerät die Meldungen willRotateTo- und didRotateFromInterfaceOrientation: sendet, sodass der Wert noch kurz ungenau ist.

0
avance

Ich weiß nicht warum, aber jedes Mal, wenn meine App startet, sind die ersten 4 richtig, aber danach bekomme ich die entgegengesetzte Orientierung. Ich verwende eine statische Variable, um dies zu zählen, und dann habe ich eine BOOL, um zu klappen, wie ich das manuell an Unteransichten schicke.

Während ich also keine neue eigenständige Antwort hinzufüge, sage ich, verwenden Sie das oben genannte und beachten Sie dies. Hinweis: Ich empfange die Statusleiste als Orientierung, da dies das einzige ist, das beim Start der App aufgerufen wird und "richtig" ist, um mir beim Umzug zu helfen.

Das Hauptproblem dabei ist, dass die Ansichten faul geladen werden. Vergewissern Sie sich, dass Sie die Ansichtseigenschaft Ihrer enthaltenen und Unteransichten "Vorher" nennen, indem Sie ihre Positionen entsprechend ihrer Ausrichtung festlegen. Ich danke Apple dafür, dass er nicht abgestürzt ist, wenn wir Variablen setzen, die nicht existieren. Deshalb müssen wir uns daran erinnern, dass sie OO brechen und uns dazu zwingen, dies auch zu tun ... gah, ein so elegantes System, das so kaputt ist! Im Ernst, ich liebe Native, aber es ist einfach nicht gut, fördert schlechtes OO Design. Nicht unser Fehler, Sie müssen lediglich daran erinnern, dass Ihre Funktion zum Ändern der Größe möglicherweise funktioniert, aber Apple's Way erfordert, dass Sie die Ansicht durch Verwendung laden, nicht indem Sie sie erstellen und initialisieren 

0
Stephen J