如何获取iPad分屏/侧滑模式下App相对屏幕的位置?
iPad Split View/Slide Over 状态判断方案
你之前用UIApplication.shared.windows.first拿到的是WebView的窗口,不是App的主窗口,所以位置信息不对。下面是正确的实现方式:
Swift 原生模块实现
直接从当前活跃场景里拿到主窗口,再获取它的位置和尺寸:
import UIKit import React @objc(AppPositionModule) class AppPositionModule: NSObject, RCTBridgeModule { static func moduleName() -> String! { return "AppPositionModule" } @objc func getAppPosition(_ callback: RCTResponseSenderBlock) { // 获取当前活跃的场景 guard let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene, // 筛选出主窗口(keyWindow) let mainWindow = scene.windows.first(where: { $0.isKeyWindow }) else { callback([NSNull(), "无法获取主窗口信息"]) return } let screenWidth = UIScreen.main.bounds.width let windowFrame = mainWindow.frame let windowX = windowFrame.origin.x let windowWidth = windowFrame.width var positionStatus = "unknown" // 判断位置状态 if windowX == 0 { positionStatus = "left" // 左侧分屏 } else if windowX == screenWidth - windowWidth { positionStatus = "right" // 右侧分屏 } else if windowWidth < screenWidth * 0.5 { positionStatus = "slide_over" // Slide Over模式 } // 返回结果给RN callback([["status": positionStatus, "x": windowX, "width": windowWidth]]) } @objc static func requiresMainQueueSetup() -> Bool { return true } }
核心要点
- iOS 13+ 用
connectedScenes获取场景,替代旧的UIApplication.shared.windows,避免拿到非主窗口 - 通过
isKeyWindow筛选主窗口,确保拿到的是App本身的窗口,不是WebView或其他子窗口 - 基于窗口的
origin.x和宽度判断状态:- x=0 → 左侧分屏
- x等于屏幕宽度减窗口宽度 → 右侧分屏
- 窗口宽度小于屏幕一半 → Slide Over(符合iPad的Slide Over宽度规则)
React Native 端调用示例
import { NativeModules } from 'react-native'; const { AppPositionModule } = NativeModules; // 调用获取状态 AppPositionModule.getAppPosition((result, error) => { if (error) { console.error('获取位置失败:', error); return; } console.log('当前App状态:', result.status); console.log('窗口X坐标:', result.x); });
内容的提问来源于stack exchange,提问作者SimJungUk
相关产品推荐
相关产品推荐

