UIWindow旋转屏幕出现四个黑框

487 阅读1分钟

前言

Xcode、OC
常见解决方法对UIWindow使用clipsToBounds剪切即可,但总有些需求可能导致视图出现在UIWindow之外,需要保留视图的显示,可以参考文本方法实现不剪切的UIWindow。

视图层级

在旋转的时候会出现黑框,我们分别在未旋转和旋转的时候,进行Xcode调试,分析层级。
结果如图:
截屏2024-09-21 16.07.00.png 截屏2024-09-21 16.06.01.png 无须多言,明晃晃四个UIView,因此尝试对这四个UIView进行隐藏,看是否能够解决这个问题。

具体解决

viewWillTransitionToSize:withTransitionCoordinator: 是一个 UIViewController 的方法,用于在视图控制器的视图大小发生变化时执行自定义动画和布局调整。这个方法在设备旋转或分屏模式下被调用。可以通过 coordinator 来执行动画和响应过渡。

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context){
        UIWindow * selfWindow = yourWindow; // 自己的winodw
        for (UIView * view in selfWindow.subviews) {
            Class c_a = NSClassFromString(@"UITransitionView");
            Class c_d = NSClassFromString(@"UIDropShadowView");
            if ([view isKindOfClass:c_a]) {
                for (UIView * subView in view.subviews) {
                    if(![subView isKindOfClass:c_d]){
                        for (UIView *subSubView in subView.subviews) {
                            subView.hidden = YES;
                        }
                    }
                }
            }
        }
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context){}];
}