swift 如何在UITextView中将文本设置为类似块引用的格式

laximzn5  于 2022-10-31  发布在  Swift
关注(0)|答案(2)|浏览(168)

我正在努力熟悉CoreText,我从制作自己的笔记应用程序开始。
我已经将regex与AttributedStrings结合起来,并试图从本质上模拟我现在输入的StackOverflow文本框的功能。
我有所有的共同点,比如:

粗体字

  • 斜体字 *

个标题

emphasis blocks
但是我正在努力做一个块引用/代码块。
类似这样的东西,它中断到自己的行,并创建一个框,去到边缘,无论文本有多长。

And it changes the background color

我看过一些注入HTML / CSS的老例子,但是我希望我可以使用一些特殊的NSAttributedStringKey组合来完成它。

xzv2uavs

xzv2uavs1#

是的,这是可能的。下面是Swift 3中的一个示例:

import UIKit
import PlaygroundSupport

let richText = NSMutableAttributedString()

let chunk0 = NSAttributedString(string: "But I am struggling to make a block quote / code block.\n\n")
richText.append(chunk0)

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.headIndent = 20
// Note that setting paragraphStyle.firstLineHeadIndent
// doesn't use the background color for the first line's
// indentation. Use a tab stop on the first line instead.
paragraphStyle.tabStops = [NSTextTab(textAlignment: .left, location: paragraphStyle.headIndent, options: [:])]

let chunk1 = NSAttributedString(string: "\tSomething like this where it breaks to its own line and creates a box that goes to the edge no matter how long the text is.\n", attributes: [
    NSParagraphStyleAttributeName: paragraphStyle,
    NSBackgroundColorAttributeName: UIColor.yellow
])
richText.append(chunk1)

let chunk2 = NSAttributedString(string: "\nIs this even possible to do strictly using AttributedStrings?")
richText.append(chunk2)

let textView = UITextView(frame: CGRect(x: 0, y: 0, width: 120, height: 400))
textView.backgroundColor = .white
textView.attributedText = richText
PlaygroundPage.current.liveView = textView

以下是输出:

但是要记住UITextView在布局和样式方面远不如web视图强大,如果你想变得更花哨(就像stackoverflow在blockquote框的左边用深色线做的那样),你应该生成HTML和CSS,然后使用web视图。

jckbn6z7

jckbn6z72#

是的,这是可能的,只有NSAttributedString(或新的AttributedString,今年出来)。

想法很简单,2个步骤:
1.使用自定义headIndentfirstLineHeadIndent给予引用段落NSMutableParagraphStyle赋值。这将在段落左侧提供额外的空间,可用于绘制垂直线。
1.通过UITextView子类实现draw(in:rect)函数,绘制竖条和背景矩形,使用UITextView的UITextInput协议中的position(from:offset:)函数,可以找到段落的矩形,使用CAShapeLayerUIBezierPath,类似于UIViewaddSubview(),可以完成绘制

相关问题