У меня есть UIView, слои которого будут иметь подуровней. Я хотел бы присвоить делегатам к каждому из тех подуровней, таким образом, метод делегата может сказать слой, что потянуть. Мой вопрос:
Что я должен обеспечить как делегат CALAYER? В документации говорится для не использования UIView, в котором находятся слои, поскольку это резервируется для основного CALayer представления. Но, создавая другой класс только, чтобы быть делегатом CALayers я создаю, побеждает цель не разделения на подклассы CALayer. Что люди обычно используют в качестве делегата к CALayer? Или я должен просто разделить на подклассы?
Кроме того, почему случается так, что класс, реализовывая методы делегата не должен соответствовать своего рода протоколу CALayer? Это - более широкий всеобъемлющий вопрос, который я не вполне понимаю. Я думал все классы, требующие, чтобы реализация методов делегата потребовала, чтобы спецификация протокола для реализаторов соответствовала.
Самым легким решением было бы создать небольшой вспомогательный класс в файле как UIView, который использует CALayer:
В MyView.h
@interface MyLayerDelegate : NSObject
. . .
@end
В MyView.m
@implementation MyLayerDelegate
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
. . .
}
@end
Просто поместите их в в верхней части файла сразу под директивами #import. Таким образом, это больше похоже на использование «частного класса» для обработки рисунка (хотя это не так - экземпляр класса делегата может быть создан любым кодом, который импортирует заголовок).
Взгляните на документы по формальным и неформальным протоколам . CALayer реализует неформальный протокол, что означает, что вы можете установить любой объект в качестве его делегата, и он определит, может ли он посылать сообщения этому делегату, проверив делегата для конкретного селектора (т.е. -respondsToSelector).
Обычно я использую контроллер просмотра в качестве делегата для данного уровня.