2

我有一个规范,可以在 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 元素类并覆盖TouchesBegan,TouchesMovedTouchesEnd事件来实现。

4

1 回答 1

1

你想做的事情并没有那么难。我没有准备好示例,但我会为您提供一些可能会帮助您入门的步骤。

  1. 创建自定义视图,继承 UIView。这将保存您的形状和文本。
  2. 在其中添加两个子视图。UIImageView 将保存您的形状和文本的 UILabel。
  3. 覆盖自定义视图的 Draw 方法。在其中,您可以将视图的内容复制到图像上下文中。
  4. 将来自该上下文的图像分配给另一层。
  5. 移动该层,响应用户对自定义视图的超级视图的触摸。

简单的例子:

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* 方法并将其添加到超级视图。

这样,您就有了一个可以移动的对象(图层),该对象同时包含您的形状和文本。

我希望这有帮助。

于 2011-06-04T08:27:06.270 回答