iOS实现文本分页的方法示例

iOS实现文本分页的方法示例,第1张

概述iOS实现文本分页的方法示例 前言 本篇文章将分为两部分,一部分是静态文本分页,一部分是动态文本分页即边填写文本边进行文本的分页. 我们所采用的方案为:TextKit进行处理,通过glyphRangeForTextContainer方法获取文本内容视图可容纳的文本范围来对文本进行切割分页. // Returns the range of characters which have been laid into the given container.  This is a less efficient method than

前言

本篇文章将分为两部分,一部分是静态文本分页,一部分是动态文本分页即边填写文本边进行文本的分页.

我们所采用的方案为:TextKit进行处理,通过glyphRangeForTextContainer方法获取文本内容视图可容纳的文本范围来对文本进行切割分页.

// Returns the range of characters which have been laID into the given container.  This is a less efficIEnt method than the similar -textContainerForGlyphAtIndex:effectiveRange:.
- (NSRange)glyphRangeForTextContainer:(NSTextContainer *)container;

静态文本分页

1.文本视图配置

1.1 设置textContainer

设置textContainer的尺寸为视图尺寸设置lineFragmentpadding为0,让文本两边距离视图为0,计算更为准确
 UITextVIEw *textVIEw = [[UITextVIEw alloc] initWithFrame:CGRectMake(0,originY,kTextVIEwSize.wIDth,kTextVIEwSize.height)]; // textContainer的最大高度,实际生成的视图高度将比此值小 textVIEw.textContainer.size = CGSizeMake(CGRectGetWIDth(textVIEw.bounds),CGRectGetHeight(textVIEw.bounds)); // 设置文本内容的左右间距为0 textVIEw.textContainer.lineFragmentpadding = 0.f;

1.2 文本视图基础设置

设置文本上下边间距为0,让文本能够撑满视图

 textVIEw.textContainerInset = UIEdgeInsetsZero;

设置文本视图连续布局

 // 允许连续布局 textVIEw.layoutManager.allowsNonContiguousLayout = NO;

1.3 文本视图完整配置

 UITextVIEw *textVIEw = [[UITextVIEw alloc] initWithFrame:CGRectMake(0,kTextVIEwSize.height)]; textVIEw.backgroundcolor = [UIcolor yellowcolor]; textVIEw.textcolor = [UIcolor blackcolor]; // textContainer的最大高度,CGRectGetHeight(textVIEw.bounds)); // 需将文本内容填充区域置0处理,计算更准确 textVIEw.textContainerInset = UIEdgeInsetsZero; // 设置文本内容的左右间距为0 textVIEw.textContainer.lineFragmentpadding = 0.f; textVIEw.text = text; textVIEw.Font = [UIFont systemFontOfSize:16]; // 允许连续布局 textVIEw.layoutManager.allowsNonContiguousLayout = NO; textVIEw.userInteractionEnabled = NO; textVIEw.contentSize = textVIEw.bounds.size;

2.文本视图数据配置

通过glyphRangeForTextContainer获取可容纳文本范围,再截取出文本,即可获得视图可展示的内容.

 // 获取文本视图可容纳文本范围 NSRange textRange = [textVIEw.layoutManager glyphRangeForTextContainer:textVIEw.textContainer]; Nsstring *textVIEwText = [text substringWithRange:textRange]; textVIEw.text = textVIEwText;

3.关键代码展示

获取文本数据,对文本进行一段一段截取以达到分页.

 Nsstring *text = @"有一次,在我参加的一个晚会上,主持人问一个小男孩:你长大以后要做什么样的人?孩子看看我们这些企业家,然后说:做企业家。在场的人忽地笑着鼓起了掌。我也拍了拍手,但听着并不舒服。我想,这孩子对于企业究竟知道多少呢?他是不是因为当着我们的面才说要当企业家的呢?他是不是受了大人的影响,以为企业家风光,都是有钱的人,才要当企业家的呢\n这一切当然都是一个谜。但不管怎样,作为一个人的人生志向,我以为当什么并不重要;不管是谁,最重要的是从小要立志做一个努力的人\n我小的时候也曾有人问过同样的问题,我的回答不外乎当教师、解放军和科学家之类。时光一晃流走了二十多年,当年的孩子,如今已是四十出头的大人。但仔细想一想,当年我在大人们跟前表白过的志向,实际一个也没有实现。我身边的其他人差不多也是如此。有的想当教师,后来却成了个体户;想当解放军的,有人竟做了囚犯。我上大学时有两个同窗好友,他们现在都是我国电子行业里才华出众的人,一个成长为“康佳”集团的老总,一个领导着TCL集团。我们三个不期而然地成为中国彩电骨干企业的经营者,可是当年大学毕业时,无论有多大的想像力,我们也不敢想十几年后会成现在的样子。一切都是我们在奋斗中见机行事,一步一步努力得来的。与其说我们是有理想的人,不如说我们是一直在努力的人。\n并非我们不重视理想,而是因为树雄心壮志易,为理想努力难,人生自古就如此。有谁会想到,十多年前的今天,我曾是一个在街头彷徨,为生存犯愁的人?当时的我,一无所有,前途渺茫,真不知路在何处。然而,我却没有灰心失望,回想起来,支撑着我走过这段坎坷岁月的正是我的意志品格。当许多人以为我已不行、该不行了的时候,我仍做着从地上爬起来的努力,我坚信人生就像马拉多纳踢球,往往是在快要倒下去的时候“进球”获得生机的。事实也正是如此,就在“山重水复疑无路”的时候,香港一家企业倒闭给了我东山再起的机会,使我能够与掌握世界最新技术的英国科技人员合作,开发技术先进的彩色电视机,从此一举走出困境。\n有人说,“努力”与“拥有”是人生一左一右的两道风景。但我以为,人生最美最不能逊色的风景应该是努力。努力是人生的一种精神状态,是对生命的一种赤子之情。努力是拥有之母,拥有是努力之子。一心努力可谓条条大路通罗马,只想获取可谓道路逼仄,天地窄小。所以,与其规定自己一定要成为一个什么样的人物,获得什么东西,不如磨练自己做一个努力的人。志向再高,没有努力,志向终难坚守;没有远大目标,因为努力,终会找到奋斗的方向。做一个努力的人,可以说是人生最切实际的目标,是人生最大的境界。\n许多人因为给自己定的目标太高太功利,因为难以成功而变得灰头土脸,最终灰心失望。究其原因,往往就是因为太关注拥有,而忽略做一个努力的人。对于今天的孩子们,如果只关注他们将来该做个什么样的人物,不把意志品质作为一个做人的目标提出来,最终我们只能培养出狭隘、自私、脆弱和境界不高的人。遗憾的是,我们在这方面做得并不尽如人意。"; while (text.length > 0) {  // 添加文本视图展示,并获得剩余文本  text = [self addTextVIEwWithText:text originY:originY]; }
- (Nsstring *)addTextVIEwWithText:(Nsstring *)text originY:(CGfloat)originY { UITextVIEw *textVIEw = [[UITextVIEw alloc] initWithFrame:CGRectMake(0,kTextVIEwSize.height)]; ...... ...... ...... // 获取文本视图可容纳文本范围 NSRange textRange = [textVIEw.layoutManager glyphRangeForTextContainer:textVIEw.textContainer]; Nsstring *textVIEwText = [text substringWithRange:textRange]; textVIEw.text = textVIEwText; [self.scVIEw addSubvIEw:textVIEw]; // 获取容纳不了的剩余文本 Nsstring *remainText = [text substringFromIndex:NSMaxrange(textRange)]; return remainText;}

效果展示

动态文本分页

这里我们要实现的内容是:在文本框中填写内容,内容跟随文本的增多进行动态的分页,这里大部分内容其实是跟静态文本分页是一致,不太一样的是多个文本框是都可以编辑的,也就是上一个文本框会影响到下一个文本框的内容展示.以及存在着编写拼音的特殊处理时对于markText文本的处理.

1. 初始状态

我们会有一个可填写的文本框,我们填写文本框,将多余的文本进行添加新的文本框展示处理.

2. 完成状态

3. 关键代码展示

我们在textVIEwDIDChange的代理方法里进行一下 *** 作

3.1 获得文本实际高度来判断是否分页

 CGfloat realHeight = [textVIEw sizeThatFits:CGSizeMake(CGRectGetWIDth(textVIEw.bounds),MAXfloat)].height; // 判断是否需要分页 if (realHeight <= textVIEwSize.height) {  return; } // 进行分页处理 ...... ......

3.2 存在着编写拼音的特殊处理时对于markText文本的处理.

这边我们可以看到,当文本框正在拼音时存在markText,这个时候我们需要对这个情况特殊处理.

我们临时对textContainer的高度变高来容纳markText文本,之后再调回原有高度.

  // 获取mark文本以及相关位置大小  Nsstring *markText = [textVIEw textInRange:textVIEw.markedTextRange];  NSInteger location = [textVIEw offsetFromposition:textVIEw.beginningOfdocument toposition:textVIEw.markedTextRange.start];  NSRange markTextRange = NSMakeRange(location,markText.length);  Nsstring *primaryLang = [[textVIEw textinputMode] primaryLanguage];  BOol isZHHans = [primaryLang isEqualToString:@"zh-Hans"];    // 判断是否是在拼音  if (isZHHans && markTextRange.length != 0) {    // 临时调高container高度    textVIEw.textContainer.size = CGSizeMake(textVIEwSize.wIDth,realHeight);    BOol isContainENCharacter = NO;    for (int i = 0; i < markText.length; ++i) {      unichar character = [markText characteratIndex:i];      Nsstring *string = [Nsstring stringWithCharacters:&character length:1];      if ([string isLetter]) {        isContainENCharacter = YES;        break;      }    }    if (isContainENCharacter) {      return;    }  }  // 调回原有尺寸  textVIEw.textContainer.size = textVIEwSize;

3.3 对文本分页

NSRange range = [textVIEw.layoutManager glyphRangeForTextContainer:textVIEw.textContainer];textVIEw.text = [textVIEwText substringWithRange:range];[self handleBelowTextVIEwWithAboveTextVIEw:textVIEw totalText:[textVIEwText substringFromIndex:textVIEw.text.length]];

这里我们无法确定文本是否只影响下一文本框,所以我们这边会递归执行该方法到最后文本不再多余时结束递归.

- (voID)handleBelowTextVIEwWithAboveTextVIEw:(UITextVIEw *)textVIEw totalText:(Nsstring *)textVIEwText {  NSInteger sectionIndex = textVIEw.tag - kMarkTag;  // 判断是否已存在下一视图  UITextVIEw *belowTextVIEw = [self.scVIEw vIEwWithTag:kMarkTag + sectionIndex + 1];  if (belowTextVIEw) {    // 原有的文本添加到后面    Nsstring *oriText = belowTextVIEw.text;    NSMutableString *mString = [[NSMutableString alloc] initWithString:textVIEwText];    [mString appendString:oriText];    belowTextVIEw.text = mString.copy;  } else {    belowTextVIEw = [self contentTextVIEwWithIndex:++sectionIndex];    belowTextVIEw.text = textVIEwText;  }  [self.scVIEw addSubvIEw:belowTextVIEw];  self.scVIEw.contentSize = CGSizeMake(self.scVIEw.bounds.size.wIDth,CGRectGetMaxY(belowTextVIEw.frame));  CGfloat realBelowHeight = [belowTextVIEw sizeThatFits:CGSizeMake(CGRectGetWIDth(belowTextVIEw.bounds),MAXfloat)].height;  if (realBelowHeight <= belowTextVIEw.bounds.size.height) {    [belowTextVIEw becomeFirstResponder];    return;  }  belowTextVIEw.textContainer.size = belowTextVIEw.bounds.size;  NSRange range = [belowTextVIEw.layoutManager glyphRangeForTextContainer:belowTextVIEw.textContainer];  Nsstring *currentTmpBelowText = belowTextVIEw.text;  belowTextVIEw.text = [currentTmpBelowText substringWithRange:range];  Nsstring *remainText = [currentTmpBelowText substringFromIndex:belowTextVIEw.text.length];  // 再次执行方法,直到没有多余文本  [self handleBelowTextVIEwWithAboveTextVIEw:belowTextVIEw totalText:remainText];}

总结

总的来说我们对于文本分页的步骤:

判断文本的高度是否高于当前文本框的高度,如果不高于则不需要分页通过TextKit提供的方法glyphRangeForTextContainer获得文本框所能容纳的范围位置对文本进行截取,对剩余文本进行再次执行第2步的 *** 作,直到不能再分页为止

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

总结

以上是内存溢出为你收集整理的iOS实现文本分页的方法示例全部内容,希望文章能够帮你解决iOS实现文本分页的方法示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1109806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存