iPad模拟器中UIPrinterPickerController无法弹出问题求助
解决iPad模拟器中UIPrinterPickerController无法弹出的问题
我之前也踩过这个坑!在iPad上使用UIPrinterPickerController和iPhone的展示逻辑完全不一样——直接调用present方法行不通,因为iPad的UI规范要求这类选择器必须以**popover(弹出框)**的形式呈现,你当前的代码没有配置iPad的popover锚点,所以控制器才弹不出来。而iPhone是全屏设备,present默认会以全屏模态方式展示,所以能正常工作。
修改后的代码示例
你需要为iPad的UIPrinterPickerController指定popover的弹出锚点(比如关联一个触发按钮,或者视图中的某个区域),这样系统才知道从哪里弹出选择器:
let pickerController = UIPrinterPickerController(initiallySelectedPrinter: nil) if UIDevice.current.userInterfaceIdiom == .pad { // 配置popover的弹出锚点:如果是按钮触发,用下面这行 // pickerController.popoverPresentationController?.barButtonItem = yourTriggerButton // 如果是在视图中触发,指定sourceView和sourceRect(这里以视图中心为例) pickerController.popoverPresentationController?.sourceView = self.view pickerController.popoverPresentationController?.sourceRect = CGRect( x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0 ) pickerController.popoverPresentationController?.permittedArrowDirections = [] // 关闭箭头显示 pickerController.present(animated: true) { (controller, completed, error) in if completed, let selectedPrinter = controller.selectedPrinter { let ipadprintername = selectedPrinter.displayName print("iPad选中打印机:\(ipadprintername)") } } } else { pickerController.present(animated: true) { (controller, completed, error) in if completed, let selectedPrinter = controller.selectedPrinter { let iphoneprintername = selectedPrinter.displayName print("iPhone选中打印机:\(iphoneprintername)") } } }
关键注意点
- iPad上展示popover类控制器时,必须为
popoverPresentationController设置sourceView+sourceRect或者barButtonItem,这是系统的强制要求,否则会直接忽略present请求。 - 我优化了代码中的可选值处理,替换了强制解包
selectedPrinter的写法,避免出现崩溃风险。
内容的提问来源于stack exchange,提问作者Nupendra Verma
相关产品推荐
相关产品推荐

