You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,从根源阻止焦点丢失行为:

  1. 共享项目创建路由效果
using Xamarin.Forms;

namespace YourAppNamespace
{
    public class DisableTouchCancelEffect : RoutingEffect
    {
        public DisableTouchCancelEffect() : base("YourAppNamespace.DisableTouchCancelEffect")
        {
        }
    }
}
  1. 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()
        {
            // 无需额外清理操作
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:53:12