2013-04-09 8 views
0

Я нашел это в Руководстве по программированию Quartz 2D:Могу ли я передать CGContextRef методам, вызываемым из drawRect?

Чтобы нарисовать на экране в приложении IOS, вы создали объект UIView и реализовать его DrawRect: метод для выполнения чертежа. Метод drawRect: view вызывается, когда вид виден на экране, а его содержимое нуждается в обновлении. Прежде чем вызывать свой собственный метод drawRect:, объект вида автоматически настраивает среду рисования, чтобы ваш код мог начать рисовать сразу. В рамках этой конфигурации объект UIView создает контекст графики (непрозрачный тип CGContextRef) для текущей среды рисования. Вы получаете этот графический контекст в своем методе drawRect: вызывая функцию UIKit UIGraphicsGetCurrentContext.

Поскольку у меня возникли проблемы с недопустимым контекстом (потому что это 0х00, когда я возвращаюсь к перерисовать), мне было интересно, если я мог бы получить текущий контекст в начале -drawRect и какой-то образом передать его к методам, которые я вызываю от -drawRect?

+1

Я ответил ниже, но просто хотел проверить: вы не называете 'drawRect' напрямую, не так ли? Он вызывается UIKit только тогда, когда это необходимо. Если вы хотите обновить свое представление, вы должны вместо этого называть 'setNeedsDisplay'. –

ответ

3

Вы можете передать CGContextRef методам от drawRect: до тех пор, пока эти методы не сохраняют ссылку для использования вне продолжительности вызова drawRect:, ваш код должен быть в порядке. Однако ссылка на контекст, которую вы передаете, будет эквивалентна контексту, полученному через UIGraphicsGetCurrentContext, поэтому я сомневаюсь, что многое можно получить, добавив дополнительный параметр.

+0

Эй, ребята ... это не то, что происходит ... состояние документов: ** Вы получаете этот графический контекст в методе drawRect: вызывая функцию UIKit UIGraphicsGetCurrentContext. ** Я вызывал UIGraphicsGetCurrentContext из вызываемых методов и он возвращался 0x00 (см. мой вопрос выше) ... У меня здесь три разных ответа; Думаю, лучший способ это сделать и посмотреть ... Я вернусь ко всем вам. – SpokaneDude

+0

@ spokane-dude Вы можете поделиться каким-то кодом, в котором вы вызываете что-то из 'drawRect:' и получаете 'NULL' для вашего' UIGraphicsGetCurrentContext': тогда может возникнуть множество различных проблем, включая проверку/печать контекста неверно. – dasblinkenlight

+0

Для начала вы можете ** не ** вызывать методы из -drawRect и передавать контекст, который считается действительным. Однако, если я получаю текущий контекст в drawRect перед вызовом других методов, он, похоже, работает ... требует больше тестирования, но я думаю, что нашел проблему: вызовите UIGraphicsGetCurrentContext в начале drawRect! Спасибо всем! – SpokaneDude

2

UIGraphicsGetCurrentContext может быть вызван только из метода drawRect: (или методов, вызванных от него), иначе он вернет nil.

2

Вы можете использовать UIGraphicsGetCurrentContext любым способом, называемым -drawRect. Стоит отметить, что вы не должны звонить -drawRect непосредственно, когда вам нужно обновить свое представление; вместо этого вызовите -setNeedsDisplay.

Если вы хотите использовать систему рисования UIKit с собственным контекстом вне экрана, вы можете использовать UIGraphicsPushContext для установки текущего контекста.

0

По моему опыту, минуя CGContextRef создает утечку памяти, которая довольно «быстрая».