3

아이폰에있는 창 전체를 차지하는 UIView가 있습니다. 그것이 풍경으로 회전 할 때, 내가 기대할 것 인 것처럼, 그것이 제자리에 짤깍 소리를 낼 때까지 가장자리는 작은 검은 막대를 얻는다.검정색 막대없이 UIView를 회전 할 수 있습니까?

나는 그 uiview를 화면보다 크게 만들고 싶습니다. 회전 시키면 검은 색 막대는 보이지 않지만 일반적으로 화면이 보이지 않는 부분을 보여줍니다. 나는 프레임과 뷰의 경계를 증가 시키려고 시도했지만 트릭을 수행하지 않는 것 같습니다.

이 작업을 성공적으로 완료 한 사람이 있습니까?

답변

2

이렇게하려면 두 가지 작업을 수행해야합니다.

먼저, 창 루트보기 컨트롤러는 항상 창의 크기를보기의 크기로 조정합니다. 따라서 큰 뷰는 루트 뷰 컨트롤러 뷰의 하위 뷰일 필요가 있습니다 (루트 뷰 컨트롤러의 뷰 크기를 줄이기 위해). 루트 뷰 컨트롤러의 뷰는 clipsToBounds을 NO로 설정해야합니다. 실제로 큰보기의 모든 조상은 clipsToBounds을 아니오로 설정해야합니다.

둘째, 창을 회전하면 자체적으로 검은 색 하위보기를 제공하여 그렇지 않으면 창 경계 외부에 표시되는보기를 명시 적으로 숨 깁니다. 이 검은 서브 뷰를 루트 뷰 컨트롤러의 뷰 앞에 놓습니다. 다음과 같이 루트보기 컨트롤러의 뷰를 앞으로 이동해야합니다.

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

두 개의 UIWindow가 겹칠 때 작동하는 다른 방법이 있습니다. 회전 가능한 인터페이스가 위에 떠있는 상태에서 백그라운드에서 회전 할 수없는 내용을 원할 경우이 경우가 있습니다. 생각은 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

0

현재 표준 속도보다 느린 속도로 화면을 회전해야하는 앱을 개발 중입니다. 내 자신의 회전이 시작되기 전에 (표준 회전 속도로)보기를 잘라내는 검은 색 회전 사각형을 중지하려면 일반 -> 배포 정보 -> 전체 화면 필요 옆의 상자를 선택하기 만하면됩니다.

enter image description here

나는 또한 숨기기 상태 표시 줄의 상자를 선택하지 않지만 뷰 컨트롤러에 숨겨진 상태 표시 줄이 없습니다.

0

UINavigationController 및 UITabBarController에는 모두 layer.masksToBounds가 기본적으로 YES로 설정된 시스템 하위 뷰 (UINavigationController : UINavigationTransitionView, UITabBarController : UITransitionView 및 UIViewControllerWrapperView)가 있습니다. 회전 중에 검은 색 가장자리를 제거하려면이 모든 레이어 뷰의 layer.masksToBounds를 NO로 설정해야합니다.

그러나 위에서 언급 한 시스템 뷰의 레이어를 변경하면 어떤 영향을 미치는지 확실하지 않으므로 일단 애니메이션을 완성하면 layer.masksToBounds를 다시 초기화하는 것이 좋습니다.

관련 문제