Xamarin Forms iOS16点击发送按钮时键盘短暂隐藏问题求助
问题解决:iOS16点击发送按钮时键盘短暂隐藏再弹出
问题根源
iOS16调整了触摸事件的处理逻辑:点击发送按钮这类非输入控件的手势时,系统会优先触发输入框的失焦操作,导致键盘临时隐藏;随后代码里调用EditorMessage.Focus()又让键盘重新弹出,因此出现闪烁现象。而iOS15及以下版本、Android版本不存在这个行为变化。
解决方案
方案一:仅在输入框失焦时执行聚焦操作
修改KeepFocusOnMessageEditor方法,增加焦点状态判断,避免重复触发聚焦导致的键盘闪烁:
private void KeepFocusOnMessageEditor() { // 只有输入框当前未聚焦时,才执行聚焦逻辑 if (!EditorMessage.IsFocused) { if (IsIOS) { // 针对iOS16+,延迟在主线程执行,适配系统事件时序 if (DeviceInfo.Version.Major >= 16) { Device.BeginInvokeOnMainThread(async () => { await Task.Delay(50); EditorMessage.Focus(); }); } else { EditorMessage.Focus(); } } else { Constants.AndroidFlags.IgnoreFocusChanges = true; Device.BeginInvokeOnMainThread(() => EditorMessage.Focus()); } } }
方案二:阻止手势触发输入框失焦(推荐)
通过iOS平台自定义效果,修改发送按钮手势的CancelsTouchesInView属性为false,从根源阻止焦点丢失行为:
- 共享项目创建路由效果
using Xamarin.Forms; namespace YourAppNamespace { public class DisableTouchCancelEffect : RoutingEffect { public DisableTouchCancelEffect() : base("YourAppNamespace.DisableTouchCancelEffect") { } } }
- iOS项目实现平台效果
using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ResolutionGroupName("YourAppNamespace")] [assembly: ExportEffect(typeof(YourAppNamespace.iOS.Effects.DisableTouchCancelEffectiOS), "DisableTouchCancelEffect")] namespace YourAppNamespace.iOS.Effects { public class DisableTouchCancelEffectiOS : PlatformEffect { protected override void OnAttached() { if (Control is UIView view) { foreach (var gesture in view.GestureRecognizers) { if (gesture is UITapGestureRecognizer tapGesture) { tapGesture.CancelsTouchesInView = false; } } } } protected override void OnDetached() { // 无需额外清理操作 } } }
- XAML中给发送按钮容器添加效果
<Grid Grid.Column="1" VerticalOptions="End" IsVisible="false" Padding="{OnPlatform iOS='0,0,0,10'}" x:Name="SendIconGrid" Opacity="{Binding SendButtonOpacity }" HorizontalOptions="Fill"> <Grid.Effects> <local:DisableTouchCancelEffect /> </Grid.Effects> <!-- 原有Image及手势代码 --> </Grid>
效果说明
方案二直接从系统事件层面阻止了iOS16的焦点丢失行为,输入框会始终保持聚焦状态,无需额外调用Focus(),能彻底解决键盘闪烁问题,是更优的解决方案。
内容的提问来源于stack exchange,提问作者Edgar Cordova
相关产品推荐
相关产品推荐

