He made his claim to fame as Tristan Thorn in the movie Stardust. Later in his career, he played Owen Sleater in Boardwalk Empire and Ishmael in Moby Dick. In 2015, he landed the role of the title character in the Netflix series Daredevil.
He received his drama training at Sherborne School in Dorset.
He appeared in Stone of Destiny as Ian Hamilton.
He lived with his brother and his dog Dickon for many years. In October of 2016, he and Samantha Thomas had their first child, a daughter. The couple wed in September 2018. They welcomed a second child in March 2020.
He had a reoccurring role on the HBO series Boardwalk Empire, which featured Steve Buscemi.