1

直接参考这个问题:

如何在 iPhone 的横向模式下停止 ABPersonViewController 和 ABNewPersonViewController 的旋转

当我不是推动视图控制器的人时,如何防止此屏幕在 iOS 6 中旋转?场景是我创建了一个新联系人,然后用户按下“创建新联系人”或“添加到现有联系人”按钮。生成的屏幕是 ABNewPersonViewController 但因为我无法直接访问旋转方法,所以无法阻止它旋转。

截屏:

在此处输入图像描述

上图取自 的子类ABUnknownPersonViewController,在这个子类中,我实现的唯一功能是重写旋转方法,如下所示:

- (BOOL)shouldAutorotate
{
    return NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait)
        return YES;

    return NO;
}

但是,问题是,当按下上图中的一个按钮以覆盖 iOS 6 上的旋转时,我无法将ABNewPersonViewController按下的屏幕子类化。关于如何合法访问这些按钮或覆盖旋转的任何想法在被推动以防止它这样做的屏幕上?

更新 1:

我试图在ABNewPersonViewControllerand上创建一个ABUnknownPersonViewController覆盖旋转方法的类别(我知道,这并不理想),然后全局导入,但这不起作用。除此之外,我完全不知道如何覆盖这种行为。有什么建议么?

更新 2:

是否可以获得对其中按钮的引用UITableView并覆盖它们调用的方法?或者访问私有 API 是否违反了 Apple 条款?到目前为止,试图调查这种方法并没有真正取得任何进展。

4

3 回答 3

6

在 iOS 6 上,旋转处理发生了变化。有两个选项可以防止旋转:

  1. 您可以在 Info.plist 中将整个应用设置为仅支持纵向。
  2. 您可以覆盖应用程序委托中的方法:

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    

    因为每当方向改变或新的视图控制器被推送时,你的委托都会调用该方法,你甚至可以使用它来临时禁用横向显示:

    // In AppDelegate.h:
    @property (nonatomic) BOOL portraitOnly;
    
    // In AppDelegate.m:
    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        return _portraitOnly ? UIInterfaceOrientationMaskPortrait : UIInterfaceOrientationMaskAllButUpsideDown;
    }
    
    // to switch to portrait only:
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES;
    
    // to switch back to allowing landscape orientations as well:
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO;
    

这两种方法对于 App Store 提交都是完全可以接受的,因为它们只使用已发布和记录的行为。

于 2013-04-23T16:10:14.467 回答
1

离开 Tammo Freese 的答案。我假设需要允许横向的视图在视图堆栈中低于您的自定义 ABUnknownPersonViewController。如果是这样,在你的 ABUnknownPersonViewController 子类中添加这个

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES;
}
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:(BOOL)animated];    
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO;
}
于 2013-04-22T22:47:12.930 回答
0

在 iOS 6 中,视图控制器允许旋转的方向由最顶层的全屏视图控制器控制,并且视图控制器层次结构中不再调用自动旋转方法。

不要创建 ABPersonViewController 的子类,而是使用以下代码创建 UINavigationController 的子类:

- (BOOL)shouldAutorotate
{
    return NO;
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}


- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

在为您呈现的 ABPersonViewController 创建 UINavigationController 时使用这个新的子类。如果 UINavigationController 没有以模态方式呈现(而是嵌套在 UITabBarController 或其他视图控制器中),您还需要将这些方法也放入该视图控制器中。

于 2013-04-23T18:32:45.150 回答