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。

或者您可以访问UITextViewlayoutManager (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 中选择多行

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?

在 Swift 中的 UITextView 上放置阴影

Swift 4 - 如何使用按钮启用/禁用键盘

Swift NSTableview 拖动选择多行而不是拖出表格