iOS中Popover未显示在UIButton附近的问题排查
解决Popover始终显示在屏幕左上角的问题
以下是几个可能导致该问题的原因及对应修复方案:
1. 未为PopoverPresentationController设置代理
你的PopViewController已经实现了UIPopoverPresentationControllerDelegate协议,但未将代理对象赋值给popoverPresentationController。如果不设置代理,adaptivePresentationStyle方法不会触发,在部分设备(如iPhone)上系统可能强制切换为全屏模态,进而导致popover布局异常。
修复代码:
if let popPresentation = pop.popoverPresentationController { popPresentation.sourceView = launchButton popPresentation.sourceRect = launchButton.bounds popPresentation.delegate = pop // 关键:绑定代理 }
2. LaunchButton的frame未正确同步
你通过固定frame创建按钮,若父视图布局发生变化(如横竖屏切换、AutoLayout动态调整),按钮的实际位置可能和初始化时的frame不符。可以通过坐标转换获取按钮在当前控制器视图中的准确区域:
popPresentation.sourceRect = launchButton.convert(launchButton.bounds, to: self.view)
或者改用AutoLayout约束创建按钮,避免固定frame的局限性:
lazy var launchButton: UIButton = { let button = UIButton(type: .system) button.setTitle("Launch", for: .normal) button.addTarget(self, action:#selector(launchPopOver), for: .touchUpInside) button.translatesAutoresizingMaskIntoConstraints = false return button }() override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(launchButton) NSLayoutConstraint.activate([ launchButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), launchButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 200), launchButton.widthAnchor.constraint(equalToConstant: 100), launchButton.heightAnchor.constraint(equalToConstant: 50) ]) }
3. Popover的preferredContentSize未完整设置
你仅设置了popover的高度,未定义宽度,可能导致系统无法正确计算popover的显示位置。建议同时指定宽高:
pop.preferredContentSize = CGSize(width: 200, height: 250)
4. 检查视图层级与present时机
确保调用launchPopOver时,launchButton已经被添加到视图层级且布局已完成。若当前控制器是被其他控制器present而来,需确认present的上下文有效性,避免因视图层级嵌套导致的布局异常。
内容的提问来源于stack exchange,提问作者iCodes
相关产品推荐
相关产品推荐

