web-dev-qa-db-ja.com

iPadの現在の向きを取得しますか?

特定のイベントハンドラ(「shouldAutorotateToInterfaceOrientation」メソッドではない)で、現在のiPadの向きを検出するにはどうすればよいですか?横向き表示ではアニメーション化する必要があるテキストフィールドがありますが(キーボードが表示される場合)、縦向き表示ではなく、アニメーションが必要かどうかを確認するためにどの方向にいるかを知りたいです。

62
MikeN

方向情報はあまり一貫性がなく、いくつかのアプローチがあります。 View Controllerの場合、interfaceOrientationプロパティを使用できます。他の場所から電話をかけることができます:

[[UIDevice currentDevice] orientation]

または、方向変更通知の受信をリクエストできます。

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

ステータスバーの向きを確認したい人もいます:

[UIApplication sharedApplication].statusBarOrientation
133
Paul Lynch

おもう

[[UIDevice currentDevice] orientation];

本当に信頼できません。時々それは機能するが、時には機能しない...私のアプリでは、

[[UIApplication sharedApplication]statusBarOrientation]; 

そしてそれは素晴らしい作品です!

34
Samuel

の一つ:

  • アクティブなView ControllerのinterfaceOrientationプロパティを確認してください。
  • [UIApplication sharedApplication].statusBarOrientation
  • [UIDevice currentDevice].orientation。 (-beginGeneratingDeviceOrientationNotificationsを呼び出す必要がある場合があります。)
9
kennytm

FaceUpの向きの問題を解決するためのトリックを見つけました!!!

アプリの実行が開始された後、方向のチェックを遅らせ、変数、ビューサイズなどを設定します!!!

//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

「setStuff」関数でサブビュー、位置要素などを追加できます...最初は方向に依存するものなら何でも!!!

:D

-クリス・アリンソン

8
Chris Allinson

これは、次の2つの方法で実現できます。

1-次の方法を使用します。

** -(void)viewDidLoadメソッドに次の行を追加します。

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

次に、このメソッドをクラス内に配置します

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

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

上記の方法は、デバイスが回転するときの向きを確認します

2- 2番目の方法は、-(void)viewDidLoad内に次の通知を挿入することです。

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

次に、クラス内に次のメソッドを配置します

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

上記の方法では、iPadまたはiPhoneのステータスバーの向きを確認し、それに応じて、必要な向きでアニメーションを作成します。

3
Aragon

ランドスケープとポートレートの判別には、組み込み関数があります:

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

[UIApplication sharedApplication].statusBarOrientationは、iPadで横向きの場合は縦向きを、起動時に縦向きの場合は横向きを返します

1
Firas KADHUM

View Controllerで、self.interfaceOrientation(インターフェイスの現在の向き)の読み取り専用値を取得します。

0
Marco

上記の方法の多くを試しましたが、100%うまくいくとは思えませんでした。

私の解決策は、ルートビューコントローラーでUIInterfaceOrientationタイプの方向と呼ばれるiVarを作成することでした。

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

}

次に、方向を確認する必要がある場所であれば、次のようなことができます。

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

まだ良い方法があるかもしれませんが、これは98%の時間で動作するようで(iOS5にもかかわらず)、それほど難しくありません。 iOS5は常にiPadをポートレートビューで起動してから、デバイスにwillRotateTo-およびdidRotateFromInterfaceOrientation:メッセージを送信するため、値が短時間不正確になることに注意してください。

0
avance

理由はわかりませんが、アプリを起動するたびに最初の4つは正しいのですが、その後は逆の方向になります。静的変数を使用してこれをカウントし、次にブールを使用して、これを手動でサブビューに送信する方法を反転させます。

したがって、新しいスタンドアロンの回答を追加するわけではありませんが、上記を使用してこれを念頭に置いて言っています。注:アプリの起動時に呼び出されるのはステータスバーの方向のみで、ステータスバーの方向を受け取ります。

これを使用する主な問題は、ビューが遅延ロードされることです。包含ビューとサブビューのviewプロパティを必ず「前に」呼び出して、向きに応じて位置を設定してください。 Apple存在しない変数を設定してもクラッシュしないため、それらを壊すことを強制しますOOそして強制的にも強制します。本当にエレガントなシステムですが、壊れています!真剣に、私はネイティブが大好きですが、それは良くありません、悪いOOデザイン。 、しかしAppleの方法では、ビューを作成して初期化するのではなく、使用することでビューをロードする必要があります

0
Stephen J