3

我有一個UIView,佔用iPhone上的整個窗口。當它旋轉到風景時,邊緣會得到小黑條,直到它卡入到位,就像我期望的那樣。我可以在沒有黑條的情況下旋轉UIView嗎?

我想使uiview大於屏幕,以便旋轉它不會顯示那些黑條,但會顯示視圖中通常不在屏幕上的部分。我試圖增加視圖的框架和範圍,但似乎並沒有這樣做。

有沒有人成功做過這件事?

回答

2

您需要做兩件事才能做到這一點。

首先,窗口的根視圖控制器將始終將其視圖的大小調整爲窗口的大小。因此,您的大視圖需要是根視圖控制器視圖的子視圖(以防止它被調整大小),並且您的根視圖控制器的視圖需要將clipsToBounds設置爲NO。事實上,所有的大觀點的祖先都需要將clipsToBounds設置爲NO。

其次,當窗口旋轉時,它會給自己的黑色子視圖顯式隱藏任何視圖,否則會出現在窗口的邊界之外。它將這些黑色子視圖放在其根視圖控制器視圖的前面。您需要將根視圖控制器的視圖移動到前面,這樣的:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow *window = self.view.window; 
    [window bringSubviewToFront:window.rootViewController.view]; 
} 
2

我發現當你有兩個UIWindows重疊的工作的另一種方法。 (如果你想在背景中使用不旋轉的內容,可能會出現這種情況,可旋轉的界面會浮在頂部。)想法是在調用willAnimateRotationToInterfaceOrientation時,直接在最前面的UIWindow中搜索黑色條子視圖,並顯式隱藏它們。下面的代碼搜索兩層深:在所有需要的屏幕比標準速度較慢的旋轉的應用

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow* window = self.view.window; 
    for (UIView* view in [window subviews]) { 
     if (!CGRectIntersectsRect(window.bounds, view.frame)) { 
      view.hidden = YES; 
     } 

     for (UIView* view_ in [view subviews]) { 
      CGRect frame = [view_ convertRect:view_.frame toView:window]; 
      if (!CGRectIntersectsRect(window.bounds, frame)) { 
       view_.hidden = YES; 
      } 
     } 
    } 
} 
+0

這對我很好。 – David 2014-08-25 16:19:54

0

我目前的工作。爲了在我自己開始旋轉之前停止黑色旋轉矩形剪裁視圖(以標準旋轉速度),我只需選中常規 - >部署信息 - >需要全屏旁邊的框。

enter image description here

我也有隱藏在視圖控制器上雖然沒有選中隱藏狀態欄中的狀態欄。

0

UINavigationController和UITabBarController都具有默認情況下將layer.masksToBounds設置爲YES的系統子視圖(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionView和UIViewControllerWrapperView)。爲了消除旋轉過程中的黑色邊緣,您必須將這些和所有其他層次視圖的layer.masksToBounds設置爲NO。

但是,我不確定更改上述系統視圖圖層的效果是什麼,所以我建議您在完成動畫後將其layer.masksToBounds重置爲YES。

相關問題