iOS嵌套视图层次结构,支持拖放功能,允许最终用户配置表单

时间:2012-05-08 08:36:05

标签: ios uitableview uiview uiviewcontroller uiscrollview

我正在构建一个原生的iOS应用程序,允许最终用户通过从自定义控件的工具箱中拖放来构建表单。一个典型的场景是高级用户在UIView上拖动一些UILabel和UITextField表示。将支持控件组,允许在一个部分中可视地包含多个控件。整个事情可能会包含在UIScrollView中,允许在“页面​​”之间进行水平滚动。

'普通'用户将使用该表单进行数据输入。

所以,我有两个相关的要求:允许布局和分组不同类型的UIView / UITableView / UIImageView / UILabelView / UITextField等(并且可能包含在外部UIScrollView中),并允许布局由高级用户调整/拖放。

我的问题相当广泛,但基本上是这样的:支持这两个相关要求的最合适的嵌套UIView层次结构是什么?如果我想在UITableView中的嵌套视图中拖放,那么外部UIScrollView中包含的UITableViews的基本结构是否基本上是合理的?我应该避免使用UITableView,因为它会使拖动变得复杂吗?

我很欣赏这个问题在范围上是主观的,但我真的很感谢那些曾经说过这种事情并且对我有一些智慧的人的指导。

非常感谢。

2 个答案:

答案 0 :(得分:2)

听起来像一个有趣的应用程序!我会说使用UITableView会使应用程序变得非常复杂。 UIScrollView是将控件拖放到的良好基础。也许有一个"添加页面"按钮,用户可以点按此按钮,您可以将contentSize的{​​{1}}扩展为+1页的宽度,然后滚动它以便用户可以将更多控件拖到该页面上

要拖动控件,可以使用附加到每个控件的UIPanGestureRecognizer,并在触发时更改控件的中心位置。您可能需要关闭某些控件的用户交互 - 例如对于UIScrollView,超级用户需要将其拖动但不想在其中输入值。

对于分组控件,您可以执行以下操作:

  • a"组模式",用户点击一个按钮进入此模式,然后点击一些控件(需要一些视觉指示来显示它们被选中),然后点击完成。
  • 然后将从UIScrollView
  • 中删除所选控件
  • 创建一个新的UIView并将其定位在所选控件的中心点,并且足够大,使控件能够以相同的距离分开。它被添加为滚动视图的子视图
  • 控件全部添加为此视图的子视图
  • 手势识别器已添加到此视图中,而不是单个控件。然后在拖动时,这组控件将作为具有固定布局的组移动。

如果您认为可能常用的控件组,您甚至可以预先创建它们,每个控件都在自己的笔尖中,然后允许用户将它们作为预制组拖动到滚动视图上。

您可能会发现什么,特别是如果您的某些控件非常大(例如,我希望图像视图明显大于标签或文本字段),则平移手势识别器会受到一些限制,因为试图拖动你周围的视图如果它们靠近在一起或重叠,就会无意中选择错误的视图。在这种情况下,您可能需要自己处理所有触摸事件的额外精度 - 因此,当触摸开始时,您将对所有控件(或组)进行测试,以查看哪个控件(或组)与您的分接位置最接近的中心,然后当您获取触摸移动事件,您可以更新此中心位置。

我没有制作任何像你所描述的那么复杂的东西,但我确实制作了一个应用程序,用户可以将小图像拖到大图像上以作为"装饰&#34 ;。他们可以拖动任何数量的这些装饰品,并用捏手势来缩放它们。在这种情况下,我有一个UIImageView作为背景,保持主图像。然后装饰物位于图像的边缘,并且使用平移手势识别器来检测它们被拖动到图像上。在拖动时,我实际上创建了一个新的装饰实例(UIImageView),以便工具箱中总有另一个实例。捏手势识别器用于用户缩放装饰。为了让用户在他们已经放置的装饰物周围移动,我不得不使用手动触摸处理来检测正确的装饰(因为它们很容易重叠,而且对于用户而言看起来是圆形的UIViews,所以当用户想要拖动不同的角落时,用户很容易意外地拖动角落。)混合匹配的手势识别器和手动触摸处理似乎很好,这很好,因为它更容易使用手势识别器来处理更复杂的行为,如捏。

返回您的应用,一旦高级用户设置了所有内容,然后当普通用户加载应用时,您可以关闭任何触摸处理代码(并删除或不创建手势识别器)和它们将获得高级用户所规定的静态表格。然后确保在所有控件上启用了用户互动(例如UITextField),他们就可以在其中输入数据。

我认为,将所有上述控件放到滚动视图上将会非常复杂,并且您可能最终不得不处理许多琐碎的行为,试图让普通和高级用户都能很好地工作。如果您同时处理UITextFieldUITableViews,我认为这将是100倍。

如果您希望我详细说明我上面概述的应用程序的任何方面,请告诉我,因为它似乎与您的应用程序有相同的功能。希望将来能够看到/听到有关您的应用的更多信息!

修改

我还有一件事情发生了 - 如果您希望在解决方案中使用UITableCells,那么我建议您的超级用户一次列出一个UITableView。事实上,他们会将UITableViewCell和其他控件拖到一个基本的UIView上,当他们完成你的时候,然后用来记录控件的位置。然后在单元格中显示这些控件时使用这些位置 - 在UILabels中,您将创建并初始化所有选定的控件,并将所有这些控件放置在新创建的单元格中的高级用户选择的位置和布局中。高级用户还可以通过控制来改变他们正在布置的单元的高度,以获得更大的灵活性。他们将一个接一个地创建一系列单元格布局(我猜这些将是"组"控件),然后这些单元格将在表格视图中按顺序显示。然后,您可以让高级用户进行一些最终调整控制,让他们将表格置于编辑模式,以便他们可以重新排序单元格(甚至删除一些单元格)。

根据应用程序的不同,用户也可能拥有以前创建的这些单元格布局始终可用,因此在他们构建了一些常用控件组之后,他们可以继续重复使用它们。迅速建立一个表格。然后偶尔他们会创建一个新的单元格布局,因为到目前为止他们创建的那些都不合适,并且它们将被保存为模板,以便他们在将来的表单中再次使用。

答案 1 :(得分:2)

我只想制作一个只带有透明背景颜色的UIView的EditView类。当您想要拖动控件时,请设置某种类型的编辑模式,您可以在所有适当的控件上覆盖一堆EditView。然后,EditView将支持您想要调整大小或移动它的任何手势/触摸处理。将视图拖动到另一个视图并释放可能会提示“在视图B中嵌套视图A?”然后你可以进行相关的addSubview调用。

在scrollviews中嵌套tableviews不会是一个问题,但是如果你试图在tableview中嵌套任何东西我不确定会出现什么样的行为...这必须使用标准的UITableView方法来指定

对于保存布局等,您可能需要创建自己的伪视图层次结构,其中包含重新创建最终布局所需的各种元数据,然后您可以将其存储在某处。