UITextView 公开了它的 NSLayoutManager,允许客户端在编辑文本时添加自定义样式(例如,本文实现了一个带有语法突出显示的 UITextView:http ://www.objc.io/issue-5/getting-to-know-textkit.html )
有没有办法让 UITextField 的底层 NSLayoutManager 允许类似的自定义?
UILabel
由于各种原因,Apple 不会公开 layoutManager 。我听说这样做的原因是它实际上是在多个标签之间共享的,因为您不编辑标签文本,而只是不经常地对其进行布局,例如在边界更改时。
但是您可以UILabel
使用自定义 TextKit 堆栈,就像我在这里展示的那样:https ://www.cocoanetics.com/2015/03/customizing-uilabel-hyperlinks/
您可以使用 访问布局管理器textView.layoutManager
。您可以通过自己创建所有对象来分配自己的布局管理器:
NSTextStorage* textStorage = [[NSTextStorage alloc] initWithString:string];
// you could create a subclass of NSLayoutManager here
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
self.textContainer = [[NSTextContainer alloc] initWithSize:self.view.bounds.size];
[layoutManager addTextContainer:self.textContainer];
UITextView* textView = [[UITextView alloc] initWithFrame:self.view.bounds textContainer:self.textContainer];
[self.view addSubview:textView];
但是,如果您尝试进行语法突出显示,那不是我会采用的方法。我建议子类UITextView
化以检测用户所做的更改,并在此时通过添加您自己的语法突出显示[self.storage addAttributes:range:]
将我编写的这个类从 OS X 移植到 iOS 可能并不难:https ://github.com/abhibeckert/Dux/blob/master/Dux/DuxSyntaxHighlighter.m——它将语法高亮应用于 NSTextStorage,使用良好的性能和对多种语言的支持。