0

私は最初のiPhoneアプリを作成しようとしていますが、ある種の設計上の問題に直面しています。私がやりたいのは、アイコンのグリッドを作成することです。1つに触れると、左上のすべてのアイコンが「アクティブ化」され、下と右のすべてのアイコンが「非アクティブ化」されます。アイコンがアクティブになっている場合は1つの画像が表示され、アクティブになっていない場合は別の画像が表示されます。

私が抱えている問題は、これらの個々のアイコンのそれぞれにジェスチャ認識機能を割り当てたいということです。そのアイコンをタップすると、アイコンのグリッドを更新する関数を呼び出す必要があります。ただし、適切に更新するには、関数がグリッド内の画像の場所を引数として渡す必要があり、ジェスチャレコグナイザーの一部として引数を使用して関数を呼び出す方法はありません。

したがって、実際に必要なのは、UIImageViewを拡張して、2つの追加の整数とそれに含まれるグリッドを保持することだけです。そうすると、次のコードを作成できます。

imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapgr = [[UITapGestureRecognizer alloc] initWithTarget:
    self action:@selector(handleTap)];
[imageView addGestureRecognizer:tapgr];
:
:
- (void)handleTap
{
  [self.grid updateTableFromRow:self.row andCol:self.col
}

ですから、これはそれを行う1つの方法だと思いますが、Objective-Cでクラスを拡張することは想定されておらず、ゼロから構築する必要があると言われています。この場合、必要なすべてのプロパティやインスタンス変数を使用してカスタムビューを作成し、このカスタムビューにUIImageViewを入力します。

ストーリーボードの作成を除いて、これはほとんど問題ありません。このアイコンのテーブルを(プログラムで)管理および作成するすべてのコードを、別のカスタムビューであるGridOfIconsViewに配置します。そのため、ストーリーボードでカスタムビューをドラッグして、GridOfIconsViewに設定しましたが、大きな白い長方形が表示されるだけで、ストーリーボードでアプリを視覚化できるようにしたいと考えています。アイコンに使用する実際の画像ファイルをストーリーボードにドラッグしてカスタムビューに設定できることは知っていますが、それはどのように機能しますか?その画像はカスタムビューの単なる背景ですか?プログラムで変更できますか?したがって、アクティブ化された画像が緑色の正方形で、非アクティブ化された画像が赤色で、最初に赤い正方形をストーリーボードにドラッグした場合、その赤い正方形の画像にアクセスできますか?

さらに懸念される問題は、データ構造内のこれらすべてのアイコンを、2d配列(id icons [] [])またはNS(Mutable?)ArraysのNS(Mutable?)Arrayとして管理したいということです。いずれにせよ、これらすべてへのリンクを含むようにデータ構造を初期化するにはどうすればよいですか?グリッドはおそらく8x8または10x10であり、これらのアイコンを接続する64〜100の@propertyを使用する方法はありません。これを賢明に整理する唯一の方法はプログラムで行うことだと思いますが、それでも、ストーリーボードでそれを視覚化するにはどうすればよいですか?

4

1 に答える 1

0

まず、Objective-C でクラスを拡張することはまったく問題なく、常に行われています。UIViewUIViewControllerUIComponentなどはすべて、サブクラス化および拡張されるように特別に設計されています。

ただし、クラスを拡張するよりもはるかに簡単な方法が 2 つあります。まず、既に行っているようにグリッドを作成できます。各ビューには、ビュー コントローラーのメソッドを呼び出すジェスチャ レコグナイザーがアタッチされています。次に、各ビューにタグを設定し (または単にビューのフレームを識別に使用することもできます)、それをコールバック メソッドから読み取ります (ジェスチャ レコグナイザーはコールバック メソッドに戻されます)。たとえば、4x4 ビューのグリッドがあり、左上から順に番号を付け、各列を右に、次に各行に 0 から 11 まで番号を付けると、ビューを簡単に識別できます。

// The system automatically passes the gesture recognizer as the only parameter
- (void)handleTap:(UIGestureRecognizer)gestureRecognizer
{
  NSInteger viewNumber = [[gestureRecognizer view] tag];
  // do something with this view
}

もう 1 つの方法は、親ビューに 1 つのジェスチャ レコグナイザーを配置し、-handleTap:コールバックでビュー内のタップの位置をクエリすることです。位置がいずれかのビューのフレーム内にある場合、どのビューで何をすべきかがわかります。そうでない場合は、無視できます。このソリューションでは、わずかに多くの計算が必要になりますが、メンテナンスがはるかに少なくて済み、配線が必要なジェスチャ認識エンジンもはるかに少なくてすみます。ビューにタグを付けるよりも、このソリューションをお勧めします。

于 2012-08-28T22:18:29.097 に答える