首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS 11触摸取消

iOS 11触摸取消
EN

Stack Overflow用户
提问于 2017-11-08 10:29:00
回答 1查看 90关注 0票数 0

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

我得到一个触摸开始事件,几个移动事件,然后触摸被取消。特别是,如果我的手指移动一点远离原来的触点。如果我停留在几毫米内的原始触点,它不会被取消。

代码在iOS 10中工作,但现在已经停止工作了。我怀疑这是由于iOS 11中的一些新特性造成的,但我无法理解。

视图不是在任何类型的ScrollView中,只是普通的UIViewController。

有没有人知道在iOS 11中有什么SDK改变了我的绘图视图?

代码语言:javascript
运行
复制
    [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();
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-08 18:04:26

我找到了答案。在我的应用程序中,我使用了一个侧抽屉,类似于这样的东西:https://github.com/jdehlin/Xamarin-Sidebar

侧栏库为抽屉设置了一个pan手势,并且这个手势识别可能取消了我的触摸事件。在那个特定的视图中禁用抽屉后,所有东西都会正常工作。我想这也适用于正常的iOS,而不仅仅是Xamarin。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47177267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档