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

Xamarin Forms iOS自定义Editor Renderer触摸事件未触发如何解决?

解决思路及实现方案

问题根源在于:Xamarin.Forms的Editor对应的原生iOS控件是UITextView,它内部已经处理了触摸事件用于光标定位、文本输入等操作,导致自定义EditorRenderer中的TouchesBegan/TouchesEnded方法无法接收到触摸事件。以下是两种可行的解决办法:

方法一:给原生UITextView添加手势识别器

在OnElementChanged方法中,获取原生UITextView控件,添加自定义的UITapGestureRecognizer来捕获触摸事件,同时避免干扰系统默认的输入行为:

protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
    base.OnElementChanged(e);

    if (Control != null)
    {
        var tapGesture = new UITapGestureRecognizer(TapHandler);
        // 设置为false,避免拦截系统触摸事件(光标定位等)
        tapGesture.CancelsTouchesInView = false;
        Control.AddGestureRecognizer(tapGesture);
    }
}

private void TapHandler(UITapGestureRecognizer sender)
{
    if (sender.State == UIGestureRecognizerState.Began)
    {
        // 处理触摸开始逻辑
    }
    else if (sender.State == UIGestureRecognizerState.Ended)
    {
        // 处理触摸结束逻辑
    }
}

方法二:自定义UITextView子类并重写触摸方法

创建一个继承自UITextView的子类,重写它的TouchesBegan和TouchesEnded方法,然后在Renderer中替换原生控件:

1. 自定义UITextView子类

public class CustomTextView : UITextView
{
    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        base.TouchesBegan(touches, evt);
        // 在这里处理触摸开始逻辑
    }

    public override void TouchesEnded(NSSet touches, UIEvent evt)
    {
        base.TouchesEnded(touches, evt);
        // 在这里处理触摸结束逻辑
    }
}

2. 在Renderer中替换原生控件

重写CreateNativeControl方法,返回自定义的CustomTextView:

public class EditorExRenderer : EditorRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
    {
        base.OnElementChanged(e);
        // 这里可以添加控件初始化逻辑
    }

    protected override UITextView CreateNativeControl()
    {
        // 返回自定义的TextView
        return new CustomTextView();
    }
}

注意事项

  • 无论使用哪种方法,都要确保调用base对应的方法,避免破坏系统默认的文本输入行为。
  • 如果需要区分不同的触摸状态(比如长按、双击),可以通过手势识别器的NumberOfTapsRequired等属性来配置。

内容的提问来源于stack exchange,提问作者jho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:15:30