2

私の iPhone アプリは、逆さまのインターフェイスの向きをサポートしています。ユーザーが電話を逆さまにすると (ホーム ボタンが上になるように)、ユーザー インターフェイス全体が垂直に反転します。

ただし、ビュー コントローラーAからビュー コントローラーBを表示しようとすると問題が発生します(この例では、標準のメール コンポーザー ビュー コントローラーを表示します)。

- (IBAction)buttonTapped:(id)sender {

    MFMailComposeViewController *mailVC = [MFMailComposeViewController new];
    mailVC.mailComposeDelegate = self;

    [self presentViewController:mailVC animated:YES completion:nil];

}

このメソッドがトリガーされると、最初に (青の) ビュー コントローラーAが何らかの理由でアニメーションなしですぐに垂直方向に反転します (最初のスクリーンショットに見られるように) → なぜ?

次に、表示されたビュー コントローラーBが (あるべき姿で) 下からビューに移動します。

ビュー コントローラ B の提示

ビュー コントローラBを閉じると、瞬時に反転し、(2 番目のスクリーンショットに見られるように、元の方向ではなく) ビューから上に移動します。

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self dismissModalViewControllerAnimated:YES];
}

ビューコントローラーBを閉じる

これは iOS のバグですか、それともこの奇妙な動作を回避するにはどうすればよいですか?

(通常のポートレート モードと同じように、View Controller を表示するための同じ標準アニメーションのみが必要です。これらの反転は必要ありません。)

4

1 に答える 1

2

MFMailComposeViewController逆さまのインターフェイスの向きはサポートされていないため、バグとして解釈される可能性があると思います。ただし、 Apple は、iPhone アプリのインターフェイスの向きを逆さまにしないことを推奨しています。その主な理由は、次の例で説明できます。

  1. ユーザーはアプリケーションを開き、iPhone を上下逆さまに回転させます。
  2. この瞬間、誰かが彼に電話をかけます。
  3. ユーザーが通話に応答しようとして、電話機をデフォルトの縦向きに回転させるのを忘れています。
  4. その結果、iPhone のマイクはユーザーの耳の近くにあり、スピーカーは口の近くにあります。

ユーザーフレンドリーな体験ではありません。
私はあなたのサイトで逆さまの向きを使用するかどうかを考えていたでしょう.

ただし、逆さまのインターフェイスの向きを使用する必要がある場合は、次のようなトリックを
作成します。カテゴリを作成しMFMailComposeViewController、メソッドをオーバーライドsupportedInterfaceOrientationsして、必要な向きのサポートを許可し、それをクラスにインポートしMFMailComposeViewControllerます。

// MFMailComposeViewController+Orientation.h file
#import <MessageUI/MessageUI.h>

@interface MFMailComposeViewController (Orientation)

@end

// MFMailComposeViewController+Orientation.m file
#import "MFMailComposeViewController+Orientation.h"

@implementation MFMailComposeViewController (Orientation)

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

@end

注意:このトリックが、カテゴリ内の既存のメソッドをオーバーライドする中心的な原因を承認する Apple アプリケーションに渡されるかどうかはわかりません。

于 2014-04-23T16:33:32.920 に答える