2012-04-07 209 views
11

我有一個通用的ipad/iphone應用程序,允許用戶觀看視頻,然後他們可以擴展到全屏模式。如何在全屏視頻後確保我的視圖正確定位?

我已經實現了(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration,並且在該方法中,我對視圖元素執行各種setFrame調用,具體取決於它們是橫向還是縱向。

這一切似乎在正常使用,即來回旋轉工作正常工作正常。

但是,如果用戶以縱向模式啓動,啓動視頻,進入全屏模式,轉變爲橫向模式,然後視頻停止 - 元素往往不能正確調整大小。它們的大小似乎仍然是縱向模式。

如果我然後轉到縱向模式,然後再轉回橫向,視圖將正確重置。

奇怪的部分是,我實施了(void)exitedFullscreen:(NSNotification*)notification,並在那裏打印出方向,並且正確地看到了它。我也打電話給我的代碼重置基於當前方向的視圖元素,我仍然有這個問題。

另一個相關的問題是,有時候在處理旋轉時,我的視圖最終會在屏幕上過高,實際上是在設備頂部的狀態欄下。

編輯這裏是最新的例子。在全屏視頻播放過程中,我旋轉到橫向模式,然後當我離開全屏視頻時,您可以在視圖頂部的導航欄中看到問題。

Navigation bar goes underneath status bar after rotation during full screen video.

回答

1

您的ViewController可能不會旋轉,因爲另一個控制器是第一響應者。你可以做什麼來避免這種情況是將視圖控制器註冊到設備旋轉變化,並在收到此類通知時調用您選擇器中的旋轉。

在的appDelegate:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

在您的視圖控制器

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil]; 

在沒有旋轉,你可以用

[[UIDevice currentDevice] orientation] 
+0

這有助於解決旋轉問題,同時我的視頻以內聯方式播放,但當視頻是全屏,旋轉和全屏顯示時,仍然遇到問題。有關問題的示例,請參閱附件截圖中的最新編輯。 – 2012-04-23 00:17:38

+0

我會獎勵你的答案/賞金,因爲看起來自從我做出改變以來,定位問題已經明顯改善。我想我剩下的唯一問題是在我退出全屏後,狀態欄下方的導航欄會完成,這可能完全是一個不同的問題。 – 2012-04-26 20:56:03

0

梅森,你有沒有記錄,並檢查是否你的方法willAnimateRotationToInterfaceOrientation:時間:獲取狀態轉換後,叫什麼名字?

+0

是的,它確實被調用。正如你在我的問題中看到的那樣,就輪換而言,大部分工作都是有效的。在電影播放過程中發生旋轉時,它大多似乎有問題。有時即使不全屏。 – 2012-04-20 15:15:03

+0

所以你說你的方法即使在問題出現之前就被調用,但由於該方法檢索到不正確的方向值「...你的視圖上的各種setFrame調用」被錯誤的輸入所愚弄? – buildingKofi 2012-04-22 14:12:14

+0

我已經進行了一些調試,以記錄所報告的方向,而且這似乎不是問題所在。當我收到輪換通知時,方向總是正確報告。 – 2012-04-23 00:21:04

0

如果有另一個控制器充當第一響應者,您的方向可能無法正確更新。要克服這一點的最好辦法是調用函數使用使用視圖控制器的當前方位的方法viewWillAppear:進行定向屏幕:[self interfaceOrientation]

如果你使用一個子類的子視圖,你可能需要重新實現methot layoutSubviews和調用setNeedsLayout。另一件可能導致這種情況的原因是,視頻控制器將視頻作爲第一響應者(如果您使用方法resignfirstresponder的地方進行搜索,並嘗試在沒有它的情況下如何工作)。如果這不起作用,我不知道,這件事情可能非常棘手,並取決於你如何實施它。但是對於你說的事情你應該不需要太多的代碼,因爲視圖自動旋轉和調整大小現在由視圖編輯器的大小檢查器處理。

我認爲這應該做。

+0

在退出全屏後,我已經調用了代碼來調整我的元素(在方向更改期間調用相同的代碼)。所以我不認爲就是這樣,但謝謝你的答覆。 – 2012-04-26 20:54:10

+0

我編輯了更多提示的回覆,如果這不起作用,我不知道。但正如我最後所說,視圖編輯器會處理自動調整大小,您不需要太多代碼來調整視頻視圖的大小,只需在大小檢查器中適當地配置視圖即可。 – 2012-04-27 09:17:22

0

對我來說,這個最新的截圖看起來並不像檢查方向方向改變問題。 導航欄基本上由狀態欄的高度決定。

可能是您的位置計算失敗,因爲您正在播放全屏視頻(沒有狀態欄)時使用視圖的框架 ,並且狀態欄返回時 立即失敗?

+0

感謝您的回覆。我用一些斷點測試了你的有關時間問題的理論。調整位置計算的代碼在全屏視頻模式後肯定會發生。 – 2012-04-26 20:40:04

1

位於視圖頂部的導航欄。我解決了它,使用此代碼 - >

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; 

你旋轉後使用此。

+0

感謝您的回覆。我在旋轉之後嘗試使用此代碼,在代碼段將代碼放置在新方向的視圖上,並且它看起來沒有任何效果。 – 2012-04-26 20:51:04