Как найти, где рисовать текст внутри неправильной формы, представленной UIBezierPath? - PullRequest
0 голосов
/ 11 марта 2020

В моем приложении у меня есть куча UIBezierPath с, которые я импортирую из файлов SVG, используя эту вещь , которые представляют собой неправильные формы. Я хочу рисовать тексты внутри фигур, чтобы «пометить» эти фигуры. Вот пример:

enter image description here

Я хочу нарисовать текст «А» внутри фигуры. По сути, это будет сделано в методе draw(_:) пользовательского UIView, и я ожидаю вызова метода с такой подписью, как:

func drawText(_ text: String, in path: UIBezierPath, fontSize: CGFloat) {
    // draws text, or do nothing if there is not enough space 
}

После некоторого поиска в Интернете я обнаружил этот пост , который, кажется, всегда рисует строку в центре изображения. Это не то, что я хочу. Если бы я поместил A в центр ограничивающей рамки UIBezierPath (которую, я знаю, я могу получить с UIBezierPath.bounds), это было бы вне форма. Вероятно, это потому, что форма вогнутая.

Обратите внимание, что тексты довольно короткие, поэтому мне не нужно беспокоиться о переносе строк и прочем.

Конечно, есть много мест внутри формы, в которую я мог бы вставить «А», я просто хочу решение, которое выбирает любое одно место, где можно показать текст в разумном размере. Один из способов, который я придумал, - найти самый большой прямоугольник, который можно вписать в фигуру, а затем нарисовать текст в центре этого прямоугольника. Я нашел этот пост , который делает это в Matlab, и кажется, что это действительно требует больших вычислений ... Я не уверен, что это хорошее решение.

Как я должен реализовать drawText(_:in:fontSize:)?

Чтобы не быть вопросом XY, вот несколько предысторий:

Фигуры, которые я обрабатываю, на самом деле являются границами административных областей. Другими словами, я рисую карту. Я не хочу использовать существующие API карты, потому что хочу, чтобы моя карта выглядела очень грубо. Здесь только собираются показать границы административных районов и надписи на них. Конечно, я мог бы просто использовать любой алгоритм, который используют API карт для рисования меток на своих картах, верно?

Этот вопрос не является дубликатом this , поскольку я знаю, что могу это сделать что с UIBezierPath.contains. Я пытаюсь найти точку. Это не дубликат этого , так как мой вопрос касается рисования текста внутри пути, а не на .

...