Необходимо учитывать textView.textContainerInset, также необходимо округлить вычисленное значение, поскольку номер строки определенно является целым числом
float rawLineNumber = (textView.contentSize.height - textView.textContainerInset.top - textView.textContainerInset.bottom) / textView.font.lineHeight;
int finalLineNumber = round(rawLineNumber)
В реальном случае вы можете увидеть следующий результат rawLineNumber = 3.008099 finalLineNumber = 3 ( 3 строки)
Как я при поиске версии RGBA, которая принимает альфу во внимание, вот тот, который работает действительно хорошо, чтобы иметь высокий контраст.
function getContrastColor(R, G, B, A) {
const brightness = R * 0.299 + G * 0.587 + B * 0.114 + (1 - A) * 255;
return brightness > 186 ? "#000000" : "#FFFFFF";
}