Xamarin.iOS中如何为紧凑样式UIDatepicker添加Done按钮
问题解决方案
问题根因
你将按钮通过Add(button)添加到了当前控制器的普通View层级中,但系统弹出的日期选择器模态框属于更高层级的窗口(系统级弹窗容器),即使设置子视图的ZPosition也无法跨父级层级提升显示顺序,因此按钮会被模态框遮挡、显示模糊且无法响应点击。
推荐解决方案(原生规范)
iOS原生提供了输入附件视图(InputAccessoryView)能力,可直接在日期选择器顶部固定显示自定义按钮,无需手动处理层级问题,符合系统交互规范:
// 在控件初始化或ViewDidLoad生命周期中执行,无需写在EditingDidBegin事件里 UIToolbar toolbar = new UIToolbar(new CGRect(0, 0, View.Bounds.Width, 44)); UIBarButtonItem doneBtn = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (sender, args) => { // 点击后收起日期选择器 DatePickerDateFrom.ResignFirstResponder(); }); toolbar.Items = new UIBarButtonItem[] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), // 占位将按钮推到右侧 doneBtn }; // 给绑定了日期选择器的输入框设置附件视图 DatePickerDateFrom.InputAccessoryView = toolbar;
备选解决方案(手动添加到顶层窗口)
如果你确实需要自定义位置的按钮,可直接将按钮添加到App的顶层窗口中,确保层级高于所有普通控制器视图:
private void DatePickerDateFrom_EditingDidBegin(object sender, EventArgs e) { UIButton button = new UIButton(); button.Tag = 999; // 给按钮加标记方便后续查找移除 button.Frame = new CGRect(0, 0, 200, 100); button.SetTitle("Done", UIControlState.Normal); button.BackgroundColor = UIColor.Red; button.TouchUpInside += (s, args) => { DatePickerDateFrom.ResignFirstResponder(); // 点击后移除按钮避免残留 button.RemoveFromSuperview(); }; // 获取当前App的顶层窗口 var topWindow = UIApplication.SharedApplication.Windows.LastOrDefault(w => w.IsKeyWindow); topWindow?.AddSubview(button); } // 记得在日期选择器收起时额外判断移除按钮,避免手动关闭选择器时按钮残留 private void DatePickerDateFrom_EditingDidEnd(object sender, EventArgs e) { var topWindow = UIApplication.SharedApplication.Windows.LastOrDefault(w => w.IsKeyWindow); var button = topWindow?.ViewWithTag(999); button?.RemoveFromSuperview(); }
内容的提问来源于stack exchange,提问作者Robin Khan
相关产品推荐
相关产品推荐

