gpt4 book ai didi

iphone - 使用 CALayer 委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 18:14:46 25 4
gpt4 key购买 nike

我有一个 UIView,其图层将有子图层。我想为每个子图层分配委托(delegate),因此委托(delegate)方法可以告诉图层要绘制什么。我的问题是:

作为 CALayer 的委托(delegate)人,我应该提供什么?文档说不要使用图层所在的 UIView,因为这是为 View 的主 CALayer 保留的。但是,创建另一个类只是作为我创建的 CALayers 的代表,这违背了不子类化 CALayer 的目的。人们通常使用什么作为 CALayer 的委托(delegate)?或者我应该只是子类化?

另外,为什么实现委托(delegate)方法的类不必遵守某种 CALayer 协议(protocol)?这是一个更广泛的总体问题,我不太明白。我认为所有需要实现委托(delegate)方法的类都需要实现者遵守的协议(protocol)规范。

最佳答案

为了将图层委托(delegate)方法保留在 UIView 子类中,我使用了基本的重新委托(delegate)委托(delegate)类。该类无需自定义即可重用,从而无需子类化 CALayer 或仅为图层绘制创建单独的委托(delegate)类。

@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;

请注意,您的 View 需要对该类的实例进行强引用,并且它可以用作任意数量层的委托(delegate)。

layerDelegate = [[LayerDelegate alloc] initWithView:self];
layer1.delegate = layerDelegate;
layer2.delegate = layerDelegate;

关于iphone - 使用 CALayer 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com