创建类的实例(c#)

时间:2017-10-17 12:59:35

标签: c# ios callback xamarin.ios core-graphics

如果服务器向它发送一些新的坐标,我写了一些代码来在iOS应用程序中绘制内容。

我有一个绘制坐标的回调函数。但是当我在这个函数中创建一个类的新实例时,回调出口没有任何错误...

其他人之前有这个问题吗?

这是我的代码,如果这有帮助

    CGPath pathtotal;
    List<CGPath> path;

    CGPoint initialPoint;
    CGPoint latestPoint;

    DrawDrawerDraw drawDrawerDraw;

    public DrawGuessView(IntPtr handle) : base(handle)
    {
        BackgroundColor = UIColor.White;
        pathtotal = new CGPath();

        SocketEventHandler.Add("draw:drawer:draw", onDrawDrawerDraw);
    }

    public void onDrawDrawerDraw(dynamic obj)
    {
        drawDrawerDraw = (DrawDrawerDraw)obj;

        for (int i = 0; i <= drawDrawerDraw.coords.Count; i++)
        {
            if (initialPoint.X != (nfloat)drawDrawerDraw.coords[i].x0 && initialPoint.Y != (nfloat)drawDrawerDraw.coords[i].y0)
            {
                path[i] = new CGPath();
            }

            initialPoint.X = (nfloat)drawDrawerDraw.coords[i].x0;
            initialPoint.Y = (nfloat)drawDrawerDraw.coords[i].y0;

            latestPoint.X = (nfloat)drawDrawerDraw.coords[i].x1;
            latestPoint.Y = (nfloat)drawDrawerDraw.coords[i].y1;

            //add lines to the touch points
            if (path[i].IsEmpty)
            {
                path[i].AddLines(new CGPoint[] { initialPoint, latestPoint });
            }
            else
            {
                path[i].AddLineToPoint(latestPoint);
            }
        }

        SetNeedsDisplay();
    }

    public override void Draw(CGRect rect)
    {
        base.Draw(rect);

        try
        {
            foreach (var item in path)
            {
                if (!initialPoint.IsEmpty)
                {
                    //get graphics context
                    using (CGContext g = UIGraphics.GetCurrentContext())
                    {
                        //set up drawing attributes
                        g.SetLineWidth(2);
                        UIColor.Black.SetStroke();

                        //add geometry to graphics context and draw it
                        pathtotal.AddPath(item);

                        g.AddPath(pathtotal);
                        g.DrawPath(CGPathDrawingMode.Stroke);
                    }
                }
            }
        }
        catch (Exception e) { }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要修改两点。

  1. path方法

    中初始化DrawGuessView
    public DrawGuessView(IntPtr handle) : base(handle)
    {
        BackgroundColor = UIColor.White;
        pathtotal = new CGPath();
        List<CGPath> path = new List<CGPath>();
        SocketEventHandler.Add("draw:drawer:draw", onDrawDrawerDraw);
    } 
    
  2. path[i] = new CGPath()会导致ArgumentOutOfRangeException,我们无法通过这种方式为List中的项目设置值。

    修改循环

    CGPath pathItem = null;
    for (int i = 0; i <= drawDrawerDraw.coords.Count; i++)
    {
         if (initialPoint.X != (nfloat)drawDrawerDraw.coords[i].x0 && initialPoint.Y != (nfloat)drawDrawerDraw.coords[i].y0)
        {
             pathItem = new CGPath();
        }
    
        initialPoint.X = (nfloat)drawDrawerDraw.coords[i].x0;
        initialPoint.Y = (nfloat)drawDrawerDraw.coords[i].y0;
    
        latestPoint.X = (nfloat)drawDrawerDraw.coords[i].x1;
        latestPoint.Y = (nfloat)drawDrawerDraw.coords[i].y1;
    
        //add lines to the touch points
        if (pathItem.IsEmpty)
        {
            pathItem.AddLines(new CGPoint[] { initialPoint, latestPoint });
        }
        else
        {
            pathItem.AddLineToPoint(latestPoint);
        }
        path.Add(pathItem);
    }