2017-04-20 12 views
5

ポートレートと風景の両方向をサポートするアプリケーションです。風景モードで表示されたときにUIViewControllerが正しく表示されない

self.modalViewController = [[ModalViewController alloc] init]; 

[self presentViewController:self.modalViewController animated:YES completion:^{ 

}]; 

ModalViewControllerが唯一の風景の中に、ユーザによって見られるべきコントローラです:私は、次のコードを使用してUITabBarControllerに位置のUIViewControllerからモーダルのUIViewControllerを提示しています。それは、LandscapeRightをLandscapeLeftに回転することができるはずです。これは次のようになります。

@implementation ModalViewController 

#pragma mark - UIViewController - Orientation 

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

#pragma mark - NSObject 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor greenColor]; 
} 

#pragma mark - UIViewController - Status Bar 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

@end 

コントローラーは、左側からスライドし、画面の95%を完全にカバーします。しかし、時間の5%は、それは下からスライドし、画面の上半分のみをカバーします。ここで

は、それがうまく働いているとき、それはどのように見えるかです:

enter image description here

をそしてここでそれがうまく機能していないとき、それはどのように見えるかです:

enter image description here

は私がすることができますサンプルプロジェクトを作成しましたここにあります:https://github.com/TitouanVanBelle/Bug

lpは問題を再現しますが、動作することはめったにありません。

これはなぜ起こっているのですか?

+1

これを投稿していただきありがとうございます。また、解決策を探しています – sage444

答えて

0

あなたのアプリケーションは、縦向き、横長、横向きのいずれの向きにも対応しています。

方法以下ModalViewController.m更新で

-

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape|UIInterfaceOrientationMaskPortrait; 
} 

あなたModelViewControllerだけので、この問題を横向きを支援しています。

代わりのUIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortraitあなたにもUIInterfaceOrientationMaskAllButUpsideDownを使用することができます。あなたの要件ごとにあなたがModalViewController.mに次のコードを更新することによって、現在の向きを回転させることができ

EDIT 1

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor greenColor]; 

    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 
} 
+0

しかし、ユーザーはModalViewControllerを横向きと縦向きで表示することができ、私は望んでいません。私は彼らに風景モードでそれを見てほしいだけです –

+0

ああ..あなたの質問からはっきりしていませんでした。私の答えを更新する時間をください。 –

+0

Ok。質問を編集します。 –

0

これはコメントである必要がありますが、私は評判が十分ではないので、答えてください。

私は似たようなエラーを見たと思います。

viewDidLoadが呼び出されてもそれがまだポートフォリオになっていたが、その後、ランドスケープに変更され、適切なリスナーが適切に応答しなかった(遷移アニメーションの状態が "進行中"?)。

それを修正する方法についていくつかのアイデア:

  • は、姿勢変更通知に耳を傾け、現在の向きを現在の向きが縦
  • 場合はfalseを返す自動回転すべきで風景
  • ときに、明示的にself.view.setNeedsLayoutを呼び出します

希望します。

+0

私はshouldAutorotateでNOを返そうとしましたが、問題は解決しません。私は最初の解決策を試してみましょう。ありがとう –

+0

[self.view setNeedsLayout]を呼び出しても問題を再現できました。 –

0

私はちょうど同じを実装しようとしました。私はあなたの質問から理解しているのは、モデルVCをランドスケープモードでのみ表示したいということです。ここにソリューションがあります

1)モデルVCにプレゼンテーションスタイルを追加して、ボトムまたはハーフスクリーンから表示されないようにします。モデルのVCで

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated];  
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), 
    dispatch_get_main_queue(), ^{ 
     self.modalViewController = [[ModalViewController alloc] init]; 
     self.modalViewController.modalPresentationStyle = UIModalPresentationFullScreen; 

     NSAssert([NSThread currentThread] == [NSThread mainThread], @"FAIL"); 

     [self presentViewController:self.modalViewController animated:YES completion:^{}]; 
    }); 
} 

2)は、それが可能になるので、モデルVCにビューを追加回転の明確なアイデアを取得するには、この

-(UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
} 

3)にovveridenメソッドsupportedInterfaceOrientationsを変更するには、次のFirstViewControllerコードを交換ビューが回転しているかどうかを確認します。アプリを開こうと今、このすべてを行った後に、それは回転のいずれかの風景の中に左または右しかしpotraitモードがなることができる唯一のランドスケープモードでのモデルのVCを開きます

-(void)viewDidLoad  
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor greenColor]; 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 100)]; 
    view.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:view]; 
} 

モデルVCに次のコードを追加します。無効にする。

+0

この問題を解決するには、このソリューションを使用します。 –

関連する問題