3

iOSバージョン5および6をサポートするiPadアプリを作成しています。アプリケーションの開始時に縦向きモードでのみ表示されるView Controllerがあります。後で、すべてのインターフェイスの向きをサポートするView Controllerがあります。

iOS 5 または iOS 6 で動作するようにしました。意味: iOS 6 では、View Controller でサポートされているインターフェイスの向きは、info.plist ファイルでも設定されている場合にのみ機能します。したがって、info.plist ファイルですべてのインターフェイスの向きを設定する必要があります。iOS 6 ではすべて動作しますが、iOS 5 では、アプリの起動前に iPad が縦向きの場合、起動時に動作します。ただし、iPad が横向きの場合、アプリは正しい方法で起動しますが、別の回転を手動で実行するまで通知センターは正しくありません。

別の iOS バージョンの info.plist ファイルに他のキーを入れる方法はありますか? それが私が考えることができる唯一の解決策です。info.plist ファイルの向きとして縦向きのみを設定すると、iOS 5 で動作するためです。

編集:

さて、私はそれを少し混乱させて説明しました。shouldAutorotate と supportedInterfaceOrientations: のメソッドを使用して、iOS 6 で完全に動作するようにしました。私のルート ビュー コントローラーはポートレート インターフェイスの向きのみをサポートしており、info.plist ではすべてのインターフェイスの向きを選択する必要がありました。

問題:

iPad を横向きにして iOS 5 でアプリを起動すると、次のようになります。

ルート ビュー コントローラーはポートレート モードですが、アプリはランドスケープ モードのように動作します。つまり、横から通知センターにアクセスできます。

私が考えることができる私の解決策:

問題は、info.plist ファイルですべてのインターフェイスの向きを設定しなければならなかったことです。つまり、iOS 5 では、メソッド shouldAutorotateToInterfaceOrientation: に考えられる向きを 1 つ入れただけでも、アプリはランドスケープ モード (上記で説明した動作) で起動しようとします。

したがって、2つの解決策があります。info.plistファイルで特定のインターフェイスの向きが選択されていない場合、iOS 6でアプリを回転させるか、iOS 5の回転を「変更」できます。

あなたが私を助けてくれることを願っています。

4

3 に答える 3

4

さて、ついに私はそれに対する解決策を思いつきました。問題は、info.plist ファイルで設定されたインターフェイスの向きが原因で、起動時に通知センターに間違った方法でアクセスすることでした。

私は全画面表示のアプリを持っていますが、ステータスバーも横向きモードのように表示され、他のビューは縦向きモード(rootviewcontroller)で表示されることに最初は気付きませんでした。

アプリケーションで:didFinishLaunchingWithOptions:私はこのコードを入れました:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

そして、起動時に1つの向きのアプリを持ちたいが、別のサブコントローラーで複数を許可したい他のすべての人にとって、ここに完全な解決策があります:

起動時に iPad のすべてのインターフェイスの向きを設定します。

私の rootViewController には、次のコードがあります。

(古いiOSバージョンのサポート)

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

(新規の方のサポート)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
        return NO;
}

サブコントローラーには次のものがあります。

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

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

- (BOOL)shouldAutorotate {
    return YES;
}

シンプルに見えますが、ステータスバーの問題を解決するのに何年もかかりました. shouldAutorotate が呼び出されない場合は、他の投稿で言及されているこのハックを使用する必要があります。

于 2013-01-03T10:30:41.397 に答える
0

iOS 6 の場合、UIViewControllers で次の 2 つのオーバーライドされたメソッドが必要です。

- (NSUInteger)supportedInterfaceOrientations
- (BOOL)shouldAutorotate

また、Info.plist の向きは起動専用であるため、ポートレートのみの起動の向きと一致する必要があります。

自動回転は、UINavigationController のスタックなど、UIViewcontrollers が正しく使用されている場合にのみ正しく機能することに注意してください。そうすれば、各コントローラーが表示されるときに、指定された向きが使用されます。

于 2013-01-03T01:00:28.173 に答える
0

これは、下位互換性のために私が思いついた方法です。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    if ([CMVStaticContainer isPad]) // Custom Method to determine this is on the iPad
    {
        return UIInterfaceOrientationLandscapeRight;
    }
    else
    {       
        return UIInterfaceOrientationPortrait;
    }
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}

- (BOOL)shouldAutorotate{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if (orientation == UIDeviceOrientationUnknown) return YES;
    BOOL result = [self shouldAutorotateToInterfaceOrientation:orientation];
    return result;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    // Return YES for supported orientations
    if ([CMVStaticContainer isPad]) // Custom Method to determine this is on the iPad
    {
        return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
    }
    else
    {       
        return YES;
    }

}

UIDeviceOrientationUnknown については、常に yes を返す必要があると判断しました。次に、私のコードはそれをiOS 5の他のオリエンテーションコードに転送します

ああ、rootViewController としての「標準クラス」でも問題が発生しました。これがメッセージを受け取るためです。それをサブクラス化し、一番上にあるビュー コントローラーを特定し、それを介してメッセージを送信し、ビュー コントローラーが確実にオンになるようにします。 top は、優先方向と shouldAutorotate コマンドを決定します。

このコードにはそれが含まれていませんが、ルートの UINavigationController ではなく、新しいビュー コントローラーにモーダル プレゼンテーションを使用したためです。しかし、それは無関係な決定でした。

于 2013-01-03T01:25:46.993 に答える