私は、円形または楕円形の領域の中央にテキストを描画するように取り組んでいます。理想的には、テキストを縦と横の中央に配置したいが、それは自然に領域の境界に流れるようにする。不規則な形のUITextViewでテキストを垂直にセンタリングする
UITextView
とNSTextContainer
の除外パスを使用して、特定の垂直オフセットで、テキストを水平に中央に配置する(下のコードを参照)ようにするアプローチが見つかりました。しかし、私はどのように垂直センタリングを達成するか分からない。
私が見てきたアプローチは、テキストが配置され、最終的な高さがわかった後にテキストビューのcontentInset
を調整することを提案しています。 (たとえば、this question)ただし、不規則な形の領域の場合、配置された後のテキストの高さは、領域レイアウトがどこから始まるかによって異なります。
私が検討したアプローチは、満足のいくレイアウトが達成されるまでレイアウトプロセスを再試行することです。誰かがこのようなアプローチで成功したのですか?ここでの課題の1つは、すべてのテキストがビュー内でレンダリングされているかどうか(すなわち、すべてのテキストをレイアウトするのに十分なスペースがあるかどうか)を判断する方法を研究していないことです。 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が唯一の方法かもしれないと思っています。 –