0

現在、App Store にはほぼランドスケープのみの iPad アプリケーションがあり、回転ロックを処理する新しい iOS 6 の方法にいくつかの問題があります。

これは UINavigationController ベースのアプリケーションであり、iOS がほとんどの責任を処理するため、rootViewControllerUIWindowUIViewController に必要な回転を手動で尋ねる必要があります。

非常に大量のUIViewControllers があるため、各コントローラーにコードを手動で追加してこれを行うには時間がかかります。そのため、これらの呼び出しをオーバーライドするために UINavigationController と UIViewController の両方を拡張し、必要なビューを手動で設定できます。ポートレートをブロックする相手と許可するポートレート。

UINavigationController-Extension.m:

//
//  UINavigationController-Extension.m
//  DrivingInstructor
//
//  Created by Liam Nichols on 06/12/2012.
//  Copyright (c) 2012 Liam Nichols. All rights reserved.
//

#import "UINavigationController-Extension.h"


@implementation UINavigationController (Extension)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

@end


@implementation UIViewController (Extension)

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
    {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
    {
        return YES;
    }
    return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(NSArray*)portraitClasses
{
    static NSArray *classes;
    if (classes == nil)
    {
        classes = @[ @"MockTestController", @"PLUILibraryViewController", @"PhotoViewController" ];
    }
    return classes;
}

@end

最初は、これで問題が解決したと思いました(また、info.plistでアプリを横向きにロックしたままにして、横向きに起動し、アプリデリゲートで呼び出しapplication:supportedInterfaceOrientationsForWindow:てすべての向きを返し、選択したビューが縦向きにアクセスできるようにしました必要に応じて。

したがって、これは機能しているようで、lanscape にロックされているすべてのビュー コントローラーは、拡張機能クラスで指定した 3 を受け入れます。オリエンテーション。

ただし、私が見つけて修正できないように見える1つの問題は、たとえば、許可されたビューコントローラーで縦向きにあり、横向きにロックされている前のビューコントローラーにポップバックしようとするsupportedInterfaceOrientationsと、二度と呼び出されず、ビューランドスケープにロックする必要がありますが、そうではありません (これにより問題が発生します)。

リンゴのドキュメントに従って、回転を処理する責任が rootViewController に渡され、ユーザーがデバイスを回転させておらず、rootViewController が変更されていないため、要求する必要がないため、これがどのように機能するかsupportedInterfaceOrientations..

私の質問は、アプリケーションに強制的に電話をかける方法はありますか、それとも別のsupportedInterfaceOrientations方法で行うべきですか?

読んでくれてありがとう。この最後のバグの解決策を見つけることができれば、このコードは同じ状況にある人々への良い参考になるかもしれません。

- - -編集 - - -

viewWillAppear:さらに調査を行っていたところ、実際には関数の直前に、supportedInterfaceOrientations実際に私がポップバックしようとしているコントローラーで呼び出され、正しいマスクUIInterfaceOrientationMaskLandscapeを返してポートレートから自動的に回転させようとしていることがわかりましたが、そうではないようですこの応答を聞いても、まだUIViewController縦向きのままです...

つまり、supportedInterfaceOrientationsもう一度 を呼び出す必要はありませんが、代わりにデバイスを回転させて横向きに戻します。

4

1 に答える 1

0

ドキュメントによると、次のように呼び出すことができます。

+ (void)attemptRotationToDeviceOrientation

ドキュメントを正しく理解していれば、別のViewControllerへの回転を再度クエリします。

于 2012-12-12T15:11:15.237 に答える