Это невозможно с NSString, так как он просто возвращает размер. Вы можете попробовать CoreText, который поддерживает возврат ограничивающих рамок, но это немного излишне.
Это трудная проблема, когда Unicode поддерживает такие вещи, как è̀̀̀ (см. Также: zalgo); вещи могут рендериться выше вершины линии, поэтому вы не можете просто рисовать символы. Некоторые API для рисования текста заставляют вас задавать базовую линию и дают вам ограничивающий прямоугольник, чтобы вы могли получать как восходящие, так и спусковые устройства, но UIKit не делает этого.
Тогда у вас есть сумасшедшие курсивные шрифты со случайным огромным подъемом. Непонятно, как с этим справиться.
Ленивый способ - рендерить текстуру с полями сверху и снизу (0,5 строки? 1 строка?) И не слишком заботиться о дополнительных издержках некоторых прозрачных пикселей.
Я не слишком много смотрел на CoreText, но он не выглядит особенно многообещающим.