2012-10-24 109 views
0

這是事情,我必須將增強現實功能集成到應用程序中。經過測試,現在我已經準備好整合它了。該應用程序始終以縱向模式運行,我決定以橫向或左側旋轉iPhone時顯示增強現實(當然,如果我以縱向顯示原始視圖控制器,則返回)。事實上,增強現實是以模態方式呈現的。模態視圖控制器在呈現2/3次後不再呈現

我有viewController調用ARViewController(模態)。它可以正常工作,如果我旋轉2或3次,但這個ARViewController不再被調用,但應用程序仍在運行,沒有崩潰,沒有凍結。此ARViewController使用ARController進行初始化,ARController是增強現實所需的一類計算。如果我在沒有ARController的情況下調用這個ARViewcontroller,那麼在視圖控制器之間切換工作得很好,將會調用一個空白窗口,但至少我可以根據需要旋轉設備。所以,這必須來自ARController,我記錄了自己的內存泄漏(按照我使用ARC的方式),我認爲這可能是導致問題的原因,因爲我多次使用此ARController。

但在進一步,我想知道如果我做錯什麼,可以通過視圖控制器之間的切換影響ARController:

這裏是我所說的ARViewController中的viewController:

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:

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! 

回答

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]; 

那麼現在它的解決,但我不得不承認,我很失望,找到這樣一種解決方案。

0

嗯,我從來沒有使用ARC,但據我所看到的,你初始化每次更改方向時(橫向)ARViewController。爲什麼不實例化2 ARViewController並每次都調用它們?

除非您確定每次切換到肖像時都會釋放這些內容。

另外,你爲什麼不只是使用pushViewController:animated:

還有最後一件事,你向你的navigationController提供了ModalViewController,但是你在[super presentsViewController]中解僱了它,也許你可以添加這個呢?

+0

我試過pushViewController,起初它似乎是顯示AR的最明顯的方式。但由於我的應用程序只有肖像的方向限制(項目設置),當我顯示AR時,只有3/4的屏幕區域是活動的touchesBegan,奇怪...使用模態它工作正常。沒有它,我會使用pushViewController。對不起,我沒有得到你說的那些東西。 –

+0

對不起,我的意思是說,也許你可以發佈代碼[超級presentsViewController] – Snaker

+0

對不起,但唯一我發現足夠接近你的最新警告是[this](http://stackoverflow.com/questions/12596882/modal -uinavigationcontroller-hides-though-not-dismisses) – Snaker

相關問題