为了保持我的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