亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現文本分頁的方法示例

2020-07-26 02:19:12
字體:
來源:轉載
供稿:網友

前言

本篇文章將分為兩部分,一部分是靜態文本分頁,一部分是動態文本分頁即邊填寫文本邊進行文本的分頁.

我們所采用的方案為: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, originY, kTextViewSize.width, kTextViewSize.height)]; textView.backgroundColor = [UIColor yellowColor]; textView.textColor = [UIColor blackColor]; // 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 = [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, originY, kTextViewSize.width, 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];}

總結

總的來說我們對于文本分頁的步驟:

  1. 判斷文本的高度是否高于當前文本框的高度,如果不高于則不需要分頁
  2. 通過TextKit提供的方法glyphRangeForTextContainer獲得文本框所能容納的范圍位置
  3. 對文本進行截取,對剩余文本進行再次執行第2步的操作,直到不能再分頁為止

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线观看| 欧美成aaa人片免费看| 日本中文字幕不卡免费| 91久久国产精品91久久性色| 精品国模在线视频| 欧美激情亚洲视频| 九九精品在线视频| 久久国产精品久久国产精品| 国产www精品| 欧美在线播放视频| 国产综合香蕉五月婷在线| 亚洲天堂网在线观看| 亚洲国产99精品国自产| 精品欧美一区二区三区| 欧美激情精品久久久| 欧美精品久久久久| 亚洲欧美国产一本综合首页| 96精品久久久久中文字幕| 国产va免费精品高清在线观看| 国产精品一区二区久久| 国产精品久久久久影院日本| 国产精品第8页| 午夜免费久久久久| 成人欧美一区二区三区在线湿哒哒| 91精品国产色综合久久不卡98口| 日韩av最新在线| 欧美成人午夜激情视频| 欧美日韩国产第一页| 亚洲欧美日韩精品久久奇米色影视| 国产精品免费电影| 26uuu亚洲国产精品| 国产精品久久久久久久久久久新郎| 777国产偷窥盗摄精品视频| 亚洲乱码一区av黑人高潮| 91性高湖久久久久久久久_久久99| 亚洲人成自拍网站| 欧美大尺度在线观看| 久久久久日韩精品久久久男男| 国外成人在线播放| 国产日本欧美在线观看| 国产婷婷97碰碰久久人人蜜臀| 这里只有精品丝袜| 992tv成人免费影院| 欧美日韩另类在线| 日本老师69xxx| 高潮白浆女日韩av免费看| 国产午夜精品视频| 欧美日韩中文字幕日韩欧美| 日韩精品在线第一页| 国产丝袜一区二区| 亚洲欧洲中文天堂| 日本一本a高清免费不卡| 欧美夜福利tv在线| 亚洲精品综合久久中文字幕| 成人亚洲综合色就1024| 亚洲激情视频在线观看| 欧美美女18p| 精品日韩视频在线观看| 国产一区二区三区在线观看网站| 亚洲图片制服诱惑| 97在线精品视频| 91久久久久久| 国产精品美女午夜av| 久久久最新网址| 日韩欧美精品网站| 亚洲免费电影在线观看| 欧美超级免费视 在线| 狠狠综合久久av一区二区小说| 国产精品69精品一区二区三区| 国产美女被下药99| 97视频在线观看网址| 91在线网站视频| 日韩欧美亚洲一二三区| 国产亚洲视频中文字幕视频| 久久久久在线观看| 成人在线激情视频| 一本色道久久综合狠狠躁篇的优点| 久久久电影免费观看完整版| 国产精品第一视频| 欧美一性一乱一交一视频| 亚洲国产成人久久综合一区| 91av成人在线| 久久精品成人动漫| 午夜精品蜜臀一区二区三区免费| 亚洲国产成人精品久久久国产成人一区| 2019中文字幕在线| 欧美性猛交xxxx乱大交极品| 日本成人黄色片| 国产成人精品亚洲精品| 黄色91在线观看| 5278欧美一区二区三区| 色天天综合狠狠色| 国产综合视频在线观看| 欧美激情xxxxx| 伊人成人开心激情综合网| 国产激情视频一区| 亚洲男女性事视频| 精品国产一区二区三区久久| 亚洲精品久久久久| 欧美最猛黑人xxxx黑人猛叫黄| 欧美成人精品xxx| 欧美成人精品在线视频| 久久免费少妇高潮久久精品99| 日本久久久久亚洲中字幕| 亚洲欧美国产一本综合首页| 日韩综合中文字幕| 国产香蕉一区二区三区在线视频| 国产香蕉一区二区三区在线视频| 伊人伊成久久人综合网小说| 欧美黑人巨大xxx极品| 精品一区二区三区四区在线| 正在播放欧美视频| 欧美日韩电影在线观看| 精品国产一区二区三区四区在线观看| www.久久久久久.com| 亚洲电影成人av99爱色| 奇米成人av国产一区二区三区| 疯狂蹂躏欧美一区二区精品| 亚洲综合视频1区| 亚洲成成品网站| 国产精品黄页免费高清在线观看| 欧美人成在线视频| 国产精品电影网站| 狠狠躁夜夜躁人人躁婷婷91| 久久久精品一区二区三区| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲天堂成人在线视频| 91久热免费在线视频| 久久久国产一区二区三区| 欧美午夜精品伦理| 国产激情久久久久| 欧美大片网站在线观看| 亚洲国产精品网站| 久久av在线播放| 55夜色66夜色国产精品视频| 欧美国产日韩精品| 美女视频久久黄| 国产欧美一区二区| 欧美性猛交xxxx免费看漫画| 欧美一区二区三区艳史| 欧美另类99xxxxx| 96pao国产成视频永久免费| 国产精品亚洲一区二区三区| 富二代精品短视频| 成人福利网站在线观看11| 亚洲欧洲日韩国产| 亚洲免费视频在线观看| 亚洲国产欧美一区二区三区久久| 日韩电影在线观看免费| 美女久久久久久久久久久| 国产精品入口免费视频一| 日韩成人免费视频| 日韩专区在线观看| 国内揄拍国内精品少妇国语| 欧美日韩福利在线观看| 亚洲福利视频网站| 国产精品午夜国产小视频| 欧美精品videos| 91精品国产91久久久久久不卡| 欧美性猛交xxxx免费看漫画| 国产精品久久久久久久一区探花| 亚洲精品wwwww| 欧美一区亚洲一区| 欧美日韩亚洲精品一区二区三区|