Я работаю над рендерингом текста в центре круглой или овальной области. В идеале я хотел бы центрировать текст по вертикали и горизонтали, но чтобы он естественно обтекал границы области.
Я нашел подход, использующий UITextView
и NSTextContainer
с путями исключения, который хорошо справляется с размещением текста с заданным смещением по вертикали, центрированным по горизонтали (код ниже). Однако я не уверен, как добиться вертикального центрирования.
Подходы, которые я видел, предполагают настройку contentInset
текстового представления после того, как текст был выложен и окончательная высота известна. (Например, этот вопрос) Однако в случае неправильной формы регион, высота текста после его размещения будет зависеть от того, с какой точки региона начинается макет.
Подход, который я рассмотрел, состоит в том, чтобы повторять процесс компоновки, пока не будет достигнута удовлетворительная компоновка. У кого-нибудь был успех с таким подходом? Одна проблема здесь заключается в том, что я не придумал, как определить, весь ли текст был отображен в представлении (т. е. достаточно ли места для размещения всего текста) --- есть ли способ запросить, весь ли контент был «рендеринг» при использовании 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)
Вот изображение, которое поможет визуализировать вышеизложенное, если оно полезно: