-[CALayer drawInContext:] что-то делает?

Согласно документации реализация по умолчанию ничего не делает.

Но... я выбрасываю исключение из метода drawRect и вижу следующий стек вызовов

3   EasyWakeup                          0x0003a7b6 -[AlarmIntervalView drawRect:] + 71
4   UIKit                               0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426
5   QuartzCore                          0x011a8b5e -[CALayer drawInContext:] + 143

Насколько я понимаю, это означает реализацию по умолчанию метода делегата вызова -[CALayer drawInContext:]. Это правильно? Так как я знаю технику swizzling, я ничего не уверен в объективном...


person Maxim Kholyavkin    schedule 11.01.2012    source источник
comment
Нужно увидеть код. Как устроен ваш код? Есть ли в представлении пользовательский слой? Вы устанавливаете представление в качестве делегата для нескольких слоев?   -  person pe8ter    schedule 11.01.2012
comment
@pe8ter Я создаю пустой проект и вставляю второстепенный код, чтобы воспроизвести проблему. Посмотреть можно здесь: ссылка   -  person Maxim Kholyavkin    schedule 12.01.2012
comment
Вы явно выбрасываете исключение. Почему?   -  person pe8ter    schedule 12.01.2012
comment
@ pe8ter Я делаю это специально для этого вопроса. Я нашел проблему с отладчиком.   -  person Maxim Kholyavkin    schedule 13.01.2012
comment
Хорошо. Я понял теперь; вы бросили исключение для целей отладки. Я думал, что исключение было частью вашей проблемы. Я добавил ответ на этот вопрос.   -  person pe8ter    schedule 14.01.2012


Ответы (1)


Вы правы в том, что CALayer по умолчанию drawInContext: ничего не делает. Это верно, если у уровня нет делегата и делегат этого уровня реализует drawLayer:inContext:. Таким образом, проблема с документацией заключается в том, что она должна иметь небольшую звездочку рядом с утверждением «Реализация по умолчанию ничего не делает».

Помните, что все представления поддерживаются каким-либо CALayer. Этот слой автоматически настраивается так, чтобы его вид был установлен в качестве делегата. На первый взгляд не очевидно, что UIView реализует делегат CALayer drawLayer:inContext:. Это то, что вы видите со всеми этими вызовами в стеке вызовов.

Ваш экземпляр AlarmIntervalView автоматически имеет резервный слой, и этот резервный слой имеет своего делегата, установленного на ваш экземпляр AlarmIntervalView. Некоторая часть системы вызывает drawInContext: уровня поддержки, который проверяет наличие делегата (который у него есть), отправляет делегата respondsToSelector: с drawLayer:inContext: в качестве аргумента (на который отвечает UIView) и, наконец, фактически отправляет сообщение drawLayer:inContext:. Реализация UIView drawLayer:inContext: вызывает ваше представление drawRect:.

Я не совсем понимаю, почему вы упомянули swizzling.

[Мой ответ длинный, в основном для моей пользы. Это помогает мне учиться тоже.]

person pe8ter    schedule 14.01.2012