35

この場合、向きを指定する必要はありません。検出するだけで済みますが、問題が発生しています。縦向きでのみ機能する条件付きコードがあり、デバイスが横向きの場合は、別のことを行う必要があります。deviceOrientationは必ずしもinterfaceOrientationと同じではないため、ポートレートモードをテストする方法を思い付くことができません。

私がGoogleで見つけたほとんどのチュートリアルは、横向きを強制したり、ある種の回転を行ったりする方法です。私がしたいのは、向きを決めることだけです。これが私のコードですが、機能していません:

-(void)viewDidLoad {
    [super viewDidLoad];
    //currentOrientation is declared as UIInterfaceOrientation currentOrientation
    currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation);  // == NULL
}

interfaceOrientationとプログラムの値を条件付きで決定する必要があります。ご協力いただきありがとうございます!

4

10 に答える 10

77

クラスのinterfaceOrientation特性を知っていますか?UIViewController

- (void) viewDidLoad {
    [super viewDidLoad];
    BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
    // now do whatever you need
}

それともあなたは後[[UIDevice currentDevice] orientation]ですか?

于 2010-04-10T18:01:19.970 に答える
41

特に起動時に、UIDeviceが方向を示しているかどうかに関係なく、UIに対して次のことが常に正確であることがわかりました。

[UIApplication sharedApplication].statusBarOrientation
于 2010-05-21T18:15:33.947 に答える
10

self.interfaceOrientation特定の状況では信頼できません。たとえば、タブバーアプリケーションでタブを再配置すると、誤った値が返されます。

ただし[UIApplication sharedApplication].statusBarOrientation、常に信頼できます。あなたは私に多くの時間を節約しました。ありがとうございました。

于 2011-04-01T02:56:04.730 に答える
4
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if ((orientation == UIInterfaceOrientationLandscapeLeft)
||  (orientation == UIInterfaceOrientationLandscapeRight) )
{
    //Landscape
}
else
{
    //Portrait
}
于 2012-01-12T12:27:39.180 に答える
1

私はそれが非常に古い投稿であることを知っています。ただし、ステータスバーの向きを確認する方がよいという点を付け加えたいと思います。あなたが呼ぶときはいつでもself.interfaceorientationそれはshouldRotateToOrientation毎回呼んでいます。そのメソッドでコードを記述した場合、それが実行されます。だから注意してください!

于 2012-03-12T08:11:01.370 に答える
1
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 

    if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
        if(debug){
            NSLog(@"Nothing to change because it is gone to Flat");
        }
        return;
    }
    if(deviceOrientation !=statusBarOrientation){
        if(debug){
            NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation  );
        }
    }

コンソールに2番目の出力が表示されるまで、私を信じることはできません。いくつかの状況-そしてそれらは存在します!-最後のNSLogコンテンツが表示されます!

iOSにバグがない場合、その方法を実行するにはいくつかの回避策を実行する必要があります。皆さんの幸運を祈ります。

ああ、それは...フォーラムのモデレーターもこの投稿を削除するかもしれません。なぜなら、これは彼の意見で答えることを意図したものではないからです!

私はそれが誰かのために一度役立つことを願っています、それはiPhoneでも起こります...(私はそこにいます)

于 2012-08-24T16:04:09.570 に答える
1

少し混ぜてください:

BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;

(編集)明らかに、前の答えはこれを行う正しい方法であり、このソリューションは、ビューコントローラーがフルスクリーンでない状況では失敗します。

于 2014-04-30T21:56:06.113 に答える
1
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
   if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
        some instructions;
   } else { 
        some instructions;
   }
}

これは私のプログラムの1つからの抜粋です。もちろん、ViewDidLoad通知でifステートメントを使用することもできます。

于 2014-09-16T19:51:18.010 に答える
1

私はすでに@slycrelによる回答に投票しましたが、時間をかけてこれを書き、この古い質問で失われているように思われるいくつかのことや、この主題に関する他の多くの質問を指摘したいと思います。

確かにAppleは、向きの変更に基づいてUIのほとんどを更新することを望んでいませんが、それでも完全に可能であり、ケースバイケースのシナリオで必要になることもあります。Appleが新しい(ish)を改善するまではそうなります。 API(たとえば、 .just sayin'viewWillTransitionToFrame:よりもはるかに便利です)viewWillTransitionToSize:

UIDeviceOrientation@slycrelで回答に投票した理由は、との論理的な違いとして覚えておく必要があることに関連していますUIInterfaceOrientation

ステータスバーは、アプリケーションの現在既知の状態を示しますUIInterfaceOrientation。に関するこれらすべてのことは、デバイスの向きにのみ関連しており、必ずしもアプリケーションの向きに関連しているわけではありませんFaceUpとにかく、アプリケーションはデバイスの向きをサポートしていません。実際、インターフェイスで適切にレイアウトおよびアニメーション化するだけであれば、完全に無視できます。これは、アプリケーション開発者のユースケースの99%です。これは現在、@slycrelの回答のステータスバーで実現されています。FaceDownUIDeviceOrientationUIInterfaceOrientation

[UIApplication sharedApplication].statusBarOrientation

このプロパティの読み取り/書き込みバージョンは非推奨ですが、読み取り専用バージョンは非推奨ではないことに注意してください。

この例を見てください:

  • すべてのインターフェイスの向きをサポートするアプリケーションと、それらをサポートするルートビューコントローラーがあります。
  • 今、私はUIViewControllerステータスバーの向きが横向きになる結果となるものを提示しています。
  • どの横向き(左または右)に移動するかはpreferredInterfaceOrientationForPresentation、そのView Controllerに対して返されるもの、現在のデバイスの向き、およびView Controllerがサポートするインターフェイスの向きに基づいています(次のポイントを参照)。
  • このViewControllerは、によって返されるものに基づいて横向きのみをサポートするため、現在のデバイスの向きに関係なく、ステータスバーは横向きになりますsupportedInterfaceOrientations。で左右両方の風景をサポートするとしましょうUIInterfaceOrientationMaskLandscape
  • また、このViewControllerを回転変換を使用して所定の位置に条件付きでアニメーション化します。これは、ポートレートまたはポートレートを逆さまにして、横向き左または横向き右に移動する場合にのみ必要になります。それ以外の場合は、回転のない、より単純なプレゼンテーションアニメーションになります。
  • 次に、しばらくしてデバイスを使用した後、そのViewControllerを閉じます。
  • 次に、別の回転変換を使用して、このViewControllerを画面から条件付きでアニメーション化します。これは、左の風景または右の風景から、縦向きまたは逆さまの縦向きに移動する場合にのみ必要になります。それ以外の場合は、回転のない、より単純な却下アニメーションになります。
  • この時点で、ステータスバーの向きは、ルートビューコントローラーの優先インターフェイスの向きとサポートされているインターフェイスの向き、およびデバイスの現在の組み合わせに適切であるとシステムが判断したものになりますUIDeviceOrientation
  • ビューコントローラはすべてのインターフェイスの向きをサポートするため、デバイスの向きがFaceUpまたはFaceDownの場合、に基づいて次の向きを確実に推測することはできずUIInterfaceOrientationUIDeviceOrientation、とにかくそうする必要はありません。
  • だから...救助へのステータスバーの向き!

ビューコントローラの遷移が開始されようとしているときにステータスバーの方向が更新されないため、前の例が可能です(システムは遷移デリゲートにアニメーターなどを要求します)。次に、トランジションがアニメーションを開始すると更新されます(たとえば、時間animationTransition:が呼び出されるまでに)。このようにして、ステータスバーの初期値と現在の値を使用するだけで適切な比較ができるはずですUIInterfaceOrientation

ビューコントローラのトランジションを使用しなくても、ステータスバーの向きに基づいてビューを更新しても安全です。

ステータスバーを手動で更新していて、 Info.plistで「コントローラーベースのステータスバーの外観を表示」を使用していない場合は、アプリケーションのロジックがステータスバーの向きをいつ変更するかを認識している必要があることに注意してください。 。NSNotificationあなたはおそらくこれらの場合のいくつかの名前を探しているでしょう:それは次のとおりです:

  • UIApplicationWillChangeStatusBarOrientationNotification
  • UIApplicationDidChangeStatusBarOrientationNotification

これらのUIApplicationDelegate方法と同様に:

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window

そして、この他の便利なUIApplicationプロパティ:

@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;
于 2016-07-11T00:24:41.697 に答える
0

iOS8の時点で、APIは非推奨になっている、または次のような役に立たない結果を返す.FaceUp .FaceDown

これは、Appleが、向きを使用してUIを更新するのではなく、サイズクラス、制約、および比率(スーパービューのn%を使用)を使用してUIを更新することを望んでいないためです。

実際、向きに依存するコードは、デバイスとユースケースの全範囲(特にマルチタスク)で良好な結果を提供できない可能性があります

于 2015-09-30T08:15:42.653 に答える