怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能-創(chuàng)新互聯(lián)

這篇文章給大家介紹怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到雙陽(yáng)網(wǎng)站設(shè)計(jì)與雙陽(yáng)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋雙陽(yáng)地區(qū)。

靜態(tài)文本分頁(yè)

1.文本視圖配置

1.1 設(shè)置textContainer

  • 設(shè)置textContainer的尺寸為視圖尺寸

  • 設(shè)置lineFragmentPadding為0,讓文本兩邊距離視圖為0,計(jì)算更為準(zhǔn)確

 UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, originY, kTextViewSize.width, kTextViewSize.height)];
 // textContainer的大高度,實(shí)際生成的視圖高度將比此值小
 textView.textContainer.size = CGSizeMake(CGRectGetWidth(textView.bounds), CGRectGetHeight(textView.bounds));
 // 設(shè)置文本內(nèi)容的左右間距為0
 textView.textContainer.lineFragmentPadding = 0.f;

1.2 文本視圖基礎(chǔ)設(shè)置

設(shè)置文本上下邊間距為0,讓文本能夠撐滿(mǎn)視圖

 textView.textContainerInset = UIEdgeInsetsZero;

設(shè)置文本視圖連續(xù)布局

 // 允許連續(xù)布局
 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的大高度,實(shí)際生成的視圖高度將比此值小
 textView.textContainer.size = CGSizeMake(CGRectGetWidth(textView.bounds), CGRectGetHeight(textView.bounds));
 // 需將文本內(nèi)容填充區(qū)域置0處理,計(jì)算更準(zhǔn)確
 textView.textContainerInset = UIEdgeInsetsZero;
 // 設(shè)置文本內(nèi)容的左右間距為0
 textView.textContainer.lineFragmentPadding = 0.f;
 textView.text = text;
 textView.font = [UIFont systemFontOfSize:16];
 // 允許連續(xù)布局
 textView.layoutManager.allowsNonContiguousLayout = NO;
 textView.userInteractionEnabled = NO;
 textView.contentSize = textView.bounds.size;

2.文本視圖數(shù)據(jù)配置

通過(guò)glyphRangeForTextContainer獲取可容納文本范圍,再截取出文本,即可獲得視圖可展示的內(nèi)容.

 // 獲取文本視圖可容納文本范圍
 NSRange textRange = [textView.layoutManager glyphRangeForTextContainer:textView.textContainer];
 NSString *textViewText = [text substringWithRange:textRange];
 textView.text = textViewText;

3.關(guān)鍵代碼展示

獲取文本數(shù)據(jù),對(duì)文本進(jìn)行一段一段截取以達(dá)到分頁(yè).

 NSString *text = @"有一次,在我參加的一個(gè)晚會(huì)上,主持人問(wèn)一個(gè)小男孩:你長(zhǎng)大以后要做什么樣的人?孩子看看我們這些企業(yè)家,然后說(shuō):做企業(yè)家。在場(chǎng)的人忽地笑著鼓起了掌。我也拍了拍手,但聽(tīng)著并不舒服。我想,這孩子對(duì)于企業(yè)究竟知道多少呢?他是不是因?yàn)楫?dāng)著我們的面才說(shuō)要當(dāng)企業(yè)家的呢?他是不是受了大人的影響,以為企業(yè)家風(fēng)光,都是有錢(qián)的人,才要當(dāng)企業(yè)家的呢\n這一切當(dāng)然都是一個(gè)謎。但不管怎樣,作為一個(gè)人的人生志向,我以為當(dāng)什么并不重要;不管是誰(shuí),最重要的是從小要立志做一個(gè)努力的人\n我小的時(shí)候也曾有人問(wèn)過(guò)同樣的問(wèn)題,我的回答不外乎當(dāng)教師、解放軍和科學(xué)家之類(lèi)。時(shí)光一晃流走了二十多年,當(dāng)年的孩子,如今已是四十出頭的大人。但仔細(xì)想一想,當(dāng)年我在大人們跟前表白過(guò)的志向,實(shí)際一個(gè)也沒(méi)有實(shí)現(xiàn)。我身邊的其他人差不多也是如此。有的想當(dāng)教師,后來(lái)卻成了個(gè)體戶(hù);想當(dāng)解放軍的,有人竟做了囚犯。我上大學(xué)時(shí)有兩個(gè)同窗好友,他們現(xiàn)在都是我國(guó)電子行業(yè)里才華出眾的人,一個(gè)成長(zhǎng)為“康佳”集團(tuán)的老總,一個(gè)領(lǐng)導(dǎo)著TCL集團(tuán)。我們?nèi)齻€(gè)不期而然地成為中國(guó)彩電骨干企業(yè)的經(jīng)營(yíng)者,可是當(dāng)年大學(xué)畢業(yè)時(shí),無(wú)論有多大的想像力,我們也不敢想十幾年后會(huì)成現(xiàn)在的樣子。一切都是我們?cè)趭^斗中見(jiàn)機(jī)行事,一步一步努力得來(lái)的。與其說(shuō)我們是有理想的人,不如說(shuō)我們是一直在努力的人。\n并非我們不重視理想,而是因?yàn)闃?shù)雄心壯志易,為理想努力難,人生自古就如此。有誰(shuí)會(huì)想到,十多年前的今天,我曾是一個(gè)在街頭彷徨,為生存犯愁的人?當(dāng)時(shí)的我,一無(wú)所有,前途渺茫,真不知路在何處。然而,我卻沒(méi)有灰心失望,回想起來(lái),支撐著我走過(guò)這段坎坷歲月的正是我的意志品格。當(dāng)許多人以為我已不行、該不行了的時(shí)候,我仍做著從地上爬起來(lái)的努力,我堅(jiān)信人生就像馬拉多納踢球,往往是在快要倒下去的時(shí)候“進(jìn)球”獲得生機(jī)的。事實(shí)也正是如此,就在“山重水復(fù)疑無(wú)路”的時(shí)候,香港一家企業(yè)倒閉給了我東山再起的機(jī)會(huì),使我能夠與掌握世界最新技術(shù)的英國(guó)科技人員合作,開(kāi)發(fā)技術(shù)先進(jìn)的彩色電視機(jī),從此一舉走出困境。\n有人說(shuō),“努力”與“擁有”是人生一左一右的兩道風(fēng)景。但我以為,人生最美最不能遜色的風(fēng)景應(yīng)該是努力。努力是人生的一種精神狀態(tài),是對(duì)生命的一種赤子之情。努力是擁有之母,擁有是努力之子。一心努力可謂條條大路通羅馬,只想獲取可謂道路逼仄,天地窄小。所以,與其規(guī)定自己一定要成為一個(gè)什么樣的人物,獲得什么東西,不如磨練自己做一個(gè)努力的人。志向再高,沒(méi)有努力,志向終難堅(jiān)守;沒(méi)有遠(yuǎn)大目標(biāo),因?yàn)榕ΓK會(huì)找到奮斗的方向。做一個(gè)努力的人,可以說(shuō)是人生最切實(shí)際的目標(biāo),是人生大的境界。\n許多人因?yàn)榻o自己定的目標(biāo)太高太功利,因?yàn)殡y以成功而變得灰頭土臉,最終灰心失望。究其原因,往往就是因?yàn)樘P(guān)注擁有,而忽略做一個(gè)努力的人。對(duì)于今天的孩子們,如果只關(guān)注他們將來(lái)該做個(gè)什么樣的人物,不把意志品質(zhì)作為一個(gè)做人的目標(biāo)提出來(lái),最終我們只能培養(yǎng)出狹隘、自私、脆弱和境界不高的人。遺憾的是,我們?cè)谶@方面做得并不盡如人意。";
 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;
}

效果展示

怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能

動(dòng)態(tài)文本分頁(yè)

這里我們要實(shí)現(xiàn)的內(nèi)容是:在文本框中填寫(xiě)內(nèi)容,內(nèi)容跟隨文本的增多進(jìn)行動(dòng)態(tài)的分頁(yè),這里大部分內(nèi)容其實(shí)是跟靜態(tài)文本分頁(yè)是一致,不太一樣的是多個(gè)文本框是都可以編輯的,也就是上一個(gè)文本框會(huì)影響到下一個(gè)文本框的內(nèi)容展示.以及存在著編寫(xiě)拼音的特殊處理時(shí)對(duì)于markText文本的處理.

1. 初始狀態(tài)

我們會(huì)有一個(gè)可填寫(xiě)的文本框,我們填寫(xiě)文本框,將多余的文本進(jìn)行添加新的文本框展示處理.

怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能

2. 完成狀態(tài)

怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能

3. 關(guān)鍵代碼展示

我們?cè)趖extViewDidChange的代理方法里進(jìn)行一下操作

3.1 獲得文本實(shí)際高度來(lái)判斷是否分頁(yè)

 CGFloat realHeight = [textView sizeThatFits:CGSizeMake(CGRectGetWidth(textView.bounds), MAXFLOAT)].height;
 
 // 判斷是否需要分頁(yè)
 if (realHeight <= textViewSize.height) {
  return;
 }
 
 // 進(jìn)行分頁(yè)處理
 ......
 ......

3.2 存在著編寫(xiě)拼音的特殊處理時(shí)對(duì)于markText文本的處理.

怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能

這邊我們可以看到,當(dāng)文本框正在拼音時(shí)存在markText,這個(gè)時(shí)候我們需要對(duì)這個(gè)情況特殊處理.

我們臨時(shí)對(duì)textContainer的高度變高來(lái)容納markText文本,之后再調(diào)回原有高度.

  // 獲取mark文本以及相關(guān)位置大小
  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) {
    // 臨時(shí)調(diào)高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;
    }
  }
  
  // 調(diào)回原有尺寸
  textView.textContainer.size = textViewSize;

3.3 對(duì)文本分頁(yè)

NSRange range = [textView.layoutManager glyphRangeForTextContainer:textView.textContainer];
textView.text = [textViewText substringWithRange:range];

[self handleBelowTextViewWithAboveTextView:textView totalText:[textViewText substringFromIndex:textView.text.length]];

這里我們無(wú)法確定文本是否只影響下一文本框,所以我們這邊會(huì)遞歸執(zhí)行該方法到最后文本不再多余時(shí)結(jié)束遞歸.

- (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];
  
  // 再次執(zhí)行方法,直到?jīng)]有多余文本
  [self handleBelowTextViewWithAboveTextView:belowTextView totalText:remainText];
}

關(guān)于怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

本文名稱(chēng):怎么在iOS中實(shí)現(xiàn)一個(gè)文本分頁(yè)功能-創(chuàng)新互聯(lián)
分享路徑:http://muchs.cn/article30/dppjpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站維護(hù)、面包屑導(dǎo)航、搜索引擎優(yōu)化、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)