当界面方向颠倒时呈现视图控制器

Posted

技术标签:

【中文标题】当界面方向颠倒时呈现视图控制器【英文标题】:Presenting a View Controller when the Interface Orientation is Upside Down 【发布时间】:2014-04-23 15:42:53 【问题描述】:

我的 iPhone 应用支持倒置界面方向: 当用户将手机倒置时(使主页按钮在顶部),整个用户界面会垂直翻转。

但是,当尝试从我的视图控制器 A 呈现一些视图控制器 B 时会出现问题(在本例中,我呈现标准的邮件编写器视图控制器):

- (IBAction)buttonTapped:(id)sender 

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

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


当这个方法被触发时,首先发生的事情是(蓝色)视图控制器 A 立即垂直翻转而没有动画,无论出于何种原因(如第一个屏幕截图所示)→ 为什么?

接下来呈现的视图控制器B从底部移入视图(应该如此)。

当关闭视图控制器 B 时,它会立即翻转并移出视图到顶部(而不是它来自的方向,如第二个屏幕截图所示)。

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

这是 iOS 中的错误吗?或者我该如何避免这种奇怪的行为?

(我只想要与普通纵向模式相同的标准动画来呈现视图控制器 - 没有这些翻转。)

【问题讨论】:

【参考方案1】:

我猜MFMailComposeViewController 不支持颠倒的界面方向,这就是它可能被解释为错误的原因。 Apple 建议不要对 iPhone 应用使用颠倒的界面方向。主要原因可以用这样的例子来解释:

    用户打开应用程序并将 iPhone 旋转到倒置方向。 此时有人打电话给他。 用户尝试接听电话却忘记将手机旋转到默认纵向。 因此 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 应用程序审批中心导致覆盖类别中现有方法的原因。

【讨论】:

这些是反对使用倒置方向的好点。但我的应用程序应该与只能连接到 iPhone 底部的麦克风一起使用。因此,为了将应用程序用于其目的,用户必须旋转 iPhone。 @Mischa 我已经用代码更新了我的答案,如果应用程序处于颠倒方向,MFMailComposeViewController 可以正确打开。 有趣的是,我尝试了同样的事情,对MFMailComposeViewController 进行子类化,而不是为它创建一个类别,并且出于某种原因不起作用。您的解决方案效果很好。非常感谢!

以上是关于当界面方向颠倒时呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中呈现的视图控制器中的界面方向不正确

更改父视图控制器的界面方向

呈现视图控制器中的方向更改未更新父视图控制器

呈现的视图控制器如何从当前方向(尤其是横向)初始化?

横向 IOS 应用程序在呈现模态视图控制器时抛出异常

iPad 模态视图控制器以纵向动作,即使它是横向的