最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實現(xiàn)文本分頁的方法示例

 更新時間:2019年09月06日 14:44:18   作者:Diff  
這篇文章主要給大家介紹了關(guān)于iOS實現(xiàn)文本分頁的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

我們所采用的方案為:TextKit進行處理,通過glyphRangeForTextContainer方法獲取文本內(nèi)容視圖可容納的文本范圍來對文本進行切割分頁.

// 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;

靜態(tài)文本分頁

1.文本視圖配置

1.1 設(shè)置textContainer

  • 設(shè)置textContainer的尺寸為視圖尺寸
  • 設(shè)置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));
 // 設(shè)置文本內(nèi)容的左右間距為0
 textView.textContainer.lineFragmentPadding = 0.f;

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

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

 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的最大高度,實際生成的視圖高度將比此值小
 textView.textContainer.size = CGSizeMake(CGRectGetWidth(textView.bounds), CGRectGetHeight(textView.bounds));
 // 需將文本內(nèi)容填充區(qū)域置0處理,計算更準確
 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ù)配置

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

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

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

獲取文本數(shù)據(jù),對文本進行一段一段截取以達到分頁.

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

效果展示

動態(tài)文本分頁

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

1. 初始狀態(tài)

我們會有一個可填寫的文本框,我們填寫文本框,將多余的文本進行添加新的文本框展示處理.

2. 完成狀態(tài)

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

我們在textViewDidChange的代理方法里進行一下操作

3.1 獲得文本實際高度來判斷是否分頁

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

3.2 存在著編寫拼音的特殊處理時對于markText文本的處理.

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

我們臨時對textContainer的高度變高來容納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) {
    // 臨時調(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 對文本分頁

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

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

這里我們無法確定文本是否只影響下一文本框,所以我們這邊會遞歸執(zhí)行該方法到最后文本不再多余時結(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];
}

總結(jié)

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

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

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • iOS實現(xiàn)微信/QQ顯示最近拍攝圖片的功能實例代碼

    iOS實現(xiàn)微信/QQ顯示最近拍攝圖片的功能實例代碼

    如果你剛剛拍攝了圖片,在使用微信/QQ發(fā)生消息時會顯示“你可能要發(fā)送的圖片”,這個功能非常人性化,怎么實現(xiàn)的呢?下面小編給大家分享iOS實現(xiàn)微信/QQ顯示最近拍攝圖片的功能實例代碼,一起看看吧
    2017-03-03
  • IOS開發(fā)之路--C語言存儲方式和作用域

    IOS開發(fā)之路--C語言存儲方式和作用域

    只有你完全了解每個變量或函數(shù)存儲方式、作用范圍和銷毀時間才可能正確的使用這門語言。今天將著重介紹C語言中變量作用范圍、存儲方式、生命周期、作用域和可訪問性。
    2014-08-08
  • iOS中Sqlite和FMDB使用詳解

    iOS中Sqlite和FMDB使用詳解

    這篇文章主要為大家介紹了iOS中Sqlite和FMDB使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • iOS實現(xiàn)循環(huán)滾動公告欄

    iOS實現(xiàn)循環(huán)滾動公告欄

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)循環(huán)滾動公告欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 設(shè)計模式中的迭代器模式在Cocoa Touch框架中的使用

    設(shè)計模式中的迭代器模式在Cocoa Touch框架中的使用

    這篇文章主要介紹了設(shè)計模式中的迭代器模式在Cocoa Touch框架中的使用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-03-03
  • IOS中Weex 加載 .xcassets 中的圖片資源的實例詳解

    IOS中Weex 加載 .xcassets 中的圖片資源的實例詳解

    這篇文章主要介紹了IOS中Weex 加載 .xcassets 中的圖片資源的實例詳解的相關(guān)資料,希望通過本文介紹能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • ios中g(shù)etTime()的兼容性實例代碼

    ios中g(shù)etTime()的兼容性實例代碼

    在本篇文章里小編給大家整理的是關(guān)于ios中g(shù)etTime()的兼容性實例代碼,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • IOS中UIWebView加載Loading的實現(xiàn)方法

    IOS中UIWebView加載Loading的實現(xiàn)方法

    最近有朋友問我類似微信語音播放的喇叭動畫和界面圖片加載loading界面是怎樣實現(xiàn)的,是不是就是一個gif圖片呢!我的回答當(dāng)然是否定了,當(dāng)然不排除也有人用gif圖片啊!
    2015-05-05
  • IOS開發(fā)之適配iOS10及Xcode8的注意點

    IOS開發(fā)之適配iOS10及Xcode8的注意點

    這篇文章主要介紹了IOS開發(fā)之適配iOS10及Xcode8的注意點,本文給大家介紹了可能出現(xiàn)的問題及相應(yīng)的解決方法,非常不錯具有參考借鑒價值,感興趣的朋友一起看看
    2016-10-10
  • 解決ios audio無法播放問題

    解決ios audio無法播放問題

    這篇文章主要介紹了解決ios audio無法播放問題,并給大家分享了解決方法,需要的朋友參考一下。
    2017-11-11

最新評論

五台县| 县级市| 太仓市| 芮城县| 驻马店市| 仁布县| 德保县| 奎屯市| 绥中县| 丹江口市| 易门县| 渭源县| 印江| 长岭县| 龙胜| 伊春市| 八宿县| 库车县| 武功县| 炉霍县| 临武县| 大悟县| 蒙城县| 南丰县| 肇州县| 锦屏县| 政和县| 五寨县| 灵宝市| 德惠市| 宜城市| 四平市| 周口市| 大城县| 雷山县| 固安县| 三门县| 台北市| 民权县| 鄂伦春自治旗| 正镶白旗|