В моем приложении у меня есть куча UIBezierPath
с, которые я импортирую из файлов SVG, используя эту вещь , которые представляют собой неправильные формы. Я хочу рисовать тексты внутри фигур, чтобы «пометить» эти фигуры. Вот пример:
![enter image description here](https://i.stack.imgur.com/CakPy.png)
Я хочу нарисовать текст «А» внутри фигуры. По сути, это будет сделано в методе 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
. Я пытаюсь найти точку. Это не дубликат этого , так как мой вопрос касается рисования текста внутри пути, а не на .