1

UITextView 公开了它的 NSLayoutManager,允许客户端在编辑文本时添加自定义样式(例如,本文实现了一个带有语法突出显示的 UITextView:http ://www.objc.io/issue-5/getting-to-know-textkit.html )

有没有办法让 UITextField 的底层 NSLayoutManager 允许类似的自定义?

4

2 回答 2

0

UILabel由于各种原因,Apple 不会公开 layoutManager 。我听说这样做的原因是它实际上是在多个标签之间共享的,因为您不编辑标签文本,而只是不经常地对其进行布局,例如在边界更改时。

但是您可以UILabel使用自定义 TextKit 堆栈,就像我在这里展示的那样:https ://www.cocoanetics.com/2015/03/customizing-uilabel-hyperlinks/

于 2017-03-15T06:58:37.547 回答
-2

您可以使用 访问布局管理器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,使用良好的性能和对多种语言的支持。

于 2014-06-08T23:52:49.780 回答