2012-10-03 12 views
11

iPadプロジェクトをXCode 4.5で開いたところです。私のアプリは、風景モードで実行するように設計されています。これは、以前のバージョンのXCodeで完全に機能します。しかし、XCode 4.5では、画面の右側の空の領域で90°回転しています(そして、私のビューは正しいサイズを持ちますが、画面から外れます)。それは次のようになります。XCode 4.5/iOS6:私のiPadアプリの向きに関する問題

The view (red) rotated of 90° and going of the screen in landscape mode

I以下の記事をチェックしますが助けにはならなかった。

orientation issue in ios6

ios6 Rotation issue from landscape to portrait mode

Set orientation to landscape mode in xcode 4.5 GM IOS 6

誰もがこの問題を持っていましたか?

助けていただけたら幸いです!

+0

チェックは、あなたのInfo.plistに姿勢を支持しました。 – endy

+0

がiOS 5.1シミュレータになっているかどうかを確認し、正しく動作しているかどうかを確認してください。そうであれば、iOS6と互換性のあるアプリケーションを作成するためのコードがあり、向きに使用したコードを貼り付けてください... –

+0

はいiOS 5.1のiPadシミュレータでうまくいきます。この問題は、iOS 6 iPadシミュレータ(デバイスと同じ回転の問題)で発生します。私は空のプロジェクトから再開してコードを転送し、潜在的にxibを作り直すつもりだと思っています... iOS6では回転を管理するためのコードを書き留めるコードが廃止される予定です。私はあなたに今すぐお付き合いします...すべてのこの狂気の仕事のためにアップルに感謝!! –

答えて

6

お返事ありがとうございます。私はついに解決策を見つけました。

まず、すべての起動イメージがターゲットサマリーメニュー(プロジェクトの青いアイコン=>ターゲット=>サマリー=>下部のスクロール)で正しい向きと正しいサイズであることを確認します。サイズや向きが正しくない場合は、正しく設定されていない起動イメージについての警告が表示されます。

  • RootViewController.hとの.m
  • MainWindow-Iphone.xibMainWindow-iPad.xibRootViewControllerがリンクされて

    • AppDelegate.hとの.m:今まで

      、私はこのような構造を持つプロジェクト(旧XCodeのファッションを)持っていましたInterface Builderで、RootViewControllerを基準にした黄色/茶色のアイコン(内側が正方形)のスクリーンショットを参照してください。

    ここではそれがどのように見えるかのスクリーンショットを以下:

    My old project structure

    そしてここでapplicationDidFinishLaunching内のコードだったものです:私のAppDelegateの方法:私は何

    - (void)applicationDidFinishLaunching:(UIApplication *)application { 
    
        [window addSubview:[rootViewController view]]; 
        [window makeKeyAndVisible]; 
    
    } 
    

    がためにありますXCode 4.5で空のプロジェクトを作成したときに得られる構造に近い。その結果:

    1. 私は
    2. (それがどの画面のサイズに合うことを確認するために、明確に、より良い)MainWindow.xibMainWindow-iPad.xibを削除し、今プログラム的に私のウィンドウを作成した私は、「メインnibファイルのベース名」を削除し、私Info.plistで定義されている(とMainWindow.xibMainWindow-iPad.xibに設定)された「メインのnibファイルのベース名(アプリ)」キー
    3. 私は空RootViewController_iPhone.xibRootViewController_iPad.xib
    4. を追加しました私はでコードを変更このような方法:

      - (void)applicationDidFinishLaunching:(UIApplication *)application {  
      
      NSLog(@"applicationDidFinishLaunching"); 
      
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
      
      if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
          self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_iPhone" bundle:nil]; 
      } else { 
          self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_iPad" bundle:nil]; 
      } 
      
      self.window.rootViewController = self.rootViewController; 
      
      [self.window makeKeyAndVisible]; 
      

      }

    そして今は、すべてが正常に動作します!オリエンテーションはiPadで正しいです!私も、すべてのあなたの意見は、(iPhone 5の)全画面表示になることを確認するために、ところで

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    

    のような非推奨の方法を変更する必要はありませんでした:)前に、それは作るよりもはるかに明確ですあなたのビューがInterface Builderの "Scale to fill"モードに設定されていて、 "Autoresize subviews"がクリックされていることを確認してください。あなたのビューの一部がフルスクリーンに拡大しない場合は、コントローラ/ビューを作成する順番が原因である可能性があります(スーパービューはスーパービューが作成されたときにのみサブビューに通知します)。これを簡単に解決するために、単に- (void)viewDidLoad methodで次のコードを追加します

    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
        [self.view setFrame:CGRectMake(0,0,screenBounds.size.width,screenBounds.size.height)]; 
    

    または使用:

    [self presentModalViewController:myViewController animated:TRUE]; 
    

    の代わりに:

    [self.view.superview addSubview:myViewController.view]; 
    

    presentModalViewControllerが実際サブビューにサイズ変更通知を送信します。

    願っています。

  • +2

    ありがとう! 'self.window.rootViewController = rootViewController;'を追加して正常に動作します! –

    +0

    これも私にとっては十分でした。そして、それはまた、一般的なエラーを取り除く "アプリケーションは、ルートビューコントローラを持っているはずだ..." – Totoro

    +0

    @ SergeyKopanev - これも私のために働いた。私は単純に 'self.window.rootViewController = viewController;'をapplicationDidFinishLaunchingの最後に追加しました。ありがとう – jsherk

    4

    window.rootViewControllerも設定していることを確認してください。私は同じ問題がありましたが、この行は私のために修正しました:

    MainViewController *mainView = [[MainViewController alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.rootViewController = mainView; 
    
    0

    アップグレードしたアプリでも同様の問題がありました。私はそれが文書化されたことを発見していないが、それは変更されているようです。私が見つけたのは、新しいウィンドウが、回転とサイズについてキーと目に見えるようになるまで知りませんでした。私はフレーム設定をmakeKeyAndVisibleの直後に移動してすべてを動かすことができました。それがあなたを助けることを願っています

    0
    [[yourViewController view] setFrame:CGRectMake(0.0, 0.0, 1024.0, 768.0)]; 
    [[yourViewController view] setTransform:CGAffineTransformTranslate(CGAffineTransformMakeRotation(0.5*M_PI),128.0,128.0)]; 
    
    0

    ストーリーボードを使用している場合は、loadViewメソッドを使用するのが簡単です。これは、viewDidLoadの前に呼び出されます。ストーリーボードに移動して、loadViewでプログラムで作成するときに、関連するビューを削除してください。次に、View Controllerクラスに戻り、次のコードをコピーします。

    - (void)loadView 
    { 
        // You can adjust the view size and location here. If using full screen use the following code. If you have a tab bar for example and also want to account for the top default iPad bar, use: CGRectMake(0, 20, 1024, 699) instead. 
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 748)]; 
        view.backgroundColor = [UIColor whiteColor]; 
        view.autoresizesSubviews = NO; 
    
        self.view = view; 
    } 
    
    0

    いくつかの簡単な手順で問題が解決します。

    まず、AppViewerate.mで、rootViewControllerをサブビューとして追加しているかどうかを確認します。それはあなたのルートビューコントローラとしてナビゲーションコントローラを設定している場合

    - (void)applicationDidFinishLaunching:(UIApplication *)application { 
    
    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 
    
    } 
    

    この

    - (void)applicationDidFinishLaunching:(UIApplication *)application { 
    
    window.rootViewController = navigationController; 
    [window makeKeyAndVisible]; 
    
    } 
    

    ような何かを、これに代えて、です。あなたはnavigationControllerの内回転方式の制御を取得する必要がある場合

    第二に、そのようにUINavigationControllerのカテゴリを作成し、viewControllersをプッシュ:

    #import "UINavigationController+Rotation.h" 
    
    @implementation UINavigationController (Rotation) 
    
    - (BOOL)shouldAutorotate { 
    
        BOOL result = self.topViewController.shouldAutorotate; 
    
        return result; 
    } 
    
    - (NSUInteger)supportedInterfaceOrientations { 
    
        return self.topViewController.supportedInterfaceOrientations; 
    } 
    
    @end 
    

    、iOSの6のためにこれら二つのオリエンテーション方法を上向きに

    - (BOOL)shouldAutorotate
    - (NSUInteger)supportedInterfaceOrientations

    がクラス内で呼び出されます。

    などの古い回転方法は、これが必要である - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    がだから、最後のiOS 6

    から廃止されています、ビューコントローラにこれらを実装する必要があります。

    -(BOOL)shouldAutorotate 
        { 
         return YES; 
        } 
    
    -(NSUInteger)supportedInterfaceOrientations 
    { 
        return UIInterfaceOrientationMaskAll; 
    } 
    

    ビューコントローラがすべての向きを回転してサポートできるようにする場合は、

    他の配向マスクは、次のとおり

    1. UIInterfaceOrientationMaskPortrait
    2. UIInterfaceOrientationMaskLandscapeLeft
    3. UIInterfaceOrientationMaskLandscapeRight
    4. UIInterfaceOrientationMaskPortraitUpsideDown
    5. UIInterfaceOrientationMaskLandscape
    6. UIInterfaceOrientationMaskAllButUpsideDown