如何在Xamarin iOS(iPhone)中创建Popover弹出视图?
当然可以在Xamarin iOS中创建Popover!你遇到的全屏问题大概率是没配置好Popover的展示参数,或者没处理iPhone上的自适应逻辑——毕竟在iPhone上默认Popover会被系统转成全屏模态,下面给你一步步的解决方案:
1. 先准备Popover的内容控制器
首先创建一个用来承载Popover内容的UIViewController,记得给它设置PreferredContentSize,这是控制Popover尺寸的关键:
public class PopoverContentVC : UIViewController { public override void ViewDidLoad() { base.ViewDidLoad(); View.BackgroundColor = UIColor.White; // 自定义Popover的宽高,根据你的内容调整 PreferredContentSize = new CGSize(280, 350); // 这里可以添加你的Popover内部控件,比如标签、按钮等 var label = new UILabel(new CGRect(20, 20, 240, 30)) { Text = "这是Popover内容" }; View.AddSubview(label); } }
2. 处理按钮点击,触发Popover展示
在你的主页面控制器里,给触发按钮绑定点击事件,然后配置Popover的展示参数:
private void ShowPopoverBtn_TouchUpInside(object sender, EventArgs e) { var popoverContent = new PopoverContentVC(); // 必须设置模态展示样式为Popover popoverContent.ModalPresentationStyle = UIModalPresentationStyle.Popover; var popoverPresenter = popoverContent.PopoverPresentationController; if (popoverPresenter != null) { // 设置Popover的锚点:绑定到触发按钮 popoverPresenter.SourceView = sender as UIButton; popoverPresenter.SourceRect = (sender as UIButton).Bounds; // 设置箭头允许的方向,比如向下 popoverPresenter.PermittedArrowDirections = UIPopoverArrowDirection.Down; // 设置背景遮罩,点击遮罩可以关闭Popover popoverPresenter.BackgroundColor = UIColor.FromWhiteAlpha(0, 0.3f); // 绑定代理,处理自适应逻辑 popoverPresenter.Delegate = this; } // 弹出Popover PresentViewController(popoverContent, true, null); }
3. 实现代理,阻止自适应为全屏(最关键的一步!)
在iPhone设备上,系统默认会把Popover自适应成全屏模态,所以必须实现IUIPopoverPresentationControllerDelegate的方法来强制保持Popover样式:
// 让你的主控制器继承这个代理 public class MainPageVC : UIViewController, IUIPopoverPresentationControllerDelegate { // 其他页面逻辑代码... // 重写这个方法,返回None来禁用自适应全屏 [Export("adaptivePresentationStyleForPresentationController:")] public UIModalPresentationStyle AdaptivePresentationStyle(UIPresentationController forPresentationController) { return UIModalPresentationStyle.None; } }
额外小提示
- 如果需要在Popover关闭时执行逻辑,可以实现代理的
DidDismissPopover方法 - 可以根据不同设备调整
PreferredContentSize,比如在iPad上设置更大的尺寸 - 确保你的触发按钮已经正确关联到点击事件,没有空引用问题
内容的提问来源于stack exchange,提问作者BBB
相关产品推荐
相关产品推荐

