1

我正在尝试为 iOS 6 更新我的应用程序,主要挑战是处理自动旋转。有与该主题相关的问题和搜索结果,但没有一个可以直接回答我的问题。我理解弃用和shouldAutorotateToInterfaceOrientation:替换它- 这个问题与那些没有直接关系。supportedInterfaceOrientationsshouldAutorotate

相反,我有兴趣知道如何替换willAutorotateToInterfaceOrientation:duration:,这是我的应用程序处理几乎所有旋转动画和布局重组的地方。我的主视图控制器控制一个全屏视图,该视图在启动时添加到主窗口,并处理应用程序的整个内部布局,这有点复杂。此视图控制器中的willAutorotateToInterfaceOrientation:duration:方法直接调整某些子视图的大小并调用处理其他子视图的 C++ 对象。由于界面的可变性,其中包括复杂的子视图层次结构,一些不调整大小,一些不在屏幕上等等,我不认为 Apple 的自动调整掩码提供了足够强大的解决方案来处理这种自动旋转.

有什么方法可以像我现在一样采取行动willAutorotateToInterfaceOrientation:duration:吗?正如我在网上和通过实验发现的那样,这个方法didRotateFromInterfaceOrientation:从来没有在我的 iOS 6 的主视图控制器中调用过。我还发现它viewWillLayoutSubviews从来没有被调用过,尽管我怀疑它无论如何都不能完全满足我的需要。

如果您需要任何进一步的信息,请告诉我。我希望有一个相当简单的解决方案来解决这个问题,这不是苹果在开发人员不符合新的、更窄的协议的情况下抛弃他们的例子。

编辑:如果这有助于澄清,这是我正在谈论的功能的基本外壳:

AppDelegate.mm中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self.window makeKeyAndVisible];
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]];
    [self.window addSubview:mainViewController.view];
    return YES;
}

MainViewController.mm

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    [UIView beginAnimations:NULL context:nil];
    [UIView setAnimationDuration:duration];
    [someViewController someMethod];
    [someView setFrame:someRect];
    [UIView commitAnimations];

    someObject->CustomRotationFunction( toInterfaceOrientation, duration );
}

一般来说,假设这些函数和方法中发生的事情是最坏的,例如someObject拥有改变其框架的视图,它拥有拥有改变其框架的视图的其他对象,等等。

4

1 回答 1

3

您的主要问题是您只是将 ViewController 的视图添加到窗口中,而不是将其设置为 rootViewController。这就是为什么在 iOS6 中从不调用 willRotateToInterfaceOrientation、didRotateToInterfaceOrientation 等的原因。

在 iOS5 中,shouldAutorotateToInterfaceOrientation 被传递给窗口上的 ViewController 的每个 childViewController,然后可以返回您是否要旋转。在 iOS6 中,rootViewController 决定您的应用程序是否支持某个方向。所以你需要在 iOS6 中设置一个 rootViewController,最好在早期的 iO​​S 版本中这样做。然后将在正确的时间调用您需要的方法,并将其传递给任何 childViewControllers。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self.window makeKeyAndVisible];
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]];
    self.window.rootViewController = mainViewController;
    return YES;
}
于 2012-10-26T09:57:37.470 回答