UIViewサブクラスにレイヤーデリゲートメソッドを保持することを好み、基本的な再デリゲートデリゲートクラスを使用します。このクラスはカスタマイズせずに再利用できるため、CALayerをサブクラス化したり、レイヤー描画のためだけに別のデリゲートクラスを作成したりする必要がありません。
@interface LayerDelegate : NSObject
- (id)initWithView:(UIView *)view;
@end
この実装では:
@interface LayerDelegate ()
@property (nonatomic, weak) UIView *view;
@end
@implementation LayerDelegate
- (id)initWithView:(UIView *)view {
self = [super init];
if (self != nil) {
_view = view;
}
return self;
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {
NSString *methodName = [NSString stringWithFormat:@"draw%@Layer:inContext:", layer.name];
SEL selector = NSSelectorFromString(methodName);
if ([self.view respondsToSelector:selector] == NO) {
selector = @selector(drawLayer:inContext:);
}
void (*drawLayer)(UIView *, SEL, CALayer *, CGContextRef) = (__typeof__(drawLayer))objc_msgSend;
drawLayer(self.view, selector, layer, context);
}
@end
レイヤー名は、レイヤーごとのカスタム描画メソッドを可能にするために使用されます。たとえば、レイヤーに名前を割り当てた場合、たとえば、layer.name = @"Background";
次のようなメソッドを実装できます。
- (void)drawBackgroundLayer:(CALayer *)layer inContext:(CGContextRef)context;
ビューにはこのクラスのインスタンスの強力な参照が必要であり、任意の数のレイヤーのデリゲートとして使用できることに注意してください。
layerDelegate = [[LayerDelegate alloc] initWithView:self];
layer1.delegate = layerDelegate;
layer2.delegate = layerDelegate;