iOS 11触摸已取消

时间:2017-11-08 10:29:01

标签: ios

我在iOS中有自定义绘图视图。它在Xamarin,但我不认为这是相关的。

我获得了触摸开始事件,一些移动事件,然后触摸被取消。特别是如果我将手指移动一点远离原始触摸点。如果我距离原始触摸点不到几毫米,则不会取消。

代码在iOS 10中运行,但现在它已停止工作。我怀疑这是由于iOS 11中的一些新功能,但我无法弄明白。

视图不在任何类型的ScrollView中,只是一个简单的UIViewController。

有没有人知道iOS 11中的任何SDK更改在我的绘制视图中执行此操作?

    [Register("SignatureDrawView")]
public class SignatureDrawView : UIView
{
    private UIImageView drawImage;
    private List<CGPoint> currentLine;

    public SignatureDrawView()
    {
        InitializeDrawImage();
    }

    public SignatureDrawView(NSCoder coder) : base(coder)
    {
        InitializeDrawImage();
    }

    public SignatureDrawView(NSObjectFlag t) : base(t)
    {
        InitializeDrawImage();
    }

    public SignatureDrawView(IntPtr handle) : base(handle)
    {
        InitializeDrawImage();
    }

    public SignatureDrawView(CGRect frame) : base(frame)
    {
        InitializeDrawImage();
    }

    private void InitializeDrawImage()
    {
        Layer.BorderColor = UIColor.Black.CGColor;
        Layer.BorderWidth = 0.5f;

        drawImage = new UIImageView
        {
            BackgroundColor = UIColor.Red,
            Image = new UIImage()
        };
        AddSubview(drawImage);
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();
                    drawImage.Frame = new CGRect(0, 0, Frame.Size.Width, Frame.Size.Height);
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        UITouch touch = (UITouch)touches.AnyObject;
        CGPoint point = touch.LocationInView(this);
        currentLine = new List<CGPoint>();
        currentLine.Add(point);
        SetNeedsDisplay();
    }

    public override void TouchesMoved(NSSet touches, UIEvent evt)
    {
        UITouch touch = (UITouch)touches.AnyObject;
        CGPoint point = touch.LocationInView(this);
        currentLine.Add(point);
        SetNeedsDisplay();
    }

    public override void TouchesCancelled(NSSet touches, UIEvent evt)
    {
        SetNeedsDisplay();
    }

    public override void Draw(CGRect rect)
    {
        UIGraphics.BeginImageContext(drawImage.Frame.Size);
        drawImage.Image.DrawAsPatternInRect(new CGRect(0, 0, drawImage.Frame.Size.Width, drawImage.Frame.Size.Height));
        UIColor.Black.SetColor();

        if (currentLine != null && currentLine.Count > 3)
        {
            UIBezierPath path = new UIBezierPath();
            path.LineWidth = 1f;

            for (int i = 3; i < currentLine.Count; i++)
            {
                CGPoint p0 = currentLine[i - 3];
                CGPoint p1 = currentLine[i - 2];
                CGPoint p2 = currentLine[i - 1];
                CGPoint p3 = currentLine[i];

                path.MoveTo(p0);
                path.AddCurveToPoint(p3, p1, p2);
            }
            currentLine.RemoveRange(0, 3);
            path.Stroke();

        }
        drawImage.Image = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();
    }

}

1 个答案:

答案 0 :(得分:0)

我找到了答案。在我的应用程序中,我使用侧抽屉,如下所示:https://github.com/jdehlin/Xamarin-Sidebar

侧边栏lib为抽屉设置了平移手势,并且该手势识别可能取消了我的触摸事件。在特定视图中禁用抽屉后,一切都正常。我想这对普通的iOS也有效,而不仅仅是Xamarin。