浅析NSTextContainer

浅析NSTextContainer



TextKit中的NSTextContainer有点晦涩难懂,若是想用TextKit实现文本分页的结果,你是必必要应用NSTextContainer的......


他们的关系是如许子的:


NSTextStorage  ---> NSLayoutManager ---> 多个NSTextContainer


当你添加了几个NSTextContainer的时辰,对应的那个NSTextContainer实际上已经分页好了,下面用例子来验证结论:



- (void)viewDidLoad

{
[super viewDidLoad];

// 数据源
NSString *string = [NSString stringWithContentsOfURL:[NSBundle.mainBundle URLForResource:@"bubizhidaowoshishui" withExtension:@"txt"] usedEncoding:nil
error:nil];

// 文本容器
NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string];

// 文本容器的布局经管器
NSLayoutManager *layoutManager = [NSLayoutManager new];
[storage addLayoutManager:layoutManager];

// 分段显示文本容器中的内容
CGSize size = CGSizeMake(300, 540);
NSTextContainer *textContainer1 = [[NSTextContainer alloc] initWithSize:size];
[layoutManager addTextContainer:textContainer1];
NSTextContainer *textContainer2 = [[NSTextContainer alloc] initWithSize:size];
[layoutManager addTextContainer:textContainer2];
NSTextContainer *textContainer3 = [[NSTextContainer alloc] initWithSize:size];
[layoutManager addTextContainer:textContainer3];
NSTextContainer *textContainer4 = [[NSTextContainer alloc] initWithSize:size];
[layoutManager addTextContainer:textContainer4];

// 给TextView添加带有内容和布局的容器
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 20,
size.width, size.height)
textContainer:textContainer1];
textView.layer.borderWidth = 1;
textView.scrollEnabled = NO;
textView.editable = NO;
[self.view addSubview:textView];

// 验证
if (textView.textStorage == storage)
{
NSLog(@"textView.textStorage == storage");
}

if (textView.layoutManager == layoutManager)
{
NSLog(@"textView.layoutManager == layoutManager");
}

NSLog(@"策画的页码数:%f", [textView sizeThatFits:CGSizeMake(300, FLT_MAX)].height / 540.f);
}


重视看下面的关系:




批改一下源码后,如下打印(重视将容器换成了textContainer2了):




你会发明,textContainer2显示了第二页的内容,然则呢,你会发明全部UITextView的页码变成了119了.



其实,看到这里,结论已经相当明显了.


NSLayoutManager就像一个队列一样,它会将添加到NSLayoutManager中的NSTextContainer主动遵守进入队列的次序来给NSTextContainer赋值,最进步前辈入队列的NSTextContainer将会有着最多显示的内容,往掉队入队列的NSTextContainer会依次递减(发明这个花了我半天时候-_-!!).


 


还有一点内容相当首要哦:)



看起来,你可能感觉UITextView仅仅持有了一个NSTextContainer,其实,他还接管了你在上方定义的那个NSTextStorage以及layoutManager,这一点很轻易被忽视掉得.


也就是说(小我概念):


       UITextView在获取到了NSTextContainer后,会主动的接管了与这个NSTextContainer相干的所有设备,UITextView将自身包含的textStorage以及layoutManager调换成了NSTextContainer相干设备.


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值