4

エンド ユーザーがカスタム コントロールのツールボックスからドラッグ アンド ドロップしてフォームを作成できるネイティブ iOS アプリを作成しています。典型的なシナリオは、パワーユーザーがいくつかの UILabels と UITextField 表現を UIView にドラッグすることです。コントロールのグループがサポートされ、複数のコントロールをセクション内に視覚的に含めることができます。すべてがおそらく UIScrollView に含まれ、「ページ」間の水平スクロールが可能になります。

「通常の」ユーザーは、フォームを使用してデータを入力します。

したがって、関連する 2 つの要件があります。さまざまなタイプの UIView/UITableView/UIImageView/UILabelView/UITextField などをレイアウトしてグループ化できるようにすること (そして、おそらく外側の UIScrollView に含まれている可能性があります)、およびレイアウトを調整/ドラッグできるようにすることです。 /パワーユーザーによって削除されました。

私の質問はかなり広いですが、本質的には次のとおりです。これら 2 つの関連する要件をサポートするために、ネストされた UIView 階層として最も適切なものは何ですか? UITableView内のネストされたビュー内でドラッグアンドドロップしたい場合、外側のUIScrollView内に含まれるUITableViewsの基本構造は基本的に健全ですか? ドラッグが複雑になるため、UITableView を避ける必要がありますか?

この質問は範囲が主観的な境界線であることを理解していますが、以前にこの種のことに取り組んでいて、私に知恵の言葉を持っている人々からのガイダンスに本当に感謝しています.

どうもありがとう。

4

2 に答える 2

2

透明な背景色を持つ単なる UIView である EditView クラスを作成します。コントロールをドラッグしたい場合は、適切なすべてのコントロールに多数の EditView をオーバーレイする編集モードを設定します。EditView は、サイズ変更または移動するジェスチャ/タッチ処理をサポートします。ビューを別のビューにドラッグして離すと、「ビュー A をビュー B にネストしますか?」のようなメッセージが表示される場合があります。その後、関連する addSubview 呼び出しを行うことができます。

スクロールビュー内にテーブルビューをネストすることは問題になりませんが、テーブルビュー内に何かをネストしようとした場合にどのような動作が予想されるかはわかりません...標準の UITableView メソッドを使用して指定する必要があります。

レイアウトなどを保存するために、最終的なレイアウトを再作成するために必要なさまざまなメタデータを含む独自の疑似ビュー階層を作成する必要がある場合があります。最終的なレイアウトはどこかに保存できます。

于 2012-05-16T22:18:26.550 に答える
2

面白いアプリですね!を使用する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選択したすべてのコントロールを作成して初期化し、パワー ユーザーが選択した位置とレイアウトで新しく作成されたセルにそれらすべてを配置します。パワー ユーザーは、レイアウトしているセルの高さを変更して、柔軟性を高めることもできます。一連のセル レイアウトを次々に作成し (これらのそれぞれがコントロールの「グループ」になると思います)、それらのセルがテーブル ビューに順番に表示されます。次に、パワー ユーザーにテーブルを編集モードにして、セルの順序を変更 (または一部を削除) できるようにすることで、最終的な微調整の制御を与えることができます。

アプリケーションによっては、ユーザーが以前に作成したこれらのセル レイアウトをいつでも使用できるようにすることもできます。そのため、いくつかの共通のコントロール グループを構築した後は、それらを再利用し続けて、非常に迅速にフォームを構築できます。そして、これまでに作成したセルのレイアウトがどれも適切でない場合に、新しいセル レイアウトを作成し、それをテンプレートとして保存して、将来のフォームで再び使用できるようにすることがあります。

于 2012-05-14T13:54:45.737 に答える