How do I encourage my team to become more cross functional?
Pair programming. Get a new desk set up, with two computers on it, side by side. The one less-experienced at the task sits at one computer, and does the actual coding ('driving'). The more-experienced one sits at the other computer, uses it only for looking things up, and helps guide the driver ('navigating'). You'll get higher quality code out of it, too.
Just don't get rid of their normal desks. Not all tasks need to be pair-programmed.
Both developers are now complaining that they are not being played to their strengths and are losing time when the other can do it better.
Depends what is meant by 'it.' If the only goal the company (and, more importantly, the Team) has is to get these tasks done now, then they're correct. If, however, they care about the future at all, then the (less immediately visible) benefits to cross-functionality outweigh the immediate benefits of getting tasks done asap. Usually; some emergency tasks could obviously be an exception.
Both developers are challenging me by arguing 'if you expect us to be cross-functional, why don't you join in and code as well'. My role is strictly is hands off in a delivery role.
Sounds like they might just be acting a bit snippy, though as pointed out in comments, you could try it out, just to placate them. Or, if you're not willing to actually dive into the code, at the very least you should consider putting effort into understanding what they're doing. Gain enough knowledge (both about programing in general and in what's been done with it at your company) to be able to understand what they're talking about when they talk about things like foreign keys, models/views/controllers, repositories, 'that one **** method, with the rules', etc. You don't need to understand enough to work with them, but gaining an understanding of what they're talking about, at least, could un-ruffle feathers.