2012-05-08 3 views
4

エンドユーザーがカスタムコントロールのツールボックスからドラッグアンドドロップしてフォームを作成できるようにするネイティブiOSアプリケーションを構築しています。一般的なシナリオは、パワーユーザーがUILabelsとUITextFieldの表現をUIViewでドラッグすることです。コントロールのグループがサポートされ、セクション内に複数のコントロールを視覚的に含めることができます。全体がUIScrollViewに含まれ、 'ページ'間の水平スクロールが可能になるでしょう。iOSネストされたビューエンドユーザーがフォームを構成できるようにドラッグドロップ機能をサポートする階層

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

異なるタイプのUIView/UITableView/UIImageView/UILabelView/UITextFieldなどがレイアウトされ、グループ化されている(おそらく外側のUIScrollViewに含まれている)ようにし、パワーユーザーによって調整/ドラッグ/ドロップすることができます。

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

私はこの問題を境界線の主観的な範囲で評価していますが、私は本当にこの種のものをタックしてくれた人からの指導に感謝します。

多くのありがとうございます。

答えて

2

興味深いアプリのようなサウンドです!私はUITableViewを使用すると、アプリがひどく複雑になると言います。 UIScrollViewは、コントロールをドラッグアンドドロップするのに適しています。おそらく、「ページを追加」ボタンを使用すると、ユーザーはこれを必要に応じてタップすることができ、UIScrollViewcontentSizeを+1ページの幅に拡張してスクロールして、そのページにコントロールをドラッグすることができます。

コントロールをドラッグすると、各コントロールにUIPanGestureRecognizerを使用できます。トリガーされると、コントロールの中央の位置が変更されます。これらのコントロールの一部とのユーザーのやりとりを無効にする必要があります。 UITextFieldの場合、パワーユーザーはそれをドラッグしたいが値を入力したくない。

コントロールをグループ化するためには、このような何かを行うことができます:

  • ユーザーはこのモードに入るようにボタンをタップすることにより、「グループモード」は、その後、コントロールの数(いくつかの視覚的な表示を必要とするタップそれらが選択されていることを示すために)、次にタップが行われます。
  • 選択したコントロールがUIScrollViewから削除されます
  • 新しいUIViewが作成され、選択されたコントロールの中心点に配置され、コントロールが同じ距離だけ離れて収まるように大きくなります。スクロールビューのサブビューとして追加されます
  • コントロールはすべてこのビューのサブビューとして追加されます
  • 個々のコントロールではなく、このビューにジェスチャレコグナイザが追加されています。ドラッグすると、このグループのコントロールはすべて固定レイアウトのグループとして移動します。

一般的に使用される可能性のあるコントロールのグループがある場合は、事前にそれらをそれぞれ独自のペン先に作成し、ユーザーがスクロールビューにドラッグして、作ったグループ。

特に、いくつかのコントロールがかなり大きい場合(たとえば、画像ビューがラベルやテキストフィールドよりも大きくなることが予想される場合)、パンジェスチャレコグナイザはビットを制限します。なぜなら、ビューをドラッグすると、近くに配置されているか重複している場合は間違って間違ったビューを選択します。その場合は、すべてのタッチイベントを自分で処理する必要があります。タッチが始まると、すべてのコントロール(またはグループ)に対してテストして、タップ位置に最も近い中心を確認してからあなたはこの中心の位置を更新することができますタッチ移動イベントを取得します。

私はあなたが描いているものほど複雑ではありませんでしたが、ユーザーが小さな画像を大きな画像にドラッグして「装飾」として適用できるアプリを作っていました。彼らは、これらの装飾の任意の数にドラッグして、ピンチのジェスチャーでそれらを拡大縮小することもできます。この場合、メイン画像を保持する背景としてUIImageViewを使用しました。その後、装飾は画像の端にあり、パンのジェスチャ認識装置が画像上にドラッグされていることを検出するために使用されました。ドラッグすると、実際には装飾の新しいインスタンス(UIImageView)が作成され、ツールボックスにはもう1つ残っていました。ピンチジェスチャ認識装置を使用して、装飾をスケール調整した。ユーザーが既に配置したデコレーションの周りを移動するには、手作業によるタッチ処理を使用して適切なデコレーションを検出する必要がありました(UIViewの面では、ユーザーが別のものをドラッグしようとしたときに、誤って1つの角をドラッグすることは容易でした)。マッチングジェスチャ認識と手動タッチ処理を混在させるとうまくいきました。ピンチングのようなより複雑な振る舞いにジェスチャ認識機能を使用するほうが簡単だったので、これはうまくいきました。

パワーユーザーがすべてを設定したら、通常のユーザーがアプリを読み込んだときに、タッチ操作コードをオフにして(ジェスチャ認識ツールを削除するか作成しない)パワーユーザーによってレイアウトされた静的フォームを取得します。次に、すべてのコントロール(たとえば)でユーザーとのやりとりが有効になっていることを確認し、ユーザーにデータを入力できるようにします。

上記のすべてのコントロールをスクロールビューに表示すると、私は思っているほど複雑になります。通常のユーザーとパワーユーザーの両方でうまく動作するようにするために、たくさんのかわいい振る舞いに対処する必要があります。 UITableViewsUITableCellsを同時に扱っていると、これは100倍の難しさになると思います。

私はあなたのアプリと共通の機能のかなりのチャンクを持っているように私はあなたが上記のアプリの任意の側面について詳述したい場合はお知らせください。将来あなたのアプリについてもっと見たり聞いたりしたいと思っています!

EDIT

もう一つは、私に起こった - あなたはあなたのソリューションにUITableViewを使用することに熱心であれば、その後、私はあなたのパワーユーザーは、一度に1つのUITableViewCellをレイアウトすることを示唆しています。実際には、UILabelsと他のコントロールをちょうど基本的なUIViewにドラッグすると、終了したらコントロールの位置を記録するために使います。次に、これらのコントロールをセルに表示するときにこれらの位置を使用します。cellForRowAtIndexPathでは、選択したすべてのコントロールを作成して初期化し、パワーユーザーが選択した位置とレイアウトで新しく作成されたセルに配置します。パワーユーザーは、柔軟性を高めるために、レイアウト中のセルの高さを変更するコントロールを持つこともできます。彼らは、一連のセルレイアウトを順番に作成します(これらのそれぞれがコントロールの「グループ」になると思います)。そして、それらのセルがテーブルビューで順番に表示されます。パワーユーザーは、セルを並べ替えることができるように(またはいくつかを削除することもできるように)、テーブルを編集モードにすることによって最終的な微調整を行うことができます。

アプリケーションに応じて、おそらくユーザは以前に作成したセルレイアウトを使用することもできます。そのため、いくつかの共通コントロールグループを構築した後、それらを再利用して、フォーム。そして、時折、彼らは今までに作成したものがどれも適切でないときに新しいセルレイアウトを作成し、再び将来のフォームで再び使用するためのテンプレートとして保存されます。

+0

UITableViewを使用したい場合は、どのように動作するかについていくつか考えてください。 –

+0

私の考えを助けてくれたあなたのコメントにとても感謝しています。 – Journeyman

2

透明な背景色を持つUIViewだけのEditViewクラスを作成します。コントロールをドラッグしたいときは、いくつかのタイプの編集モードを設定します。ここでは、適切なすべてのコントロールのEditViewをオーバーレイします。 EditViewは、ジェスチャー/タッチ操作のサイズ変更や移動をサポートします。ビューを別のビューにドラッグ&ドロップすると、「ビューBのネストビューA?関連するaddSubview呼び出しを行うことができます。

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

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

+0

ありがとう、非常に有用なアドバイス。 – Journeyman

関連する問題