iOS 子类化 SKShapeNode
iOS Subclassing SKShapeNode
如何对没有实例方法初始值设定项的 SKShapeNode 进行子类化?我能想到的唯一方法是:
+ (id)withColor:(UIColor *)aColor radius:(CGFloat)aRadius {
return [[self alloc] initWithColor:aColor radius: aRadius];
}
- (id)initWithColor:(UIColor *)aColor radius:(CGFloat)aRadius {
self = (CAButtonNode *)[SKShapeNode shapeNodeWithCircleOfRadius:aRadius];
self.fillColor = aColor;
self.strokeColor = [UIColor clearColor];
return self;
}
在这种情况下 self
是 SKShapeNode
而不是 CAButtonNode
的实例。
谢谢。
如果你问我的话会很不方便,我不确定这是否是正确的解决方案,但它确实有效。我将此留给可能 运行 遇到类似问题的任何人。
您要做的就是像往常一样调用[super init]
,然后手动设置节点的路径。下面基本模仿了SKShapeNode
class方法shapeNodeWithCircleOfRadius:
- (id)initWithColor:(UIColor *)aColor radius:(CGFloat)aRadius {
if (self = [super init]) {
self.path = CGPathCreateWithEllipseInRect(CGRectMake(-aRadius, -aRadius, aRadius * 2, aRadius * 2), NULL);
self.fillColor = aColor;
self.strokeColor = [UIColor clearColor];
}
return self;
}
如果有人知道,我很好奇为什么他们不像大多数其他 classes 那样包含实例方法初始值设定项。
干杯!
您可以向 SKShapeNode 添加一个 class 扩展
extension SKShapeNode
{
class func nodeWithColor( color:UIColor, radius:Float ) -> Self
{
let node = SKShapeNode()
node.path = CGPathCreateWithEllipseInRect(...)
node.fillColor = ...
node.strokeColor = ...
return node
}
}
这样使用:
let newNode = SKShapeNode.nodeWithColor( <i>theColor</i>, radius: <i>theRadius</i> )
或者,在 Obj-C 中:
@implementation SKShapeNode (NodeWithColorAndRadius)
+(instancetype)nodeWithColor:(UIColor*)color radius:(CGFloat)r
{
SKShapeNode * result = [ self new ] ;
result.path = ...;
result.fillColor = ...;
result.strokeColor = ...;
}
@end
这样调用:
[ SKShapeNode nodeWithColor:<i>theColor</i> radius:<i>theRadius</i> ]
如何对没有实例方法初始值设定项的 SKShapeNode 进行子类化?我能想到的唯一方法是:
+ (id)withColor:(UIColor *)aColor radius:(CGFloat)aRadius {
return [[self alloc] initWithColor:aColor radius: aRadius];
}
- (id)initWithColor:(UIColor *)aColor radius:(CGFloat)aRadius {
self = (CAButtonNode *)[SKShapeNode shapeNodeWithCircleOfRadius:aRadius];
self.fillColor = aColor;
self.strokeColor = [UIColor clearColor];
return self;
}
在这种情况下 self
是 SKShapeNode
而不是 CAButtonNode
的实例。
谢谢。
如果你问我的话会很不方便,我不确定这是否是正确的解决方案,但它确实有效。我将此留给可能 运行 遇到类似问题的任何人。
您要做的就是像往常一样调用[super init]
,然后手动设置节点的路径。下面基本模仿了SKShapeNode
class方法shapeNodeWithCircleOfRadius:
- (id)initWithColor:(UIColor *)aColor radius:(CGFloat)aRadius {
if (self = [super init]) {
self.path = CGPathCreateWithEllipseInRect(CGRectMake(-aRadius, -aRadius, aRadius * 2, aRadius * 2), NULL);
self.fillColor = aColor;
self.strokeColor = [UIColor clearColor];
}
return self;
}
如果有人知道,我很好奇为什么他们不像大多数其他 classes 那样包含实例方法初始值设定项。
干杯!
您可以向 SKShapeNode 添加一个 class 扩展
extension SKShapeNode
{
class func nodeWithColor( color:UIColor, radius:Float ) -> Self
{
let node = SKShapeNode()
node.path = CGPathCreateWithEllipseInRect(...)
node.fillColor = ...
node.strokeColor = ...
return node
}
}
这样使用:
let newNode = SKShapeNode.nodeWithColor( <i>theColor</i>, radius: <i>theRadius</i> )
或者,在 Obj-C 中:
@implementation SKShapeNode (NodeWithColorAndRadius)
+(instancetype)nodeWithColor:(UIColor*)color radius:(CGFloat)r
{
SKShapeNode * result = [ self new ] ;
result.path = ...;
result.fillColor = ...;
result.strokeColor = ...;
}
@end
这样调用:
[ SKShapeNode nodeWithColor:<i>theColor</i> radius:<i>theRadius</i> ]