Повторное использование подпредставления - PullRequest
0 голосов
/ 04 августа 2009

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

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

То, что я использую для добавления подпредставления к кнопке:

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

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

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

Привет

-Raymond

Ответы [ 2 ]

1 голос
/ 04 августа 2009

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

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

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

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

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

0 голосов
/ 04 августа 2009

Каждый 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 и удалить их таким образом (просто убедитесь, что вы удалили их из массива или также освободили массив, иначе они останутся в памяти просто потому, что они хранятся в массиве).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...