事情是这样的,我必须将增强现实功能集成到应用程序中。在测试它之后,现在我准备集成它。该应用程序始终以纵向运行,我决定在横向向右或向左旋转 iPhone 时显示增强现实(当然,如果我返回纵向,则会显示原始视图控制器)。事实上,增强现实是模态呈现的。
我有 viewController 调用 ARViewController (模态)。如果我旋转 2 或 3 次,它工作正常,但是不再调用此 ARViewController,但应用程序仍在运行,没有崩溃,没有冻结。这个 ARViewController 是用 ARController 初始化的,这是一个计算增强现实所需的所有类的类。如果我在没有 ARController 的情况下调用此 ARViewcontroller,则视图控制器之间的切换工作得很好,将调用一个空白窗口,但至少我可以随心所欲地旋转设备。所以,这必须来自 ARController,我记录了自己的内存泄漏(顺便说一下我使用 ARC),我认为这可能是问题的原因,因为我多次使用这个 ARController。
但在更进一步之前,我想知道我是否做错了可能会通过在视图控制器之间切换来影响 ARController:
这是我在 viewController 中调用 ARViewController 的方式:
if (orientation == UIDeviceOrientationLandscapeLeft) {
NSLog(@"ViewController Landscape left");
ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
[self setCameraViewController:arVC];
[arVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
[[self navigationController] presentModalViewController:cameraViewController animated:YES];
arVC = nil;
}
else if (orientation == UIDeviceOrientationLandscapeRight) {
NSLog(@"ViewController Landscape Right");
ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
[self setCameraViewController:arVC];
[arVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
[[self navigationController] presentModalViewController:cameraViewController animated:YES];
arVC = nil;
}
ARViewController 的初始化:
- (void)viewDidLoad {
[super viewDidLoad];
self.arController = [[ARController alloc] initWithViewController:self];
arController.filterDiscover = filterDiscover;
arController.filterEat = filterEat;
arController.filterSleep = filterSleep;
// Listen for changes in device orientation
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
//if ViewController presents this modal ARViewController
if(!arController.filterDiscover && !arController.filterEat && !arController.filterSleep)
[arController callAlertViewToFilter];
else
[arController loadData];
}
最后,如果我在 ARViewController 中旋转到 Portrait,我将如何返回到原始视图控制器:
if (orientation == UIDeviceOrientationPortrait){
NSLog(@"ARViewController Portrait");
[self setArController:nil];
[[super presentingViewController] dismissModalViewControllerAnimated:YES];
}
我试图尽可能清楚,如果有人遇到过类似的问题,那么有一些线索可以解决这个问题。我本可以展示 ARController 的代码,但它有点太长了,现在我只想知道这里是否有什么问题。如果需要,我会展示它。
这可能会有所帮助,当 ARViewController 不再显示时,我在调试区域中找到了此输出:
2012-10-24 17:57:51.072 beiceland[20348:907] ViewController Landscape Right
2012-10-24 17:57:51.073 beiceland[20348:907] Warning: Attempt to present <ARViewController: 0x203f0c60> on <RevealController: 0x1cd5dca0> while a presentation is in progress!