Любой возможный способ вызвать drawRect из класса UIViewcontroller?

У меня есть класс UIViewController с именами AppController.h, AppController.m. У меня там тысячи строк кода, и это единственная причина, по которой я не проверил это до того, как спросил об этом. Есть ли способ использовать drawRect в UIViewController? таким образом мне не пришлось бы создавать больше делегатов, методов и обратных вызовов. Я должен был начать с использования drawRect для обработки моего кода рисования, но я этого не сделал, и на iPad наблюдается серьезное отставание с базовой графикой. Итак, пожалуйста, дайте мне знать, есть ли способ использовать drawRect в UIViewController.

Спасибо!


person Aspyn    schedule 02.10.2011    source источник
comment
«У меня есть класс UIViewController с именами AppController.h, AppController.m. У меня там тысячи строк кода…» Я пользуюсь случаем, чтобы порекомендовать книгу «Рефакторинг» Мартина Фаулера или его онлайн-издание. (Наверное, лучше начать с книги — алфавитный порядок здесь не слишком полезен.)   -  person Peter Hosey    schedule 02.10.2011


Ответы (3)


Контроллер представления, естественно, имеет указатель на свое представление, поэтому, конечно, вы можете вызвать метод представления -setNeedsDisplay, что заставит фреймворк вызывать -drawRect: в соответствующее время. Однако немного сложно понять, что именно вы просите... вы надеетесь сделать фактическое рисование в своем контроллере представления? Если вы попытаетесь это сделать, вы действительно будете работать против фреймворка — вместо этого переместите код рисования в свой класс представления.

person Caleb    schedule 02.10.2011

вы просто позвоните setNeedsDisplay и вам будет предложено нарисовать в следующий подходящий момент. (читай: не звони drawRect: напрямую)

если вам действительно нужно поведение, которое вы запрашиваете, просто вызовите setNeedsDisplay после создания кэшированного растрового изображения или CGImage/UIImage, которое обновляется извне (например, в логике вашего контроллера), а затем просто нарисуйте это изображение по запросу.

person justin    schedule 02.10.2011
comment
+1 за -setNeedsDisplay -- не знаю, о чем я думал. - person Caleb; 02.10.2011

Вы должны (рефакторировать/переписать и) создать подкласс UIView (не контроллера представления), чтобы делегат drawRect этого представления вызывался с надлежащим контекстом рисования, когда вам нужно сделать какой-либо рисунок. Попытка рисовать без надлежащего контекста рисования может быть мучительно медленной, если вообще возможно.

Технически, вы можете выделить и создать свой собственный контекст рисования растровых изображений, вставить пользовательский объект с помощью метода drawRect и вызвать этот drawRect и контекст. Но тогда может быть быстрее просто рисовать прямо в вашем пользовательском контексте рисования.

person hotpaw2    schedule 02.10.2011