4

私は Xcode 4.5 に更新し、iOS6 で作業しています。次回の更新時に絶対に間違いを犯すことはありません。iOS を初めて使用する人にとっては悪夢のようなものでした。私が取り組んでいるアプリが自動回転していることに気付きました。更新前は自動回転していることに気づきませんでしたが、テスト中に電話を回転させなかった可能性もあるため、確信が持てません. 次のコードをメインの UIViewController に追加しましたが、まだ回転しています。

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
    return NO;
}

これは自動回転を無効にする正しい方法ですか? そうだとすれば、iOS6 に何か変更が加えられている可能性があり、完全なリリースまで待つ必要があります。しかし、間違っている場合は、代わりにどのコードを使用すればよいでしょうか?

いつもお世話になっております。

編集:これは私が変更したコードですが、まだ回転しています。私はそれを間違えましたか?

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait)
{
    return YES;
}
else 
{
    return NO;
}
}
4

3 に答える 3

2

Rotation API は iOS6 で変更されました。新しい API は明らかにオプトインされているはずですが、シミュレーターまたはデバイス上のすべてのデバッグ ビルドで有効になっているようです。新しい API 呼び出しに登録するには、APP デリゲートの didFinishLoading メソッドで次のようなものをスローします。

//Register for new API rotation calls
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"UIApplicationSupportedInterfaceOrientationsIsEnabled"];

ローテーションの変更の中心には 2 つの方法があります (3 つ目の方法がありますが、私はまだこれを自分で考えています)。

- (BOOL)shouldAutorotate
- (NSUInteger)supportedInterfaceOrientations

Windows の rootViewController でこれらのメソッドをオーバーライドする必要があります。これは、UINavigationController または UITabBarController のいずれかがルート コントローラーである場合、サブクラス化する必要があることを意味します (これは私には奇妙に思えますが、Apple は Jump と言っています)。

アプリを縦向きに保ちたいだけなら、2 つの方法を実装すれば完璧です。

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

Apple はインターフェイスの方向マスクを追加することでさらに混乱を招いていることに注意してください。UIInterfaceOrientationMaskPortrait != UIInterfaceOrientationPortrait. 代わりに UIInterfaceOrientationPortrait を返すと、動作が異なります。また、向きを組み合わせるのと同じ方法でマスクを組み合わせることができるので、両方の縦向きをサポートしたい場合に使用できます。

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} 

これは、縦向きを強制するために機能するはずです。子コントローラーが別の向きを使用できるようにするようなことをしたい場合、私には手がかりがありません。

于 2012-09-20T19:55:10.913 に答える
2

それは、成功したことがないからです。いずれかの方向を選択する必要があります。

コマンドを押したまま UIInterfaceOrientation をクリックすると、可能なオプションの列挙が表示されます。

次に、それらに対してテストして、YESシナリオを決定できます。

私はもともとあなたの問題を誤解していたかもしれません。アプリがローテーションを許可していると言っていたようです。しかし、コードはそれを禁止する必要があります。

まだコードを起動していると言っていると思っていました。はいを見つけようとしている

考えるべきことが1つあります。利用可能なView Controllerが複数ある可能性があります。おそらくあなたのコードはヒットしていません。

これにはいくつかの問題が考えられます。

  1. あなたのコードは使用されていません。カスタム ビュー コントローラーではなく、ビューが UIViewController として割り当てられているためです。

  2. あなたのコードは使用されていますが、そのViewコントローラーは方向について尋ねられたものではありません。したがって、その特定のコードはヒットしていません。

  3. ビルドが悪いと、間違ったアセンブリがデバイスに配置され続けます。

解決策は次のとおりです。

  1. コードが割り当てられているものであることを確認してください。カスタムクラスに直接割り当てがあります。またはxibファイルが膨張しています。xib ファイルを開いたら、Identity Inspector を確認してください。View Controllerを選択し、カスタムクラスがクラスタイプに設定されていることを確認してください

  2. 階層を見てください。他にどんなView Controllerがありますか。おそらく、そのうちの 1 つは、任意の向きに自動回転できることをアプリに伝えているのでしょう。

  3. 「DerivedData」フォルダーを見つけて、完全に削除します。時々、これは主催者から機能します。また、ディスクから直接削除する必要がある場合もあります。次に、クリーンアップして再度ビルドします。

また、別の解決策は、プロジェクト ファイルで設定を行うのと同じくらい簡単です。

ファイル ブラウザからプロジェクト ファイルを選択すると、概要に iPad と iPod の設定が表示されます。禁止したい向きのボタンを「UnPress」することができます。および、それ以外の方法で向きをコーディングしていないビュー コントローラー。デフォルトでこれらを使用します。

混乱をお詫び申し上げます。

アップデート

私は通常、このコードを使用してオートローテーションを処理します。

iPad を他の ios デバイスと区別するだけでなく、提示されたコントローラーに要求を転送して、モーダルに表示されたビューが必要に応じて応答できるようにします。

あなたがそれを理解していないとき、オリエンテーションは苦痛です:)

// Detect iPad
#define IS_IPAD() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \
[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad : NO)

// Set preferred orientation for initial display
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    if (IS_IPAD()){
        return UIInterfaceOrientationLandscapeRight;
    }
    else {
        return UIInterfaceOrientationPortrait;
    }
}
// Return list of supported orientations.
- (NSUInteger)supportedInterfaceOrientations{
    if (self.presentedViewController != nil){
        return [self.presentedViewController supportedInterfaceOrientations];
    }
    else {
        if (IS_IPAD()){
            return UIInterfaceOrientationMaskLandscapeRight;
        }
        else {
            return UIInterfaceOrientationMaskAll;
        }
    }
}

// Determine iOS 6 Autorotation.
- (BOOL)shouldAutorotate{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    // Return yes to allow the device to load initially.
    if (orientation == UIDeviceOrientationUnknown) return YES;
    // Pass iOS 6 Request for orientation on to iOS 5 code. (backwards compatible)
    BOOL result = [self shouldAutorotateToInterfaceOrientation:orientation];
    return result;
}
// handle iOS 5 Orientation as normal
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    // Return YES for supported orientations

    if (self.presentedViewController != nil){
        return [self.presentedViewController shouldAutorotate];
    }
    else {
        if (IS_IPAD()){
            return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
        }
        else {
            return (interfaceOrientation == UIInterfaceOrientationPortrait);
        }
    }
}
于 2012-08-29T00:47:14.950 に答える
1

iOS6 と iOS5 の両方で自動回転を処理する非常に簡単な方法は、supportedInterfaceOrientations と shouldAutorotateToInterfaceOrientation を使用することです。単なるコード行にするためのマクロがいくつかあります。UIInterfaceOrientationIsLandscape & UIInterfaceOrientationMaskLandscape. xCode のオートコンプリートで UIInterfaceOrientationMaskLandscape と UIInterfaceOrientationMaskPortrait を発見しました。autorotation に関する Apple ドキュメントにはありません。

このコード ブロックをルート ViewController に追加して、ランドスケープ モードのみをサポートするように強制します。

//iOS6 code to support orientations
- (NSUInteger)supportedInterfaceOrientations
{
     return (UIInterfaceOrientationMaskLandscape);
}

//iOS5 code to support orientations
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
     return (UIInterfaceOrientationIsLandscape(orientation));
}

iOS6 の場合、以下を使用して向きを検出できます。

  • UIInterfaceOrientationMaskLandscape
  • UIInterfaceOrientationMaskPortrait
  • UIInterfaceOrientationMaskLandscapeRight
  • UIInterfaceOrientationMaskLandscapeLeft
  • UIInterfaceOrientationMaskPortraitUpsideDown
  • UIInterfaceOrientationMaskAllButUpsideDown
  • UIInterfaceOrientationMaskAll

iOS5 以下では、以下を使用して向きを検出できます。

  • UIInterfaceOrientationIsLandscape (マクロ)
  • UIInterfaceOrientationIsPortrait
  • UIInterfaceOrientationIsLandscapeRight
  • UIInterfaceOrientationIsLandscapeLeft
  • UIInterfaceOrientationIsPortraitUpsideDown
于 2013-04-22T00:38:47.557 に答える