0

事情是这样的,我必须将增强现实功能集成到应用程序中。在测试它之后,现在我准备集成它。该应用程序始终以纵向运行,我决定在横向向右或向左旋转 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!
4

2 回答 2

1

我的错我在这里没有解决方案。

我使用了调试器和断点并重复了关键序列,我发现我没有进入:

- (void)deviceOrientationDidChange:(NSNotification *)notification

了。所以这是我第一次看到这样的事情,设备方向变化的监听器突然停止触发。因此,我的解决方案非常残酷,但至少它具有停止问题的优点,就在检测到设备方向变化后,我停止了侦听器:

if (orientation == UIDeviceOrientationLandscapeLeft) {
        NSLog(@"ViewController Landscape left");
        [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
        [self setCameraViewController:arVC];
        arVC = nil;
        [cameraViewController setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
        [[super navigationController] presentModalViewController:cameraViewController animated:YES];
}

每次我使用 viewController(调用视图控制器)时,我都会重新初始化监听器,这意味着viewDidAppear:

// Listen for changes in device orientation
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

现在它已经解决了,但我不得不承认我对找到这种解决方案感到失望。

于 2012-10-25T10:09:32.110 回答
0

好吧,我以前从未使用过 ARC,但根据我所看到的,每次更改方向(在横向上)时都会初始化一个 ARViewController。为什么不永久实例化 2 ARViewController,并且每次都调用它们呢?

除非您确定每次切换到纵向时都会释放这些内容。

另外,你为什么不直接使用pushViewController:animated:

最后一件事,您将ModalViewController 呈现给您的navigationController,但您在[super presentingViewController] 中将其关闭,也许您可​​以添加这个?

于 2012-10-24T15:16:53.300 回答