Ios 如何确定SKTexture是否为占位符图像

Ios 如何确定SKTexture是否为占位符图像,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,在SpriteKit中,如果使用[SKTexture textureWithImageNamed:]方法加载图像,它将首先搜索捆绑包,然后搜索地图集,如果找不到纹理,它将创建一个占位符图像并加载它 是否有办法(无需目视检查)确定加载的图像是否为占位符 这似乎不是一种处理此类错误的“可可”方式 developer.apple.com现在关闭了,所以我想我会向so提出这个问题。您可以检查地图册是否包含图像。我在AtlasHelper中创建了以下方法: +(BOOL) isTextureWithNam

在SpriteKit中,如果使用[SKTexture textureWithImageNamed:]方法加载图像,它将首先搜索捆绑包,然后搜索地图集,如果找不到纹理,它将创建一个占位符图像并加载它

是否有办法(无需目视检查)确定加载的图像是否为占位符

这似乎不是一种处理此类错误的“可可”方式


developer.apple.com现在关闭了,所以我想我会向so提出这个问题。

您可以检查地图册是否包含图像。我在AtlasHelper中创建了以下方法:

+(BOOL) isTextureWithName:(NSString *) name existsInAtlas:(NSString *)atlasName
{
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:atlasName];
    return [atlas.textureNames containsObject:name];
}

SKTexture有一些私有属性,这可能会有所帮助(参见示例),但在Swift和开发过程中,我使用了以下内容:

extension SKTexture {
    public var isPlaceholderTexture:Bool {
        if size() != CGSize(width: 128, height: 128) {
            return false
        }

        return String(describing: self).contains("'MissingResource.png'")
    }
}
注意

仅当您使用的是
SKTextureAtlas

let t1 = SKTextureAtlas(named: "MySprites").textureNamed("NonExistingFoo")
// t1.isPlaceholderTexture == true

let t2 = SKTexture(imageNamed: "NonExistingBar")
// t2.isPlaceholderTexture == false

是的,从github使用SpriteKit QuickLook,然后您可以看到纹理的私有变量。如果纹理是atlas纹理,则有一个指向原始纹理(atlas)的ivar。因此,MissingResource.png是128x128-如果您自己不使用任何该大小的纹理,则可以比较纹理大小。您是否找到了一个好方法?我正在预加载纹理,每三十次发布中就有一次加载3或4个纹理的图像资源时出错。我一直在尝试用代码找出是否发生这种情况,然后在发生这种情况时重新加载它们。这个问题有点老了,但我会接受这个问题。