怎么在iOS中实现一个文本分页功能
这篇文章给大家介绍怎么在iOS中实现一个文本分页功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
静态文本分页
1.文本视图配置
1.1 设置textContainer
设置textContainer的尺寸为视图尺寸
设置lineFragmentPadding为0,让文本两边距离视图为0,计算更为准确
UITextView*textView=[[UITextViewalloc]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=[[UITextViewalloc]initWithFrame:CGRectMake(0,originY,kTextViewSize.width,kTextViewSize.height)]; textView.backgroundColor=[UIColoryellowColor]; textView.textColor=[UIColorblackColor]; //textContainer的最大高度,实际生成的视图高度将比此值小 textView.textContainer.size=CGSizeMake(CGRectGetWidth(textView.bounds),CGRectGetHeight(textView.bounds)); //需将文本内容填充区域置0处理,计算更准确 textView.textContainerInset=UIEdgeInsetsZero; //设置文本内容的左右间距为0 textView.textContainer.lineFragmentPadding=0.f; textView.text=text; textView.font=[UIFontsystemFontOfSize:16]; //允许连续布局 textView.layoutManager.allowsNonContiguousLayout=NO; textView.userInteractionEnabled=NO; textView.contentSize=textView.bounds.size;
2.文本视图数据配置
通过glyphRangeForTextContainer获取可容纳文本范围,再截取出文本,即可获得视图可展示的内容.
//获取文本视图可容纳文本范围 NSRangetextRange=[textView.layoutManagerglyphRangeForTextContainer:textView.textContainer]; NSString*textViewText=[textsubstringWithRange:textRange]; textView.text=textViewText;
3.关键代码展示
获取文本数据,对文本进行一段一段截取以达到分页.
NSString*text=@"有一次,在我参加的一个晚会上,主持人问一个小男孩:你长大以后要做什么样的人?孩子看看我们这些企业家,然后说:做企业家。在场的人忽地笑着鼓起了掌。我也拍了拍手,但听着并不舒服。我想,这孩子对于企业究竟知道多少呢?他是不是因为当着我们的面才说要当企业家的呢?他是不是受了大人的影响,以为企业家风光,都是有钱的人,才要当企业家的呢\n这一切当然都是一个谜。但不管怎样,作为一个人的人生志向,我以为当什么并不重要;不管是谁,最重要的是从小要立志做一个努力的人\n我小的时候也曾有人问过同样的问题,我的回答不外乎当教师、解放军和科学家之类。时光一晃流走了二十多年,当年的孩子,如今已是四十出头的大人。但仔细想一想,当年我在大人们跟前表白过的志向,实际一个也没有实现。我身边的其他人差不多也是如此。有的想当教师,后来却成了个体户;想当解放军的,有人竟做了囚犯。我上大学时有两个同窗好友,他们现在都是我国电子行业里才华出众的人,一个成长为“康佳”集团的老总,一个领导着TCL集团。我们三个不期而然地成为中国彩电骨干企业的经营者,可是当年大学毕业时,无论有多大的想像力,我们也不敢想十几年后会成现在的样子。一切都是我们在奋斗中见机行事,一步一步努力得来的。与其说我们是有理想的人,不如说我们是一直在努力的人。\n并非我们不重视理想,而是因为树雄心壮志易,为理想努力难,人生自古就如此。有谁会想到,十多年前的今天,我曾是一个在街头彷徨,为生存犯愁的人?当时的我,一无所有,前途渺茫,真不知路在何处。然而,我却没有灰心失望,回想起来,支撑着我走过这段坎坷岁月的正是我的意志品格。当许多人以为我已不行、该不行了的时候,我仍做着从地上爬起来的努力,我坚信人生就像马拉多纳踢球,往往是在快要倒下去的时候“进球”获得生机的。事实也正是如此,就在“山重水复疑无路”的时候,香港一家企业倒闭给了我东山再起的机会,使我能够与掌握世界最新技术的英国科技人员合作,开发技术先进的彩色电视机,从此一举走出困境。\n有人说,“努力”与“拥有”是人生一左一右的两道风景。但我以为,人生最美最不能逊色的风景应该是努力。努力是人生的一种精神状态,是对生命的一种赤子之情。努力是拥有之母,拥有是努力之子。一心努力可谓条条大路通罗马,只想获取可谓道路逼仄,天地窄小。所以,与其规定自己一定要成为一个什么样的人物,获得什么东西,不如磨练自己做一个努力的人。志向再高,没有努力,志向终难坚守;没有远大目标,因为努力,终会找到奋斗的方向。做一个努力的人,可以说是人生最切实际的目标,是人生最大的境界。\n许多人因为给自己定的目标太高太功利,因为难以成功而变得灰头土脸,最终灰心失望。究其原因,往往就是因为太关注拥有,而忽略做一个努力的人。对于今天的孩子们,如果只关注他们将来该做个什么样的人物,不把意志品质作为一个做人的目标提出来,最终我们只能培养出狭隘、自私、脆弱和境界不高的人。遗憾的是,我们在这方面做得并不尽如人意。"; while(text.length>0){ //添加文本视图展示,并获得剩余文本 text=[selfaddTextViewWithText:textoriginY:originY]; }
-(NSString*)addTextViewWithText:(NSString*)textoriginY:(CGFloat)originY{ UITextView*textView=[[UITextViewalloc]initWithFrame:CGRectMake(0,originY,kTextViewSize.width,kTextViewSize.height)]; ...... ...... ...... //获取文本视图可容纳文本范围 NSRangetextRange=[textView.layoutManagerglyphRangeForTextContainer:textView.textContainer]; NSString*textViewText=[textsubstringWithRange:textRange]; textView.text=textViewText; [self.scViewaddSubview:textView]; //获取容纳不了的剩余文本 NSString*remainText=[textsubstringFromIndex:NSMaxRange(textRange)]; returnremainText; }
效果展示
动态文本分页
这里我们要实现的内容是:在文本框中填写内容,内容跟随文本的增多进行动态的分页,这里大部分内容其实是跟静态文本分页是一致,不太一样的是多个文本框是都可以编辑的,也就是上一个文本框会影响到下一个文本框的内容展示.以及存在着编写拼音的特殊处理时对于markText文本的处理.
1. 初始状态
我们会有一个可填写的文本框,我们填写文本框,将多余的文本进行添加新的文本框展示处理.
2. 完成状态
3. 关键代码展示
我们在textViewDidChange的代理方法里进行一下操作
3.1 获得文本实际高度来判断是否分页
CGFloatrealHeight=[textViewsizeThatFits:CGSizeMake(CGRectGetWidth(textView.bounds),MAXFLOAT)].height; //判断是否需要分页 if(realHeight<=textViewSize.height){ return; } //进行分页处理 ...... ......
3.2 存在着编写拼音的特殊处理时对于markText文本的处理.
这边我们可以看到,当文本框正在拼音时存在markText,这个时候我们需要对这个情况特殊处理.
我们临时对textContainer的高度变高来容纳markText文本,之后再调回原有高度.
//获取mark文本以及相关位置大小 NSString*markText=[textViewtextInRange:textView.markedTextRange]; NSIntegerlocation=[textViewoffsetFromPosition:textView.beginningOfDocumenttoPosition:textView.markedTextRange.start]; NSRangemarkTextRange=NSMakeRange(location,markText.length); NSString*primaryLang=[[textViewtextInputMode]primaryLanguage]; BOOLisZHHans=[primaryLangisEqualToString:@"zh-Hans"]; //判断是否是在拼音 if(isZHHans&&markTextRange.length!=0){ //临时调高container高度 textView.textContainer.size=CGSizeMake(textViewSize.width,realHeight); BOOLisContainENCharacter=NO; for(inti=0;i<markText.length;++i){ unicharcharacter=[markTextcharacterAtIndex:i]; NSString*string=[NSStringstringWithCharacters:&characterlength:1]; if([stringisLetter]){ isContainENCharacter=YES; break; } } if(isContainENCharacter){ return; } } //调回原有尺寸 textView.textContainer.size=textViewSize;
3.3 对文本分页
NSRangerange=[textView.layoutManagerglyphRangeForTextContainer:textView.textContainer]; textView.text=[textViewTextsubstringWithRange:range]; [selfhandleBelowTextViewWithAboveTextView:textViewtotalText:[textViewTextsubstringFromIndex:textView.text.length]];
这里我们无法确定文本是否只影响下一文本框,所以我们这边会递归执行该方法到最后文本不再多余时结束递归.
-(void)handleBelowTextViewWithAboveTextView:(UITextView*)textViewtotalText:(NSString*)textViewText{ NSIntegersectionIndex=textView.tag-kMarkTag; //判断是否已存在下一视图 UITextView*belowTextView=[self.scViewviewWithTag:kMarkTag+sectionIndex+1]; if(belowTextView){ //原有的文本添加到后面 NSString*oriText=belowTextView.text; NSMutableString*mString=[[NSMutableStringalloc]initWithString:textViewText]; [mStringappendString:oriText]; belowTextView.text=mString.copy; }else{ belowTextView=[selfcontentTextViewWithIndex:++sectionIndex]; belowTextView.text=textViewText; } [self.scViewaddSubview:belowTextView]; self.scView.contentSize=CGSizeMake(self.scView.bounds.size.width,CGRectGetMaxY(belowTextView.frame)); CGFloatrealBelowHeight=[belowTextViewsizeThatFits:CGSizeMake(CGRectGetWidth(belowTextView.bounds),MAXFLOAT)].height; if(realBelowHeight<=belowTextView.bounds.size.height){ [belowTextViewbecomeFirstResponder]; return; } belowTextView.textContainer.size=belowTextView.bounds.size; NSRangerange=[belowTextView.layoutManagerglyphRangeForTextContainer:belowTextView.textContainer]; NSString*currentTmpBelowText=belowTextView.text; belowTextView.text=[currentTmpBelowTextsubstringWithRange:range]; NSString*remainText=[currentTmpBelowTextsubstringFromIndex:belowTextView.text.length]; //再次执行方法,直到没有多余文本 [selfhandleBelowTextViewWithAboveTextView:belowTextViewtotalText:remainText]; }
关于怎么在iOS中实现一个文本分页功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
微信小程序iOS端怎么暂停animated动画
-
iOS中多线程的示例分析
-
ios启动私有链查询区块信息的方法是什么
ios启动私有链查询区块信息的方法是什么本篇内容介绍了“ios启动...
-
正则表达式在ios中怎么用
正则表达式在ios中怎么用这篇文章主要为大家展示了“正则表达式在i...
-
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析今天就...
-
iOS中怎么删除无用的类
本篇文章给大家分享的是有关iOS中怎么删除无用的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话...
-
iOS中怎么实现一个序列动画
这篇文章给大家介绍iOS中怎么实现一个序列动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。UIViewPr...
-
iOS中怎么利用MVVM实现路由
iOS中怎么利用MVVM实现路由,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更...
-
iOS中怎么判断当前网络环境
本篇文章为大家展示了iOS中怎么判断当前网络环境,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所...
-
iOS中怎么改变UIBarButtonItem的大小
今天就跟大家聊聊有关iOS中怎么改变UIBarButtonItem的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结...