【发布时间】:2020-06-06 04:42:07
【问题描述】:
我有一个 'CAGradientLayer' 的 Objective-C 子类,它覆盖了 '+ (CAGradientLayer *)layer' 初始化程序。它正确包含在我的Bridging-Header
#import "ONCGradientLayer.h"
@implementation ONCGradientLayer
+ (ONCGradientLayer *)gradientLayer {
return [ONCGradientLayer layer];
}
+ (ONCGradientLayer *)layer {
ONCGradientLayer * layer = [super layer];
layer.colors = @[(id)[[UIColor colorWithWhite:0.0 alpha:1] CGColor], (id)[[UIColor colorWithWhite:0.1 alpha:1] CGColor]];
layer.startPoint = CGPointMake(0, 0);
layer.endPoint = CGPointMake(0, 1);
return layer;
}
通过调用[ONCGradientLayer layer] 或[ONCGradientLayer gradientLayer],这一切都按Objective-C 的预期工作
当我尝试从 swift 调用它时,我得到一个编译器警告,该方法已重命名为 init,所以我必须调用 ONCGradientLayer() 但是,这不起作用,并且被覆盖的初始化程序永远不会叫。
我可以通过添加一个不同名称的初始化程序来解决这个问题:
+ (ONCGradientLayer *)swiftInit {
return [ONCGradientLayer layer];
}
我可以使用ONCGradientLayer.swiftInit() 快速成功地调用它
发生了什么阻止我调用ONCGradientLayer() 并获取被覆盖的初始化程序?
更新:
我可以通过将ONCGradientLayer() 重构为使用init 方法来使ONCGradientLayer() 工作,尽管我仍然很好奇为什么其他方法不起作用。
- (instancetype)init {
if (self = [super init]) {
self.colors = @[(id)[DEFAULT_BACKGROUND_COLOR CGColor], (id)[[UIColor colorWithWhite:.1 alpha:1] CGColor]];
self.startPoint = CGPointMake(0, 0);
self.endPoint = CGPointMake(0, 1);
}
return self;
}
【问题讨论】:
标签: ios swift calayer cagradientlayer