面白いアプリですね!を使用するUITableView
と、アプリが非常に複雑になると思います。AUIScrollView
は、コントロールをドラッグ アンド ドロップするのに適したベースになります。おそらく「ページの追加」ボタンを使用すると、ユーザーは必要に応じてこれをタップし、の幅を +1 ページの幅に拡張してcontentSize
からUIScrollView
スクロールして、ユーザーがそのページにさらにコントロールをドラッグできるようにすることができます。
コントロールをドラッグするには、各コントロールにアタッチされた UIPanGestureRecognizer を使用できます。トリガーされると、コントロールの中心位置が変更されます。これらのコントロールの一部のユーザー操作をオフにする必要がある場合があります。たとえばUITextField
、パワー ユーザーがコントロールをドラッグしたいが、値を入力したくない場合などです。
コントロールをグループ化するには、次のようにします。
- 「グループモード」。ユーザーはボタンをタップしてこのモードに入り、次にいくつかのコントロールをタップして (それらが選択されていることを示すために何らかの視覚的な表示が必要です)、タップして完了します。
- 選択されたコントロールは UIScrollView から削除されます
- 新しい UIView が作成され、選択したコントロールの中心点に配置されます。これは、コントロールが同じ距離に収まるのに十分な大きさです。スクロールビューのサブビューとして追加されます
- コントロールはすべて、このビューのサブビューとして追加されます
- 個々のコントロールの代わりに、ジェスチャ レコグナイザーがこのビューに追加されます。次に、ドラッグすると、このグループのコントロールはすべて固定レイアウトのグループとして移動します。
一般的に使用される可能性があると思われるコントロールのグループがある場合は、事前にそれらを独自のペン先で作成し、ユーザーが事前に作成されたグループとしてスクロール ビューにドラッグできるようにすることもできます。
特にコントロールの一部が非常に大きい場合 (たとえば、画像ビューがラベルやテキスト フィールドよりもかなり大きいと予想される場合)、ビューをドラッグしようとすると、パン ジェスチャ レコグナイザーが少し制限されます。それらが近くに配置されているか重なっている場合、うっかり間違ったものを選択してしまいます。その場合、すべてのタッチ イベントを自分で処理するために特別な精度が必要になる場合があります。そのため、タッチが開始されたら、すべてのコントロール (またはグループ) をテストして、タップ位置に最も近い中心を持つものを確認します。この中心位置を更新できるタッチ移動イベントを取得します。
あなたが説明しているものほど複雑なものは作成していませんが、ユーザーが小さな画像を大きな画像にドラッグして「装飾」として適用できるアプリを作成しました。これらの装飾はいくつでもドラッグでき、ピンチ ジェスチャーで拡大縮小することもできます。この場合、メイン画像を保持する背景として UIImageView がありました。次に、装飾が画像の端にあり、パン ジェスチャ レコグナイザーを使用して、装飾が画像上にドラッグされていることを検出しました。ドラッグすると、実際には装飾 (UIImageView) の新しいインスタンスを作成して、ツールボックスに常に別のインスタンスが残るようにします。ユーザーが装飾を拡大縮小するために、ピンチ ジェスチャ レコグナイザが使用されました。ユーザーが配置済みの装飾を移動できるようにするには、適切な装飾を検出するために手動のタッチ処理を使用する必要がありました (それらは簡単に重なり合う可能性があり、ユーザーに丸く見えるものは UIView に関して実際には正方形であるため、ユーザーが誤って 1 つの角をドラッグするのは簡単でした)。別のものをドラッグしようとしたとき)。一致するジェスチャ レコグナイザーと手動のタッチ処理を組み合わせると、問題なく動作するように見えました。これは、ピンチなどのより複雑な動作にジェスチャ レコグナイザーを使用する方がはるかに簡単であるため、良い結果でした。
アプリに戻ると、パワー ユーザーがすべてをセットアップしたら、通常のユーザーがアプリをロードするときに、タッチ処理コードをオフにするだけで (ジェスチャ レコグナイザーを削除するか作成しないでください)、それらは静的フォームを取得します。パワーユーザーによってレイアウトされたように。次に、すべてのコントロール (例: ) でユーザー操作が有効になっていることを確認します。これにより、コントロールUITextField
にデータを入力できるようになります。
上記のすべてをスクロール ビューのコントロールで実行するのは非常に複雑だと思います。通常のユーザーとパワー ユーザーの両方がうまく機能するようにするには、多くの厄介な動作に対処しなければならない場合があります。同時にUITableViews
とを扱っていた場合、これは 100 倍難しくなると思います。UITableCells
上記で概説したアプリの側面について詳しく説明してほしい場合はお知らせください。アプリと共通の機能がかなりあるようです。将来、あなたのアプリについてもっと見たり聞いたりしたいと思っています!
編集
もう 1 つ思いつきました。ソリューションで a を使用しUITableView
たい場合は、パワー ユーザーが一度に 1 つずつレイアウトすることをお勧めしますUITableViewCell
。実際、それらはドラッグUILabels
やその他のコントロールを基本的な UIView にドラッグし、終了したらコントロールの位置を記録するために使用します。次に、これらのコントロールをセルに表示するときに、これらの位置を使用します。cellForRowAtIndexPath
選択したすべてのコントロールを作成して初期化し、パワー ユーザーが選択した位置とレイアウトで新しく作成されたセルにそれらすべてを配置します。パワー ユーザーは、レイアウトしているセルの高さを変更して、柔軟性を高めることもできます。一連のセル レイアウトを次々に作成し (これらのそれぞれがコントロールの「グループ」になると思います)、それらのセルがテーブル ビューに順番に表示されます。次に、パワー ユーザーにテーブルを編集モードにして、セルの順序を変更 (または一部を削除) できるようにすることで、最終的な微調整の制御を与えることができます。
アプリケーションによっては、ユーザーが以前に作成したこれらのセル レイアウトをいつでも使用できるようにすることもできます。そのため、いくつかの共通のコントロール グループを構築した後は、それらを再利用し続けて、非常に迅速にフォームを構築できます。そして、これまでに作成したセルのレイアウトがどれも適切でない場合に、新しいセル レイアウトを作成し、それをテンプレートとして保存して、将来のフォームで再び使用できるようにすることがあります。