This question is more about removing pixel gaps.
In general, the strategy to remove pixel gaps is to ensure your textures are pixel aligned with the SKView's backing store. There are few properties to check to ensure this: node position, sprite anchorPoint, node scale, camera scale. These kinds of properties must be pixel aligned manually because SpriteKit does not offer a facility to do it on your behalf. A typical technique is to round irrational values to the base 2 number system such as with the following function:
static func round_pow_2( _ value: CGFloat, decimalPlaces: CGFloat ) -> CGFloat {
let decimalValue = pow( 2.0, decimalPlaces )
if decimalValue == 0.0 { return value }
return CoreGraphics.round( value * decimalValue ) / decimalValue
}
Keeping in mind that on retina screens, you are allowed at least one base-2 decimal digit of precision to account for the fact that each screen point is at least 2 pixels wide. The actual ratio of screen points to pixels in a SpriteKit game is defined by SKView.contentScaleFactor.
It is also important to ensure that normal texture coordinates are pixel aligned when creating textures with sub rects using:
SKTexture( rect: normalRect, in: sourceTexture )
Regarding SKTileMapNode for use with small grids: this class is mostly a time saver when using Xcode's SpriteKit editor to design large maps (especially, those that make use of terrain `automapping`). With a board game of such few tiles, it doesn't sound like SKTileMapNode saves much time as compared to its restrictions (e.g., SKTimeMapNode tiles are not nodes, so it does not inherently support actions, physics bodies, touch handling, etc.).