具有多个 NSTextContainers 的 NSLayoutManager 导致 UITextViews 不可选择/可编辑

Knu*_*ter 5 nslayoutmanager uitextview ios nstextcontainer swift

我正在尝试实现多页文本编辑布局,如 Pages、MS Word 等。在 OS XI 上,可以通过为多个 NSTextView 创建一个 NSLayoutManager 和一个 NSTextStorage 来实现这一点。每个 NSTextView 都有自己的 NSTextContainer。见下面的 OS X 代码。一个简单的例子,文本在两个 NSTextViews 之间传播:

import Cocoa

class ViewController: NSViewController {

let layoutManager = NSLayoutManager()
let textStorage = NSTextStorage(attributedString: NSAttributedString(string: "This is a test"))
let textContainer1 = NSTextContainer()
let textContainer2 = NSTextContainer()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    textStorage.addLayoutManager(layoutManager)

    textContainer1.widthTracksTextView = true
    textContainer1.heightTracksTextView = true
    textContainer2.widthTracksTextView = true
    textContainer2.heightTracksTextView = true

    let textView1 = NSTextView(frame: CGRectMake(0, 100, 100, 100), textContainer: textContainer1)
    textView1.backgroundColor = NSColor.greenColor()
    self.view.addSubview(textView1)
    layoutManager.addTextContainer(textContainer1)


    let textView2 = NSTextView(frame: CGRectMake(200, 100, 100, 100), textContainer: textContainer2)
    textView2.backgroundColor = NSColor.greenColor()
    self.view.addSubview(textView2)
    layoutManager.addTextContainer(textContainer2)
}
}
Run Code Online (Sandbox Code Playgroud)

这有效。

但是,当我尝试在 iOS 上使用 UITextView 执行相同操作时,UITextViews 变得不可选择或不可编辑。请参阅我的 iOS 代码:

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

let layoutManager = NSLayoutManager()
let textStorage = NSTextStorage(attributedString: NSAttributedString(string: "This is a test. This text should spread over two UITextViews. Bla bla bla bla bla bla bla bla bla bla bla bla bla"))
let textContainer1 = NSTextContainer()
let textContainer2 = NSTextContainer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.        

    textStorage.addLayoutManager(layoutManager)

    textContainer1.heightTracksTextView = true
    textContainer1.widthTracksTextView = true
    textContainer2.heightTracksTextView = true
    textContainer2.widthTracksTextView = true

    let textView1 = UITextView(frame: CGRectMake(0, 100, 100, 100), textContainer: textContainer1)
    textView1.scrollEnabled = false
    textView1.delegate = self
    textView1.editable = true
    textView1.selectable = true
    textView1.backgroundColor = UIColor.greenColor()
    self.view.addSubview(textView1)
    layoutManager.addTextContainer(textContainer1)

    let textView2 = UITextView(frame: CGRectMake(200, 100, 100, 100), textContainer: textContainer2)
    textView2.scrollEnabled = false
    textView2.delegate = self
    textView2.editable = true
    textView2.selectable = true
    textView2.backgroundColor = UIColor.greenColor()
    self.view.addSubview(textView2)
    layoutManager.addTextContainer(textContainer2)

}
}
Run Code Online (Sandbox Code Playgroud)

文本从一个 UITextView 流向另一个,但不可编辑。我将非常感谢您的任何建议。我用谷歌搜索了这个问题,发现其他人也遇到了同样的问题,但没有找到解决方案。

Jef*_*Sun 0

我也一直在寻找答案,似乎当 UITextView 与其他文本视图共享布局管理器时,文本视图不幸地变成静态的。

iOS 7 编程突破极限:为 Apple 开发高级应用程序,第 375 页中概述了此问题:

因为您可以轻松地将其他文本容器添加到布局管理器,并且因为 UITextView 使用布局管理器,所以您可能认为创建多列、可编辑的 UITextView 会很容易。不幸的是,这种情况并非如此。如果为 UITextView 分配了多个文本容器 [原文如此],它就会变为静态,并且无法响应用户交互,例如编辑或选择。这是一个已知问题,目前“按设计”。