12 hours is the NIGHTTIME amount, they need an additional 2 to 3 hours above that until age 6. This means he should not give up his nap at all.
I think your problem is you are waiting for him to look tired. By that time you have missed the window of opportunity. Instead try putting him down an hour earlier for nap (so 12:30 is the latest he is put into his bed, should be asleep before 1 pm) and then much earlier for night too, around 7:30 or 8. If he is waking at 7 am, you go back 12 hours and that is when they should be in bed and going to sleep.
When you miss that window you get a HYPER kid and it's a thousand times harder for them to get calmed and to sleep. Basically in a little kid they don't get sleepy acting, they get whiney or hyper or both. If you get to the hyper or slap happy stage then you waited too long.