Обновлена версия ответа @ mizar, исправлена одна серьезная и одна незначительная ошибка.
function getLines(ctx, text, maxWidth) {
var words = text.split(" ");
var lines = [];
var currentLine = words[0];
for (var i = 1; i < words.length; i++) {
var word = words[i];
var width = ctx.measureText(currentLine + " " + word).width;
if (width < maxWidth) {
currentLine += " " + word;
} else {
lines.push(currentLine);
currentLine = word;
}
}
lines.push(currentLine);
return lines;
}
Мы использовали этот код в течение некоторого времени, но сегодня мы пытались выяснить, почему какой-то текст не рисовался, и обнаружили ошибку!
Оказывается, что если вы дадите одно слово (без пробелов) функции getLines (), она вернет пустой массив, а не массив с одной строкой.
Пока мы исследовали это, мы обнаружили еще одну (гораздо более тонкую) ошибку, в результате которой строки могут заканчиваться немного длиннее, чем должны быть, поскольку в исходном коде не учитывались пробелы при измерении длины строки. 1008 *
Наша обновленная версия, которая работает для всего, что мы бросили в нее, выше. Дайте мне знать, если найдете какие-либо ошибки!