2

コントローラーから UIActivityViewController を提示しています。回転で問題が発生しました。いくつかのデータ共有オプション、たとえば「メール」を選択すると、メール作成ビュー コントローラーが表示されます。しかし、後でデバイスを回転させてメール コントローラーを閉じると、VC は現在の向きに回転しません。UIActivityViewController の完了ハンドラーを次のように設定しようとしました。

1)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
            [UIViewController attemptRotationToDeviceOrientation];
        }];

また

2)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
        UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        [self layoutForInterfaceOrientation:currentOrientation];
    }];

最初の解決策はまったく役に立ちませんでした。2 番目の解決策では、ナビゲーション バーを回転させずに残しました (高さが 12 ポイント違います)。

この場合の対処法を教えてください。

4

3 に答える 3

0

問題を解決しました。まず第一に、現在のデバイスの向きとメールを表示する前の状態に関係なく、MailComposeVC が閉じられた後、私の VC は常に縦向きに回転されます...そして、MailComposeVC がオンのときに自動回転中に呼び出される唯一の VC メソッドです。画面がございますviewWillLayoutSubviews/viewDidLayoutSubviews。(willAnimateRotationToInterfaceOrientationは呼び出されません!) そこで、ナビゲーション バーをリセットして高さを元に戻し、VC が非表示の場合はカスタム レイアウト メソッドを呼び出します。

(void) viewDidLayoutSubviews {
    // HACK: forcing the bars to refresh themselves - this helps to get the shorter version when switching to landscape and the taller one when going back!!!
    if (amIhidden) { 
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        [self.navigationController setNavigationBarHidden:NO animated:NO];
        UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        [self layoutForInterfaceOrientation:currentOrientation];
    }
}

amIhidden BOOL次のように、MailComposeViewController を提示するときに設定されます。

UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                                        initWithActivityItems:@[self]
                                                        applicationActivities:nil];
amIhidden = YES;
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed){
        amIhidden = NO;
}];
[self presentViewController:activityViewController animated:YES completion:nil];

私の解決策が他の誰かに役立つことを願っています!

于 2013-03-15T06:04:45.963 に答える
0

受け入れられた解決策があなたにとってうまくいかなかった場合(私のように)、簡単でクリーンな同様の質問に答えました。Objective c - UIActivityViewController 方向モード

于 2014-07-29T21:49:14.620 に答える
0

Swift 3で解決策を見つけました。しかし、Objective-Cでも機能するはずです。

AppDelegatefunctionで、application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask特定のビュー コントローラーの正しい向きを返します。

トリッキーな部分は、向きの基にしたいView Controllerを掘り出さなければならないことです。私の場合のように、 whenUIActivityViewControllerが提示され、window?.currentViewController()window?.topMostController()are both UIActivityViewController. 他の場所で使っUIActivityViewControllerているので手がかりにはなりません。次に、確認window?.currentViewController()?.presentingViewControllerしたところ、UINavigationController. 私がベースにしたいView Controllerがその最上位のView Controllerであることを知っているのでUINavigationController、私の解決策は次のとおりです。

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    if window?.currentViewController() is MyLandscapeViewController{
        return [UIInterfaceOrientationMask.landscapeLeft, UIInterfaceOrientationMask.landscapeRight]
    }

    if let presenting = window?.currentViewController()?.presentingViewController{
        if let nav = presenting as? UINavigationController{
            if nav.topViewController is MyLandscapeViewController{
                return [UIInterfaceOrientationMask.landscapeLeft, UIInterfaceOrientationMask.landscapeRight]
            }
        }
    }

    return UIInterfaceOrientationMask.portrait;
}

このコードを使用すると、MyLandscapeViewController が表示されたときに共有オプションが選択された後、画面は縦向きに回転しなくなり、横向きのままになります。

于 2017-04-06T07:45:38.910 に答える