React Native iOS 全应用锁竖屏 如何让rn-fetch-blob调起的原生PDF查看器支持横竖屏旋转
iOS端原生文件预览单独支持横竖屏适配方案
根因说明
你找不到可修改的文件查看视图初始化位置,核心原因是你调用的RNFetchBlob.ios.openDocument是模块内部直接封装的系统文件预览组件,既没有在你项目的原生代码中暴露初始化入口,也没有提供可配置方向权限的入参。这个内部封装的预览控制器会完全跟随App全局的竖屏锁定规则,自然没法直接套用通用的单页面方向适配逻辑。
具体实现逻辑(完全保留全局竖屏锁定规则)
整体思路是不改动原有全局方向锁定的默认配置,仅在文件预览页面弹出时临时放开方向权限,退出预览时立刻恢复竖屏锁定,具体步骤:
- 在iOS原生
AppDelegate中新增全局方向控制开关- 新增一个默认为
NO的BOOL属性allowRotation,作为全局方向控制的总开关 - 重写系统方向回调方法
application:supportedInterfaceOrientationsForWindow:,根据开关值动态调整允许的屏幕方向:- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { // 开关打开时,允许除倒置以外的所有横竖屏方向 if (_allowRotation) { return UIInterfaceOrientationMaskAllButUpsideDown; } // 开关关闭时,严格保持全应用竖屏锁定 return UIInterfaceOrientationMaskPortrait; }
- 新增一个默认为
- 封装带方向权限控制的自定义文件预览组件
- 基于iOS系统自带的
QLPreviewController实现自定义预览VC,通过原生桥接方法暴露给JS层调用,入参为需要打开的本地文件路径 - 在预览VC的生命周期中同步控制全局方向开关:
- 页面即将显示时,将
AppDelegate中的allowRotation设为YES - 页面即将消失时,将
allowRotation改回NO
- 页面即将显示时,将
- 基于iOS系统自带的
- 替换原有JS层的文件调起逻辑
- 将代码中所有调用
RNFetchBlob.ios.openDocument(filePath)的位置,替换为自定义桥接的预览打开方法 - 原有文件下载、权限申请的逻辑完全不需要改动;安卓端的
actionViewIntent调起逻辑也可保留——因为安卓端是跳转系统外部应用打开文件,方向本来就不受App自身的方向设置限制。
- 将代码中所有调用
常见踩坑提醒
- 不要直接修改
Info.plist中的支持方向配置为全方向,否则会导致App所有页面都能随意旋转,直接破坏原有的竖屏锁定规则。 - 必须在预览VC的消失回调中把全局方向开关复位为
NO,不然退出文件预览后,整个App都会变成可旋转状态。 - 不需要修改React Navigation相关的方向配置,这套权限控制逻辑运行在iOS原生最底层的方向校验层,完全不依赖JS层的导航配置。
内容的提问来源于stack exchange,提问作者mcontoor
相关产品推荐
相关产品推荐

