SWIFT iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见
Posted
技术标签:
【中文标题】SWIFT iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见【英文标题】:SWIFT iOS - Get text from multi-line uitextview with line breaks as they are visible on the screen 【发布时间】:2021-01-21 07:11:36 【问题描述】:我有一个多行 UITextView,有时文本会换行几行。我想从中获取文本,其中包含 iphone 屏幕上 可见 的换行符。
这很有用,因为我有一个 UITextView 可以随 UI 更改字体大小,并且我想在用户在屏幕上看到它时捕获文本。
使用textview.text
从 UITextView 获取文本不包含这些内容。 (尽管它确实包含用户通过按键盘上的“return”键入的任何换行符。)
我想也许你需要测量 UITextView 的高度并遍历每个字符,但我不知道该怎么做。我还希望它与表情符号一起使用。
【问题讨论】:
TextView.text 将在任何return
键被点击的地方显示\n
,如果您正在谈论将文本写入下一行,则会正确表示显式返回命中,因为 textview 宽度显然无法捕获.例如我输入 Dddd 并点击返回 3 次 textView.text 输出为Optional("Dddd\n\n\n\nMmmm")
【参考方案1】:
看来你想获取UITextView的快照而不是获取textview.text
,所以你需要学习如何将UITextView的内容绘制成图片。
关于如何绘制UIView
的快照,请尝试this。
关于如何绘制NSAttribeString
的快照,请尝试draw(with:options:context:)。
【讨论】:
【参考方案2】:Core Text 或 TextKit 是处理文本的最佳选择。
这个答案展示了如何使用核心文本获取自动换行的行:https://***.com/a/13588322/1837959。
或者您可以访问UITextView
的layoutManager
(NSLayoutManager) 来访问布局数据。
【讨论】:
【参考方案3】:听起来像是一个 hacky 解决方案,但不是真的:
使用Vision Framework's text recognition 将图像转换为文本。
-
将视图转换为图像
extension UIView
var toImage: UIImage?
let renderer = UIGraphicsImageRenderer(bounds: self.bounds)
return renderer.image (context) in
self.layer.render(in: context.cgContext)
let yourTextView = UITextView()
let img = yourTextView.toImage()
-
Follow article
guard let cgimg = img.cgImage else return
// Create a new image-request handler.
let requestHandler = VNImageRequestHandler(cgImage: cgImage)
// Create a new request to recognize text.
let request = VNRecognizeTextRequest(completion: recognizeTextHandler)
do
// Perform the text-recognition request.
try requestHandler.perform([request])
catch
print("Unable to perform the requests: \(error).")
// Process the Results
func recognizeTextHandler(request: VNRequest, error: Error?)
guard let observations =
request.results as? [VNRecognizedTextObservation] else
return
let recognizedStrings = observations.compactMap observation in
// Return the string of the top VNRecognizedText instance.
return observation.topCandidates(1).first?.string
// Use the result
processResults(recognizedStrings)
【讨论】:
【参考方案4】:UITextView 文本将显示 '\n' 供用户输入(当他按下回车键时)。 如果用户不按回车键并继续写入,则会根据 UITextView 的大小/宽度发生自动换行。所以你不应该什么。所以如果你看到“\n” 如果您在网站中显示它或使用 Web 视图 html 布局,只需将其更改为 。或者只需将所有“\n”替换为空格,不要包装它,让视图的宽度决定如何包装它。 截取ios iPhone的屏幕并以同样的方式显示看起来更奇怪。
例如。
认为这是
数据偶数
没有
返回。 它应该在一行中。
【讨论】:
以上是关于SWIFT iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见的主要内容,如果未能解决你的问题,请参考以下文章
具有大小类的自调整 UITableViewCells 中的多行 UILabel - iOS 8 和 Swift
iOS Swift 3 最初在创建时在 tableView 中选择多行