Dirty but Efficient Texture Atlas in Spritekit
Just some quick minor complaints...

If braces are absolutely necessary in a switch, there's no reason why they shouldn't also be Egyptian-style like everywhere else in your code:

case BlockTypeDirt: {
    int amount = (type * numImagesEach) + damageLevel;
    return _tilesFromAtlas[amount];
}


But this seems unnecessary altogether.  We can refactor the switch statement as such:

switch(type) {
    case BlockTypeDirt:
    case BlockTypeRock:
        return _tilesFromAtlas[(type * numImagesEach) + damageLevel];
    default:
        return nil;
}


Now, I'm not sure I actually particularly like cramming all that inside the brackets, and the extra variable doesn't hurt, so we could keep it in the switch, but still, let's combine these cases and fix our brackets:

switch(type) {
    case BlockTypeDirt:
    case BlockTypeRock: {
        int amount = (type * numImagesEach) + damageLevel; 
        return _tilesFromAtlas[amount];
    }
    default:
        return nil;
}




Our code has some borderline magic numbers:

int numFormats = 3;

int numImagesEach = 4;


I'll deal with the latter first.  It's defined as the first line of a function, it's only used within the function, and it's used as a constant.

static int const kNumberOfImagesEach = 4;


The other variable is a little hard to say.  It may be that it's simply out of context, and in reality, might be different values, as this number is passed into the function that actually uses it.  I'll let you use your best judgment on that one, but you should think about it.



int numImages = (int)atlas.textureNames.count;


This is an example of why I default to NSInteger rather than int in all of my Objective-C code--that's what Apple has defaulted to, and I'd rather not have to cast all of my returns from Apple's methods, which you'll probably find that on balance, you're using Apple methods more than any other single developer's methods.