Могу ли я передать CGContextRef методам, вызываемым из drawRect?

Я нашел это в Руководстве по программированию Quartz 2D:

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

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


person SpokaneDude    schedule 09.04.2013    source источник
comment
Я тоже ответил ниже, но просто хотел проверить: вы не звоните drawRect напрямую, верно? Он вызывается UIKit только при необходимости. Если вы хотите обновить свое представление, вам следует вместо этого вызвать setNeedsDisplay.   -  person Cameron Spickert    schedule 09.04.2013


Ответы (4)


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

person Sergey Kalinichenko    schedule 09.04.2013
comment
Привет, ребята ... это не то, что происходит ... в документации говорится: Вы получаете этот графический контекст в своем методе drawRect:, вызывая функцию UIKit UIGraphicsGetCurrentContext. Я вызывал UIGraphicsGetCurrentContext из вызываемых методов и он возвращал 0x00 (см. мой вопрос выше) ... У меня здесь три разных ответа; Думаю, лучший способ - это сделать и посмотреть ... Я вернусь ко всем вам. - person SpokaneDude; 09.04.2013
comment
@ Speakane-dude Вы можете поделиться кодом, в котором вы вызываете что-то из drawRect: и получаете NULL для своего UIGraphicsGetCurrentContext, тогда: может быть много разных проблем, включая неправильную проверку / печать контекстной ссылки. - person Sergey Kalinichenko; 09.04.2013
comment
Во-первых, вы можете не вызывать методы из -drawRect и передавать контекст, который считается допустимым. Однако, если я получаю текущий контекст в drawRect перед вызовом других методов, он, кажется, работает ... требуется дополнительное тестирование, но я думаю, что нашел проблему: вызовите UIGraphicsGetCurrentContext в начале drawRect! Спасибо всем! - person SpokaneDude; 09.04.2013
comment
Что за делимма, потому что нижний ответ совершенно правильный; очевидно, вы должны вызвать UIGraphicsGetCurrentContext из -drawRect, чтобы вызываемые методы работали, но вы не можете передать контекст - он помечен как недопустимый во время выполнения. Что вы, ребята, от меня хотите? - person SpokaneDude; 09.04.2013
comment
@ speakane-dude Я сильно сомневаюсь в универсальности вашего вывода: я не сомневаюсь, что то, что вы описываете, верно в вашем конкретном случае, но я также уверен, что мой код получает графический контекст в середине drawRect, а также в других методы, вызываемые из drawRect без малейшего следа проблемы. Кроме того, существует еще один вопрос, в котором обсуждается относительная производительность получения графического контекста по сравнению с его передачей, что означает, что оба методы работают нормально. Если вы разместили какой-то код, мы могли бы поискать, что с ним не так. - person Sergey Kalinichenko; 09.04.2013
comment
dasblinkenlight: слишком много кода для публикации, кроме того, мне понадобится соглашение о неразглашении ... он работает для меня - я получаю графический контекст в -drawRect и других вызываемых методах, не передавая его в вызове. Я дам вам очки, так как вы, кажется, работаете в обоих направлениях. В любом случае, большое спасибо за вашу помощь ... по крайней мере, это помогло мне заставить его работать. : D - person SpokaneDude; 09.04.2013
comment
@dasblinkenlight Я почти уверен (по результатам моего эмпирического тестирования в iOS), что передача CGContextRef приводит к утечке. Я понятия не имею, почему это так, но я почти уверен, что это правда, даже если вызываемые методы только перемещают и рисуют пути. Похоже, это справедливо только для контекстов, производных от _2 _... - person Dan Rosenstark; 31.05.2014

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

person msk    schedule 09.04.2013

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

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

person Cameron Spickert    schedule 09.04.2013

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

person Dan Rosenstark    schedule 30.05.2014