Xamarin Forms CollectionView无KeyboardDismissMode实现iOS滚动收键盘
Xamarin.iOS 平台 CollectionView 滚动自动隐藏键盘实现方案
核心原理
Xamarin 封装的 CollectionViewRenderer 没有直接暴露键盘隐藏相关属性,但它内部持有的原生 UICollectionView 本身继承自 UIScrollView,原生层面完全支持 KeyboardDismissMode 配置,只需要在渲染初始化阶段直接给原生实例赋值即可,不需要额外实现手势监听、滚动事件拦截的冗余逻辑。
具体实现步骤
- 第一步:在共享代码层定义自定义CollectionView控件,仅作为平台渲染器的绑定标记,不需要额外实现逻辑
- 第二步:在iOS平台项目中为自定义控件编写配套渲染器,在控件初始化完成后直接给原生控件实例设置键盘隐藏模式
代码示例
- 共享层自定义控件定义
// 位于.NET Standard/共享项目中 public class KeyboardDismissableCollectionView : CollectionView { }
- iOS平台渲染器实现
// 位于iOS平台项目中 [assembly: ExportRenderer(typeof(KeyboardDismissableCollectionView), typeof(KeyboardDismissableCollectionViewRenderer))] namespace YourApp.iOS.Renderers { public class KeyboardDismissableCollectionViewRenderer : CollectionViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<KeyboardDismissableCollectionView> e) { base.OnElementChanged(e); // 原生UICollectionView实例直接支持该属性设置 if (Control != null) { // 可根据需求选择不同的键盘隐藏模式 Control.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive; } } } }
可选键盘隐藏模式说明
Interactive:和之前ListView实现的效果完全一致,滚动过程中键盘跟随手势联动缩放收起,未达到滑动阈值时键盘会回弹恢复,交互体验最自然OnDrag:手指一触发拖拽滚动就立刻完全收起键盘,无联动效果None:默认模式,滚动操作不会触发键盘隐藏
注意:实现时需要在
Control实例初始化完成后再赋值属性,避免在元素切换、控件销毁阶段给已经释放的原生实例赋值导致空引用异常。
内容的提问来源于stack exchange,提问作者SUDALV
相关产品推荐
相关产品推荐

