@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
}
```
iOS 当前页面横屏,返回竖屏,防止动画以及闪动
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 首先,刚开始想到的是vue的keep-alive,但试了貌似并不适用与我所参与的项目。 可以在跳转之前用组件里的路...
- 背景 在我们日常开发中,经常会效仿某些流行APP渲染动画效果,用来满足自己开发或公司开发的日常需要,学习一下新的东...
- 开发中总是有从一个界面返回后刷新当前页面的需求,为了减少耦合性,尽量不在当前页面加代码,在返回的界面添加以下方法:...