Как удалить подвиды UIView без принудительной перерисовки?

Это несколько гипотетический вопрос, но я могу представить себе такую ​​ситуацию, которая может возникнуть в какой-то момент в будущем: давайте на мгновение предположим, что у меня есть причудливо сложная иерархия UIViews, которую мне нужно отобразить только один раз. Давайте также предположим, что после рисования мне больше не нужна информация (UIImages, метки, пользовательские представления, координаты и т. д.) под родительским представлением. Вместо того, чтобы сохранять их, идея состоит в том, чтобы освободить всю дополнительную память, которую они используют, избегая перерисовки. Результат будет таким же, как при рисовании в закадровый буфер и последующем выводе его на экран. Можно ли добиться этого, используя UIView/CGLayer прямо из коробки, или это единственный способ преобразовать содержимое родительского CGLayer в UIImage?

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

Спасибо!


person David R.    schedule 17.09.2011    source источник


Ответы (2)


Это кажется мне чем-то очень рискованным. Могут произойти вещи, не зависящие от вас, которые требуют перерисовки представления, например, появление уведомления или представление, вызванное активной зеленой полосой телефонного звонка в верхней части экрана.

Я предполагаю, что если у вас есть такое количество представлений в вашей иерархии, будет так много других проблем с производительностью, которые вступят в игру, что сохранение нескольких байтов после перерисовки будет наименьшей из ваших проблем.

person Jack Cox    schedule 17.09.2011
comment
Спасибо, это в значительной степени то, на чем я остановился с точки зрения реальной разработки вещей, но с чисто гипотетической точки зрения мне все еще было любопытно, возможно ли такое решение вообще. Кроме того, извините за поздний ответ - кажется, электронные письма с уведомлениями с этих досок куда-то съедаются. - person David R.; 22.09.2011
comment
Честно говоря, я не знаю другого способа сделать это, кроме как сделать «скриншот» результирующего представления и заменить всю иерархию одним представлением изображения. Было бы легко освободить все данные, поддерживающие представления, а затем получить эти данные, если представление необходимо перерисовать. Как Ариэль сказал ниже, переопределение drawRect может легко привести к причудливым дефектам. - person Jack Cox; 22.09.2011

Я могу подумать о том, чтобы переопределить метод -(void)drawRect:(CGRect)rect;, отрисовывая только один раз за пределы экрана, прежде чем перемещать это изображение на экран в соответствии с каким-то логическим флагом, но это может привести к чудовищным ошибкам и должно быть правильно спроектировано. Другое дело, что это может привести к переопределению также -(void)layoutSubviews;, хотя это может быть накладным, если вы переопределили первое...

person Ariel    schedule 17.09.2011