【问题标题】:Is there a way to get access to the layoutmanager for a UITextField有没有办法访问 UITextField 的布局管理器
【发布时间】:2014-06-08 22:49:15
【问题描述】:

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

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

【问题讨论】:

    标签: ios uikit textkit


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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,具有良好的性能并支持多种语言。

      【讨论】:

      • 这不是问题所在。问题是是否可以访问 UITextField 的 layoutManager。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      相关资源
      最近更新 更多