2009-08-03 23 views
0

私は、単なる黒い矩形であるUIImageViewオブジェクトを持っています。 これは私がビュー内のボタンを選択するために使用するものです。サブビューを再利用

問題は、私のビューには49個のボタンがあり、それらはすべて同時に選択できます。

私はボタンにサブビューを追加するために使用される:

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
[selectedSquareView setImage:[UIImage imageNamed:@"SelectedSquare.png"]]; 
[button addSubview: selectedSquareView]; 

私は他のボタンのサブビューとして複数回再利用するselectedSquareViewを好きですが、それだけの1つの割り当てを続けるだろう。私はこの目的のためだけに49個のUIImageViewを同時に作成することを好まないでしょう。これは可能ですか?

もしそうでない場合は、後で簡単に取り除くためにそれらをNSMutableArrayに保存する必要がありますか?

よろしく

-Raymond

答えて

1

あなたは49のUIImageViewsを必要とする、あなただけの1 UIImageを必要としています。 UIImageViewsには、各ボタンの位置、サイズ、is_higlightedなどの情報が含まれています。低メモリの状況では

を、画像データをパージすることができる:あなたはUIImageのがたくさんあった場合でも、UIImageはAppleがそのドキュメントに記述して、これらの事についてかなりインテリジェントなことになって言われていること

UIImageオブジェクトからシステム上のメモリを解放します。このパージの動作は、UIImageオブジェクトによって内部的に格納されるイメージデータにのみ影響し、オブジェクト自体には影響しません。データがパージされたイメージを描画しようとすると、イメージオブジェクトは自動的に元のファイルからデータをリロードします。ただし、この余分な負荷ステップでは、パフォーマンスが低下する可能性があります。

サイズが1024×1024以上のUIImageオブジェクトを作成しないでください。このようなイメージが消費する大量のメモリに加えて、OpenGL ESでイメージをテクスチャとして使用したり、イメージをビューまたはレイヤーに描画するときに問題が発生することがあります。このサイズ制限は、1024 x 1024ピクセルよりも大きいイメージのサイズ変更など、コードベースの操作をビットマップバックグラウンドコンテキストに描画する場合は適用されません。実際、この方法でイメージのサイズを変更する(またはいくつかの小さなイメージに分割する)必要があるかもしれません。また

あなたは配列に格納し、viewDidDisappearにそれらを解放して、viewWillAppearでそれらのすべてを再作成する提案としてUIImageViewの使用されていない、あなたが行うことができたときに削除しますかする必要があるようにあなたは本当に感じている場合。

0

各UIViewは1回しか表示されないため、間違いなく49個のコピーを作成する必要があります。

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
static UIImage* kSelectedSquareImage = [UIImage imageNamed:@"SelectedSquare.png"] retain]; 
[selectedSquareView setImage:kSelectedSquareImage]; 

ない場合:

あなたの現在のコードは、UIImageは、おそらく画像をキャッシュしますが、あなたは、のようなものを一度だけ画像を作成し、それを毎回設定したいかもしれないので、おそらく大丈夫です後で簡単に取り外せるように、NSMutableArrayに NSMutableArrayを格納する必要がありますか?

コンテナビューに他のビューがあるかどうかによって異なります。そうでない場合は、container.subviewsを使用してビューの配列を取得するだけでNSMutableArrayに格納する必要はありません。そうでない場合は、NSMutableArrayにNSMutableArrayを格納して削除することができます(配列から削除するか、配列を解放するだけで、配列に格納されているためメモリに残ります)。