问题描述
我有一个多行 UITextView,有时文本会换行几行。我想从中获取文本,并从 iphone 屏幕上可见的内容换行。
这很有用,因为我有一个 UITextView 可以随 UI 更改字体大小,并且我想在用户在屏幕上看到文本时捕获文本。
使用 textview.text
从 UITextView 获取文本不包含这些。 (尽管它确实包含用户通过按键盘上的“返回”键输入的任何换行符。)
我想也许您需要测量 UITextView 的高度并检查每个字符,但我不知道该怎么做。我还希望它与表情符号一起使用。
解决方法
看来你是想获取UITextView的快照而不是获取textview.text
,所以你需要学习如何将UITextView的内容绘制成图片。
有关如何绘制UIView
的快照,请尝试this。
有关如何绘制NSAttribeString
的快照,请尝试draw(with:options:context:)。
Core Text 或 TextKit 是处理文本的最佳选择。
这个答案显示了如何使用核心文本获取自动换行:https://stackoverflow.com/a/13588322/1837959。
或者您可以访问 layoutManager
的 UITextView
(NSLayoutManager) 以访问布局数据。
听起来像一个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()
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)
}
,
UITextView 文本将显示 '\n' 以供用户输入(当他按下 Enter 键时)。
如果用户不按回车键/返回并继续写入,则会根据 UITextView 的大小/宽度进行自动换行。所以你不应该什么。所以如果你看到“\n”
只需将其更改为
,如果您在网站中显示它或使用 Web 视图 html 布局。或者只需用空格替换所有 "\n" 并且不要包装它,让视图的宽度决定如何包装它。
IOS iPhone 的屏幕截图并以同样的方式显示看起来更奇怪。
例如。
认为是
数据偶数
没有
返回。 它应该在一行中。