使用Swift获取iPad模态弹窗宽高时返回设备尺寸的正确实现问询
问题根因
- 你获取宽度的时机过早:在
viewDidLoad等视图未完成布局的生命周期阶段调用self.view.frame.size.width,拿到的是视图初始化时的全屏预设尺寸,不是iPad模态弹窗渲染后的实际大小。 - iPad默认模态弹窗为
pageSheet样式,尺寸小于设备屏幕宽度,和iPhone默认的全屏模态样式表现不同。
正确实现方式
方式1:在弹窗视图控制器内部获取
在ScannerViewController的viewDidLayoutSubviews生命周期方法中读取宽度,此时视图已经完成所有布局计算,拿到的就是弹窗实际宽度:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let modalWidth = self.view.frame.size.width // 在此处基于弹窗宽度计算内部组件位置 }
如果只需要执行一次布局计算,可以加标记位避免重复执行:
private var isLayoutCalculated = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard !isLayoutCalculated else { return } isLayoutCalculated = true let modalWidth = self.view.frame.size.width // 执行布局逻辑 }
方式2:在父视图控制器弹出完成后获取
如果是在弹出弹窗的父视图中需要获取弹窗宽度,可以在present方法的完成回调中读取:
let scannerViewController = ScannerViewController(barcodeCallback: queueBarcode, cameraScanDismissedCallback: cameraScanDismissedCallback) present(scannerViewController, animated: true) { guard let modalView = scannerViewController.view else { return } let modalWidth = modalView.frame.size.width // 执行对应逻辑 }
优化建议
如果不需要动态适配弹窗大小,优先使用AutoLayout约束布局内部组件,无需手动计算宽度,系统会自动适配不同场景下的弹窗尺寸,适配性更强。
内容的提问来源于stack exchange,提问作者juminoz
相关产品推荐
相关产品推荐

