50

私のアプリには複数のビューがあり、一部のビューは縦向きと横向きの両方をサポートする必要がありますが、他のビューは縦向きのみをサポートする必要があります。したがって、プロジェクトの概要では、すべての方向を選択しました。

以下のコードは、iOS6より前の特定のViewControllerでランドスケープモードを無効にするために機能しました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

shouldAutorotateToInterfaceOrientationはiOS6で非推奨になったため、上記を次のように置き換えました。

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMask.Portrait;
}

このメソッドは、ビューが表示されたときに正しく呼び出されます(これを確実にするためにブレークポイントを設定できます)が、ポートレートモードのマスクのみを返すという事実に関係なく、インターフェイスは引き続きランドスケープモードに回転します。私は何が間違っているのですか?

現在、ビューごとに異なる向きの要件を持つアプリを作成することは不可能のようです。プロジェクトの概要で指定された方向性にのみ準拠しているようです。

4

15 に答える 15

70

ルートウィンドウコントローラーとしてUINavigationControllerを使用している場合は、 shouldAutorotatesupportedInterfaceOrientations呼び出されます。

UITabBarControllerなどを使用している場合は同じです。

したがって、行うべきことは、ナビゲーション/タブバーコントローラーをサブクラス化し、そのshouldAutorotatesupportedInterfaceOrientationsメソッドをオーバーライドすることです。

于 2012-09-21T10:07:04.537 に答える
30

AppDelegate.mでこのコードを変更してみてください

//   self.window.rootViewController = self.navigationController;

    [window setRootViewController:navigationController];

これが完全な答えです

shouldAutorotateToInterfaceOrientationがiOS6で呼び出されていない

XD

于 2012-09-20T06:54:40.620 に答える
20

私の場合、UINavigationControllerとViewControllerが内部にあります。UINavigationControllerをサブクラス化する必要があり、Portraitのみをサポートするには、次のメソッドを追加します。

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

したがって、UINavigationControllerサブクラスでは、現在のtopViewControllerでサポートされている方向を確認する必要があります。

- (NSUInteger)supportedInterfaceOrientations
{
    return [[self topViewController] supportedInterfaceOrientations];
}
于 2012-09-20T13:25:20.250 に答える
15

私が見つけた1つのことは、まだ実行している古いアプリケーションがあるかどうかです。

[window addSubView:viewcontroller.view];  //This is bad in so may ways but I see it all the time...

これを次のように更新する必要があります。

[window setRootViewController:viewcontroller]; //since iOS 4

これを行うと、オリエンテーションが再び機能し始めるはずです。

于 2012-09-20T18:29:44.960 に答える
14

iOS6の最良の方法は、RayWenderlichチームによる「iOS6ByTutorials」(http://www.raywenderlich.com/)に具体的に記載されておりほとんどの場合、UINavigationControllerをサブクラス化するよりも優れています。

初期ビューコントローラーとして設定されたUINavigationControllerを含むストーリーボードでiOS6を使用しています。

//AppDelegate.m-残念ながら、このメソッドはiOS6より前では利用できません

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

if(self.window.rootViewController){
    UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
    orientations = [presentedViewController supportedInterfaceOrientations];
}

return orientations;
}

//MyViewController.m-各UIViewControllerでサポートする方向を返します

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}
于 2012-12-21T00:30:06.540 に答える
10

他の人が述べているように、UINavigationControllerを使用していて、さまざまなビューをカスタマイズする場合は、UINavigationControllerをサブクラス化し、次の2つのコンポーネントがあることを確認してください。

@implementation CustomNavigationController

// -------------------------------------------------------------------------------
//  supportedInterfaceOrientations:
//  Overridden to return the supportedInterfaceOrientations of the view controller
//  at the top of the navigation stack.
//  By default, UIViewController (and thus, UINavigationController) always returns
//  UIInterfaceOrientationMaskAllButUpsideDown when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations]; 
}

// -------------------------------------------------------------------------------
//  shouldAutorotate
//  Overridden to return the shouldAutorotate value of the view controller
//  at the top of the navigation stack.
//  By default, UIViewController (and thus, UINavigationController) always returns
//  YES when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

次に、ポートレートであるビューには、次のものを含めるだけです。

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

そして、逆さま以外のすべてのビューで:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}
于 2013-05-14T06:30:45.290 に答える
2

基本的に誰かが上で述べたように、しかしより詳細に:

  1. UINavigationControllerのサブクラスである新しいファイルを作成します
  2. ストーリーボードに移動し、ナビゲーションコントローラをクリックして、そのクラスを作成したクラスに設定します
  3. このクラス(.mファイル)に次のコードを追加して、ポートレートモードのままにします。

    (BOOL)shouldAutorotate
    {
      return NO;
    } 
    
    (NSUInteger)supportedInterfaceOrientations
    {
     return UIInterfaceOrientationMaskPortrait;
    }
    

これは私のために働いた

于 2013-02-17T22:25:53.400 に答える
1

このコードは私のために働いた:

-(BOOL)shouldAutorotate {
     return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

iPhone/iPadアプリのオリエンテーションは私自身の答えをチェックしてください

于 2012-09-22T03:23:32.233 に答える
1

UINavigationController私が考える最善の方法は、サブクラス化するのではなく、カテゴリを実行することです。UITabbarController

UINavigationController +Rotation.h

#import <UIKit/UIKit.h>

@interface UINavigationController (Rotation)

@end

UINavigationController +Rotation.m

#import "UINavigationController+Rotation.h"

@implementation UINavigationController (Rotation)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}


@end

すべてのコントローラーにこのカテゴリーをインポートさせてみてください。これは魅力のように機能します。コントローラーを回転させずに、回転する別のコントローラーを押すこともできます。

于 2012-10-30T16:22:37.423 に答える
0

addshouldAutorotateメソッドを試してください

于 2012-09-17T08:28:45.137 に答える
0

まず、アプリをモードのみで動作させるには、を返す必要がありますUIInterfaceOrientationMaskLandscape。ポートレートモードのみを維持したい場合は、正しく実行しています。

UISupportedInterfaceOrientationsInfo.plistにキーを追加し、アプリが保持する予定のインターフェースの向きの値を割り当てるだけです。

shouldAutoRotateまた、自動回転を完全に回避したい場合は、からfalseを返す必要があります。ただし、ここからtrueを返し、メソッドで正しい方向を指定することをお勧めしますsupportedInterfaceOrientations

于 2012-09-17T09:26:31.727 に答える
0

私はあなたと同じ状況にあります。あなたはすでに答えを受け入れたと思いますが、とにかく別の答えを追加したいと思いました。これが、新しいバージョンの回転システムが機能することを理解する方法です。ルートビューコントローラーは、これまでに呼び出された唯一のビューコントローラーです。理由は、子ビューコントローラでは、とにかくルートビューコントローラのフレーム内にとどまるため、ビューを回転させることはあまり意味がないということです。

だから、何が起こりますか。最初はルートビューコントローラshouldAutorotateで呼び出されます。が返されると、すべてが停止します。が返された場合、メソッドが呼び出されます。このメソッドでインターフェイスの向きが確認され Info.plistまたはアプリケーションデリゲートからグローバルにサポートされている向きが確認されると、ビューが回転します。ローテーションの前に、メソッドが照会されます。(デフォルト)の場合、すべての子は親と同様にメソッドとメソッドを受け取ります(そして、子はそれを子に転送します)。NOYESsupportedInterfaceOrientationsshouldAutomaticallyForwardRotationMethodsYESwilldidRotateTo...

私の解決策(より雄弁なものができるまで)は、メソッド中に最後の子View Controllerを照会し、supportedInterfaceOrientationsその値を返すことです。これにより、一部の領域を回転させながら、他の領域は縦向きのままにすることができます。壊れやすいことはわかっていますが、イベントの呼び出しやコールバックなどを複雑にすることを伴わない別の方法は見当たりません。

于 2012-09-24T05:00:01.000 に答える
0

を使用している場合は、のサブクラスUINavigationControllerを実装する必要があります。shouldAutorotatesupportedInterfaceOrientationsUINavigationController

これらは2つのステップで制御でき、shouldAutorotateYESを返した場合は有効supportedInterfaceOrientationsです。とてもいい組み合わせです。

この例では、CoverFlowViewとPreviewViewを除いて、ほとんどのビューはPortraitです。CoverFlowViewがPreviewViewに転送され、PreviewViewはCoverFlowCViewの回転を追跡したいと考えています。

@implementation MyNavigationController

-(BOOL)shouldAutorotate
{

if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"PreviewView")])

return NO;

else

return YES;

}



-(NSUInteger)supportedInterfaceOrientations

{

if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"CoverFlowView")])

return UIInterfaceOrientationMaskAllButUpsideDown;

else

return UIInterfaceOrientationMaskPortrait;

}

...

@end
于 2012-09-24T15:58:13.413 に答える
0

私の解決策:サブクラス化して次UINavigationControllerのように設定しますwindow.rootViewController

階層の最上位のビューコントローラーが方向を制御します。いくつかのコード例:サブクラス化されたUINavigationController

于 2012-10-01T01:56:10.387 に答える
0

UITabBarController内でUINavigationControllersを使用しているため、切り取って貼り付けるだけでは機能しませんでしたが、ここでの回答は正しい方向を示していました。したがって、AppDelegate.mの私のバージョンは次のようになります。これは、UITabBarController内のUITabBarControllers、UINavigationControllers、またはUINavigationControllersで機能します。他のカスタム封じ込めコントローラーを使用している場合は、ここに追加する必要があります(これはちょっと残念です)。

- (UIViewController*)terminalViewController:(UIViewController*)viewController
{
  if ([viewController isKindOfClass:[UITabBarController class]])
  {
    viewController = [(UITabBarController*)viewController selectedViewController];
    viewController = [self terminalViewController:viewController];
  }
  else if ([viewController isKindOfClass:[UINavigationController class]])
  {
    viewController = [[(UINavigationController*)viewController viewControllers] lastObject];
  }

  return viewController;
}

- (NSUInteger)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
  NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
  UIViewController* viewController = [self terminalViewController:window.rootViewController];

  if (viewController)
    orientations = [viewController supportedInterfaceOrientations];

  return orientations;
}

注意すべきもう1つの重要な点は、UIViewControllerサブクラスでsupportedInterfaceOrientationsをオーバーライドする必要があることです。そうしないと、デフォルトでInfo.plistで指定したものになります。

于 2013-02-02T03:36:36.393 に答える