I've solved the issue.
It turns out under some circumstances, the position of a node would become CGPoint(nan, nan), once this happens calculateAccumulatedFrame() returns the wrong bounds, which means some child nodes are not considered for self.nodes(at: touch) even though they are within the true frame of the parent node.
I've fixed the maths issue and now everything is fine.