iOS 当前页面横屏,返回竖屏,防止动画以及闪动

@objc private func backAction() {
           guard !isTransitioningBack else { return }
           isTransitioningBack = true
           
           // 保存当前窗口快照,用于过渡时覆盖可能的闪烁
           let snapshot = view.window?.snapshotView(afterScreenUpdates: false)
           
           // 1. 完全禁用所有动画
           UIView.setAnimationsEnabled(false)
           
           // 2. 强制设置方向为竖屏
           if let window = UIApplication.shared.windows.first,
              let rootVC = window.rootViewController {
               // 临时修改根控制器支持的方向
               let tempVC = OrientationHelperViewController()
               window.rootViewController = tempVC
               window.rootViewController?.supportedInterfaceOrientations
               UIViewController.attemptRotationToDeviceOrientation()
               
               // 3. 执行返回操作
               if let nav = navigationController {
                   nav.popViewController(animated: false)
               } else {
                   dismiss(animated: false)
               }
               
               // 4. 恢复根控制器
               window.rootViewController = rootVC
               
               // 5. 如果有快照,添加到窗口并快速移除
               if let snapshot = snapshot {
                   window.addSubview(snapshot)
                   UIView.animate(withDuration: 0.01, animations: {
                       snapshot.alpha = 0
                   }, completion: { _ in
                       snapshot.removeFromSuperview()
                       UIView.setAnimationsEnabled(true)
                       self.isTransitioningBack = false
                   })
               } else {
                   UIView.setAnimationsEnabled(true)
                   isTransitioningBack = false
               }
           }
       }
       
       override func viewWillAppear(_ animated: Bool) {
           super.viewWillAppear(animated)
           navigationItem.hidesBackButton = true
           
           // 进入时强制横屏
           UIViewController.attemptRotationToDeviceOrientation()
       }
       
       // 方向设置
       override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
           return .landscapeRight
       }
       
       override var shouldAutorotate: Bool {
           return true
       }
       
       override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
           return .landscapeRight
       }
    ```
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容