1

横向きと縦向きの両方のビューでコンテンツを表示できるsecondViewControllerがあります。MainViewController(secondViewControllerの親)は、ランドスケープモードでのみコンテンツを表示できます。

SecondViewがポートレートモードでポップアウトされている場合、ビューMainViewController(コンテンツをランドスケープモードでのみ表示することになっています)はコンテンツをポートレートで表示します。ランドスケープモードには更新されません。

MainViewControllerにコンテンツを更新させる方法はありますか?

MainViewControllerのviewWillAppearメソッドに、setNeedsDisplayやlayoutSubviewsなどを追加しました。

-(void) viewWillAppear:(BOOL)animated {
    [self.view setNeedsDisplay];
    [self.view layoutIfNeeded];
    [self.view layoutSubviews];
}

しかし、それはビューをリロードしていません。ナビゲーションコントローラーのデリゲートメソッドであるwillShowViewControllerも試しましたが、機能しません。

4

2 に答える 2

1

アプリが適切な向き(この場合は横向き)でない限り、ユーザーが他のビューに「戻らない」ようにすることで、同様の問題を解決しました。できることは、独自の[戻る]ボタンを提供することです。ビューが縦向きの場合は、最初に横向きに回転してください(または、画面の下または上から小さなビューをアニメーション化することをお勧めします)というアラートをポップします。または、縦向きの戻るボタンを非表示にするか無効にします(ボタンを非表示にしました)。

いずれにせよ、電話がポートレートモードのときに、ユーザーが戻って横向きでビューを表示できるようにするのは、ひどいUIの選択です。

于 2012-07-18T22:45:12.253 に答える
1

ビューを削除して再度追加すると、機能するように見えます

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (UIDeviceOrientationIsPortrait(orientation)){        
    NSLog(@"force to landscape mode ");
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];
    [view removeFromSuperview];
    [window addSubview:view];        
}

CGAffineTransformMakeRotationを使用することもできますが、ナビゲーションコントローラーで回転が機能しません

    if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
        //[self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
    } else if (orientation == UIDeviceOrientationPortrait) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI/2.0)];
        //[self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
    }
于 2012-07-18T22:48:55.373 に答える