2009-08-03 2 views
0

У меня есть объект UIImageView, который является простым черным прямоугольником. Это то, что я использую, чтобы выбрать кнопку в представлении.Повторное использование subview

Проблема в том, что у меня есть 49 из этих кнопок на мой взгляд, и все они могут быть выбраны в одно и то же время.

Что я использую для добавления подвида к кнопке:

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

Я хотел бы, чтобы selectedSquareView быть использован несколько раз подобозрения для других кнопок, но только сохранить одно распределения его. Я бы предпочел не создавать 49 UIImageView, созданных одновременно для этой цели. Это возможно?

Если нет, следует ли хранить их в NSMutableArray для легкого удаления позже?

С уважением

-Raymond

ответ

1

Вам нужно 49 UIImageViews, вам нужно всего лишь 1 UIImage. UIImageViews содержат информацию о местоположении, размере, is_highlighted и т. Д. Для каждой кнопки.

Это, как говорится, даже если у вас было много UIImage лет, UIImage должен быть довольно умными об этих вещах, как Apple, описывает в своей документации:

В ситуациях с низким уровнем памяти, данные изображений могут быть удалены из объекта UIImage, чтобы освободить память в системе. Это поведение очистки влияет только на данные изображения, хранящиеся внутри объекта UIImage, а не на сам объект. При попытке нарисовать изображение, данные которого были очищены, объект изображения автоматически перезагружает данные из его исходного файла. Однако этот дополнительный шаг загрузки может привести к небольшому штрафу за производительность.

Вам не следует создавать объекты UIImage размером более 1024 x 1024. Помимо большого объема памяти, которое будет потреблять такой образ, вы можете столкнуться с проблемами при использовании изображения в качестве текстуры в OpenGL ES или при рисовании изображения на вид или слой. Это ограничение размера не применяется, если вы выполняете манипуляции на основе кода, например, изменяя размер изображения более 1024 x 1024 пикселей, рисуя его в графическом контексте с поддержкой растровой графики. Фактически, вам может потребоваться изменить размер изображения таким образом (или разбить его на несколько меньших изображений), чтобы привлечь его к одному из ваших представлений.

В качестве альтернативы, если вы действительно чувствуете, что вам нужно сделать удалить UIImageView-х, когда он не используется вы можете сделать, как вы предлагаете хранить их в массиве и выпустить их на viewDidDisappear, а затем воссоздать их все на viewWillAppear.

0

Каждый UIView появляется только один раз, поэтому вам обязательно нужно будет создать его 49 копий.

Ваш текущий код, вероятно, хорошо, так как UIImage вероятно кэшировать изображения, но вы хотели бы создать образ только один раз, а затем установить его каждый раз, что-то вроде:

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

Если нет , следует ли хранить их в файле NSMutableArray для легкого удаления позже?

Это зависит от того, есть ли какие-либо другие виды в представлении контейнера - если нет, то нет никакой необходимости хранить их в NSMutableArray, как вы можете просто использовать container.subviews, чтобы получить массив мнений. В противном случае, конечно, вы можете сохранить их в NSMutableArray и удалить их таким образом (просто убедитесь, что вы удалили их из массива или выпустили массив, а также, они останутся в памяти просто потому, что они хранятся в массиве).

Смежные вопросы