听起来像一个有趣的应用程序!我会说使用 aUITableView
会使应用程序变得非常复杂。AUIScrollView
将是拖放控件的良好基础。也许使用“添加页面”按钮,用户可以点击它需要的按钮,您可以将 扩展contentSize
为UIScrollView
+1 页面的宽度,然后滚动它以便用户可以将更多控件拖动到该页面上。
要拖动控件,您可以使用附加到每个控件的 UIPanGestureRecognizer,并在触发时更改控件的中心位置。您可能需要关闭其中一些控件的用户交互 - 例如,UITextField
高级用户希望将其拖动但不想在其中输入值。
对于分组控件,您可以执行以下操作:
- “组模式”,用户点击按钮进入此模式,然后点击多个控件(需要一些视觉指示以显示它们已被选中),然后点击完成。
- 然后从 UIScrollView 中删除选定的控件
- 一个新的 UIView 被创建并定位在所选控件的中心点,并且足够大以使控件能够以相同的距离容纳。它被添加为滚动视图的子视图
- 控件都添加为此视图的子视图
- 手势识别器被添加到这个视图中,而不是单独的控件。然后在左右拖动时,这组控件都会作为一个固定布局的组移动。
如果您有一组您认为可能常用的控件,您甚至可以提前创建它们,每个都在自己的 nib 中,然后允许用户将它们作为预制组拖到滚动视图上。
您可能会发现,特别是如果您的某些控件非常大(例如,我希望图像视图比标签或文本字段大得多),平移手势识别器会受到一些限制,因为在尝试拖动视图时如果它们位置靠近或重叠,您会无意中选择错误的。在这种情况下,您可能需要自己处理所有触摸事件的额外精度 - 因此,当触摸开始时,您测试所有控件(或组)以查看哪个具有最接近您的点击位置的中心,然后当您获取触摸移动事件,您可以更新此中心位置。
我没有做任何像你描述的那样复杂的东西,但我确实做了一个应用程序,用户可以将小图像拖到大图像上以用作“装饰”。他们可以拖动任意数量的这些装饰,也可以通过捏合手势来缩放它们。在这种情况下,我有一个 UIImageView 作为包含主图像的背景。然后装饰物位于图像的边缘,并且使用平移手势识别器来检测它们被拖到图像上。在拖动时,我实际上会创建一个新的装饰实例 (UIImageView),这样工具箱中总会有另一个。用户使用捏合手势识别器来缩放装饰。为了让用户在他们已经放置的装饰品周围移动,我不得不使用手动触摸处理来检测正确的装饰(因为它们很容易重叠,而在用户看来,就 UIViews 而言实际上是方形的,所以用户很容易不小心拖动一个角当他们打算拖另一个时)。混合匹配的手势识别器和手动触摸处理似乎效果很好,这很好,因为它更容易使用手势识别器来处理更复杂的行为,比如捏合。
回到您的应用程序,一旦您的高级用户设置了所有内容,然后当普通用户加载应用程序时,您可以关闭任何触摸处理代码(并删除或不创建手势识别器),他们将获得静态表单按照高级用户的规定。然后确保在所有控件(例如UITextField
)上启用了用户交互,并且他们将能够向其中输入数据。
我认为在滚动视图上使用控件执行上述所有操作将非常复杂,并且您最终可能不得不处理许多琐碎的行为,以使其对普通用户和高级用户都很好地工作。UITableViews
我认为,如果您同时处理和处理,这将困难 100 倍UITableCells
。
如果您希望我详细说明我在上面概述的应用程序的任何方面,请告诉我,因为它似乎与您的应用程序有相当多的功能。希望将来能看到/听到更多关于您的应用的信息!
编辑
我又想到了一件事——如果您热衷于UITableView
在您的解决方案中使用 a,那么我建议您的高级用户一次布置一个UITableViewCell
。事实上,他们会将UILabels
其他控件拖到一个基本的 UIView 上,当他们完成后,您可以使用它来记录控件的位置。然后在单元格中显示这些控件时使用这些位置 - 在cellForRowAtIndexPath
您将创建并初始化所有选定的控件,并将它们全部放置在新创建的单元格中,并放置在高级用户选择的位置和布局中。高级用户还可以控制更改他们正在布置的单元格的高度,以获得更大的灵活性。他们会一个接一个地创建一系列单元格布局(我猜这些单元格中的每一个都是一个“组”控件),然后这些单元格将在表格视图中按顺序显示。然后,您可以让高级用户将表格置于编辑模式,以便他们可以重新排序单元格(甚至删除一些),从而为高级用户提供一些最终的调整控制。
根据应用程序的不同,也许用户还可以让他们之前创建的这些单元格布局始终可用,因此在他们建立了一些公共控制组之后,他们可以继续重复使用它们以非常快速地建立一个表单。然后偶尔他们会创建一个新的单元格布局,当他们迄今为止创建的单元格布局都不合适时,它会再次保存为模板,供他们在未来的表单中再次使用。