如何从头开始制作UITextView?

据我所知, 苹果不提供UIKit的源代码 。 然而,为了回答另一个问题 ,我想了解UITextView是如何工作的(或者可以使之工作)。

我将如何自己设置一个最小的UITextView

我从文档中看到,它从UIScrollViewinheritance,所以我认为我会从那里开始。

 import UIKit class MyUITextView: UIScrollView { // ??? } 

再看看文本视图文档,它看起来像我需要至less实现init方法和text属性。 (我现在可以忽略所有的编辑方面和格式属性。)

init方法采用以下forms:

 init(frame frame: CGRect, textContainer textContainer: NSTextContainer?) 

所以我也需要一个NSTextContainer属性。 这个TextKit组件与NSTextStorageNSLayoutManager一起NSTextStorage ,所以我需要在某个地方工作。 我可以用text属性设置NSTextStorage ,但我真的不知道NSLayoutManager如何在这里交互。

有没有人(苹果以外)做过? 这是一个足够简单的问题来回答这个答案吗?

更新:

这个问题显示了我的最新尝试: 如何在Swift中用string初始化NSTextStorage

这绝对是复杂的。 我不得不在之前重新实现UILabel的一个子集,这很棘手。 我认为首先应该考虑的是你感兴趣的级别。在最基本的方面, UITextView负责处理位图graphics上下文,并将string转换为屏幕上的像素。 这本身就是一个很大的挑战,如果你想从零开始重新实现这个function,你将会很忙。

在更高层次上, UITextView可以将文本分成几行,显示不同的字体。 更高级的,你有像UITextInput协议 ,处理让用户input和操纵文本视图的内容。

在实施细节方面,显然还不具备。 我们能得到的最接近的是一个标题转储 ,这很有趣,但是可能不会告诉我们什么。

在iOS7和TextKit之前,文本渲染实际上是由WebKit处理的,这意味着执行过程可能更加混乱。

无论如何,有些事情要指出你在正确的(或至less )方向:

  • NSAttributedString类引用 ,尤其是UIKit增加 ,它可以让你实际上将文本转移到graphics上下文;
  • 介绍TextKit ,来自WWDC13的一些示例代码(还有一个附带的video)
  • 从AppCoda 简介文本工具包 。

我很抱歉,这个答案可能没有我想要的那么有用。 基本上这是一个很大的问题。 这可能是多个真正的大问题。

你可以使用下面的源代码来理解底下发生了什么。 Apple'e的实现不一定是相同的。

https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.h https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.m