我有一個UIView,佔用iPhone上的整個窗口。當它旋轉到風景時,邊緣會得到小黑條,直到它卡入到位,就像我期望的那樣。我可以在沒有黑條的情況下旋轉UIView嗎?
我想使uiview大於屏幕,以便旋轉它不會顯示那些黑條,但會顯示視圖中通常不在屏幕上的部分。我試圖增加視圖的框架和範圍,但似乎並沒有這樣做。
有沒有人成功做過這件事?
我有一個UIView,佔用iPhone上的整個窗口。當它旋轉到風景時,邊緣會得到小黑條,直到它卡入到位,就像我期望的那樣。我可以在沒有黑條的情況下旋轉UIView嗎?
我想使uiview大於屏幕,以便旋轉它不會顯示那些黑條,但會顯示視圖中通常不在屏幕上的部分。我試圖增加視圖的框架和範圍,但似乎並沒有這樣做。
有沒有人成功做過這件事?
您需要做兩件事才能做到這一點。
首先,窗口的根視圖控制器將始終將其視圖的大小調整爲窗口的大小。因此,您的大視圖需要是根視圖控制器視圖的子視圖(以防止它被調整大小),並且您的根視圖控制器的視圖需要將clipsToBounds
設置爲NO。事實上,所有的大觀點的祖先都需要將clipsToBounds
設置爲NO。
其次,當窗口旋轉時,它會給自己的黑色子視圖顯式隱藏任何視圖,否則會出現在窗口的邊界之外。它將這些黑色子視圖放在其根視圖控制器視圖的前面。您需要將根視圖控制器的視圖移動到前面,這樣的:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
UIWindow *window = self.view.window;
[window bringSubviewToFront:window.rootViewController.view];
}
我發現當你有兩個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;
}
}
}
}
UINavigationController和UITabBarController都具有默認情況下將layer.masksToBounds設置爲YES的系統子視圖(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionView和UIViewControllerWrapperView)。爲了消除旋轉過程中的黑色邊緣,您必須將這些和所有其他層次視圖的layer.masksToBounds設置爲NO。
但是,我不確定更改上述系統視圖圖層的效果是什麼,所以我建議您在完成動畫後將其layer.masksToBounds重置爲YES。
這對我很好。 – David 2014-08-25 16:19:54