Я работаю над текстом рендеринга в центре круглой или овальной формы. В идеале, я бы хотел сосредоточить текст по вертикали и горизонтали, но естественным образом он протекает на границах региона.Вертикально центрирующий текст в нерегулярной форме UITextView
Я нашел подход, используя UITextView
и NSTextContainer
с исключениями, которые делают хорошую работу по выкладке текста при заданном вертикальном смещении, центрированном по горизонтали (код ниже). Однако я не уверен, как добиться вертикального центрирования.
Подходы, которые я видел все, предлагают корректировку contentInset
текстового вида после того, как текст был выложен, а конечная высота известна. (Например, this question) Однако в случае области неправильной формы высота текста после его выделения будет зависеть от того, где начинается расположение области.
Подход, который я рассмотрел, заключается в том, чтобы повторить процесс компоновки до тех пор, пока не будет достигнута удовлетворительная компоновка. Кто-нибудь имел успех с таким подходом? Одна из проблем заключается в том, что я не определил, как определить, был ли весь текст визуализирован в представлении (т. Е. Имеется ли достаточно места для размещения всего текста) --- существует ли способ запроса, все ли содержимое был «оказан» при использовании UITextView?
И наконец: это только для отображения текста --- нет необходимости разрешать пользователю редактировать содержимое представления. Может быть, лучший способ в этом случае - CoreText
?
Я довольно новичок в разработке iOS, поэтому, если есть что-то возмутительное, что я делаю, это также было бы полезно знать!
Спасибо!
let boundingRect = CGRect(...)
let textView = UITextView(frame: boundingRect)
textView.editable = false
view.addSubview(textView)
let verticalInset:CGFloat = <some value>
let width = boundingRect.width
let height = boundingRect.height
let textBounds = CGSize(width: width, height:height - 2*verticalInset)
textView.bounds = textBounds
let exclusionRect = CGRect(x:0, y:-verticalInset, width:width, height:height)
let textRegion = UIBezierPath(ovalInRect: exclusionRect)
let exclusionPath = UIBezierPath(rect:exclusionRect)
exclusionPath.appendPath(textRegion.bezierPathByReversingPath())
textView.textContainer.exclusionPaths = [exclusionPath]
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .Center
let attributes = [NSParagraphStyleAttributeName: paragraphStyle]
let formattedContent = NSAttributedString(string: "....", attributes:attributes)
textView.attributedText(formattedContent)
Вот изображение, чтобы помочь себе выше, если полезно:
Это именно то, что я сейчас пытаюсь выработать! Я думаю, что TextKit может быть единственным способом. –