Вы правы в том, что 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