MonoTouch中的简单iPhone绘图应用程序

时间:2011-06-03 16:46:43

标签: iphone xamarin.ios diagramming

我有一个规范,可以在MonoTouch应用程序中构建一个非常简单的图表功能。到目前为止,我所做的一切都是基于表格的,所以这是一个新领域。

可以在应用商店中找到大量的图表示例,例如MindMeister和SimpleMind思维导图应用。

我需要用户能够点击视图以“放下”新形状,标记它,并可选择将其连接到现有形状。

实现这种交互功能的好方法是什么?我的第一个是放下从自定义图像创建的UIImageView,然后确保它可以响应触摸事件来移动它。但是,当您想要添加文本叠加时,事情会变得更加复杂,因为您必须管理两个视图(图像和文本)。

我可以采用什么方法?

PS:如果这不适合SO,请随意嘲笑!

更新:可以使用简单的标签覆盖来实现基本图表元素:

UILabel lbl = new UILabel(new RectangleF(...));
lbl.Text = "Whatever";
lbl.Layer.BorderWidth = 3f;
lbl.Layer.BorderColor ( new CGColor (1f, 0f, 0f) );
this.Add (lbl);

通过扩展gui元素类并覆盖TouchesBeganTouchesMovedTouchesEnd事件,可以实现一些交互。

1 个答案:

答案 0 :(得分:1)

你想要做的并不是那么困难。我没有准备好示例,但我会给你一些可能有助于你入门的步骤。

  1. 创建自定义视图,继承 UIView的。这将保持你的形状 和文字。
  2. 在其中添加两个子视图。该 UIImageView将举行你的 形状和文字的UILabel。
  3. 覆盖自定义视图的Draw 方法。在其中,您可以将视图的内容复制到图像上下文。
  4. 从该上下文中分配图像, 到另一层。
  5. 移动该图层,响应 用户触摸您的自定义 查看超级视图。
  6. 简单示例:

    public CALayer ContentsLayer { get; set; }
    public override void Draw (RectangleF rect)
    {
        base.Draw(rect);
    
        // Create an image context
        UIGraphics.BeginImageContext(this.Bounds.Size);
    
        // Render the contents of the view to the context
        this.Layer.RenderInContext(UIGraphics.GetCurrentContext());
    
        // Assign the contents to the layer
        this.ContentsLayer = new CALayer();
        this.ContentsLayer.Contents = UIGraphics.GetImageFromCurrentImageContext().CGImage;
    
        // End the context
        UIGraphics.EndImageContext();
    }
    

    这个例子非常简单,不应该按原样使用。例如,您应该提供何时接收自定义视图内容的逻辑。如果你这样离开它,每次调用Draw方法时它都会创建一个新的上下文。你只需要这样做一次。

    将内容复制到图层后,您可以通过超级视图在任意位置移动该图层,方法是将其添加到超级视图的图层并修改其框架。您不必为超级视图创建另一个自定义视图,您只需创建自定义UIGestureRecognizer,覆盖其自己的Touches *方法并将其添加到superview。

    这样你就可以移动一个物体(图层)来保存你的形状和文字。

    我希望这会有所帮助。