iOS子类SKShapeNode

时间:2015-07-18 18:37:49

标签: ios objective-c skspritenode 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;
}

在这种情况下,selfSKShapeNode的实例,而不是CAButtonNode

感谢。

2 个答案:

答案 0 :(得分:1)

如果你问我我很不方便,我不确定这是否是正确的解决方案,但确实有效。我可以把这个留给任何可能遇到类似问题的人。

您需要做的就是像平常一样调用[super init],然后手动设置节点的路径。以下基本上模仿SKShapeNode类方法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;
}

如果有人知道,我很好奇为什么他们没有像大多数其他类一样包含实例方法初始化器。

干杯!

答案 1 :(得分:1)

您可以向SKShapeNode

添加类扩展
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( theColor, radius: theRadius )

或者,在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:theColor radius:theRadius ]