如何确定 TextKit 在哪里出现软换行符?
How to decide where soft line-breaks occur with TextKit?
我正在尝试定义文本中出现软换行的位置,NSLayoutManagerDelegate
方法 layoutManager(_:shouldBreakLineByWordBeforeCharacterAt:)
似乎是开始的地方。我的问题是它没有被调用,尽管我的其他方法是。这是在基本 UITextView
设置中发生的。在什么情况下调用此方法 - 我找对地方了吗?
这是我的 TextKit 堆栈的样子:
class DemoTextView: UITextView, NSLayoutManagerDelegate {
// MARK: - Init
required init() {
let textStorage = NSTextStorage(string: "i will overflow several lines probably just saying")
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: CGSize(width: 100, height: 100))
textContainer.lineBreakMode = .byWordWrapping
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
// Super
super.init(frame: .zero, textContainer: textContainer)
self.textContainerInset = .zero
// Configure Text View
layoutManager.delegate = self
self.isScrollEnabled = false
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// Layout Manager
func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByWordBeforeCharacterAt charIndex: Int) -> Bool {
print(#function)
return false
}
func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByHyphenatingBeforeCharacterAt charIndex: Int) -> Bool {
print(#function)
return false
}
}
我在一个实际的应用程序中尝试了你的代码,文本视图占据了整个超级视图,如果初始字符串很长,shouldBreakLineByWordBeforeCharacterAt
在启动时被多次调用,然后每次用户输入时再次调用一个角色——完全符合预期。
我正在尝试定义文本中出现软换行的位置,NSLayoutManagerDelegate
方法 layoutManager(_:shouldBreakLineByWordBeforeCharacterAt:)
似乎是开始的地方。我的问题是它没有被调用,尽管我的其他方法是。这是在基本 UITextView
设置中发生的。在什么情况下调用此方法 - 我找对地方了吗?
这是我的 TextKit 堆栈的样子:
class DemoTextView: UITextView, NSLayoutManagerDelegate {
// MARK: - Init
required init() {
let textStorage = NSTextStorage(string: "i will overflow several lines probably just saying")
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: CGSize(width: 100, height: 100))
textContainer.lineBreakMode = .byWordWrapping
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
// Super
super.init(frame: .zero, textContainer: textContainer)
self.textContainerInset = .zero
// Configure Text View
layoutManager.delegate = self
self.isScrollEnabled = false
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// Layout Manager
func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByWordBeforeCharacterAt charIndex: Int) -> Bool {
print(#function)
return false
}
func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByHyphenatingBeforeCharacterAt charIndex: Int) -> Bool {
print(#function)
return false
}
}
我在一个实际的应用程序中尝试了你的代码,文本视图占据了整个超级视图,如果初始字符串很长,shouldBreakLineByWordBeforeCharacterAt
在启动时被多次调用,然后每次用户输入时再次调用一个角色——完全符合预期。