詳解iPhone開發(fā)中電子書App里超長字符串分頁問題
iPhone開發(fā)中電子書App里超長字符串分頁問題是本文喲啊介紹的內(nèi)容,主要是來學(xué)習(xí)字符串分頁的問題,來看本文詳細(xì)內(nèi)容講解。超長字符串分頁是所有做電子書之類的程序都會遇到的一個問題. 前一陣搞一個項目, 花了3天時間搞這個小方法, 總是分頁不夠精確. ***我發(fā)現(xiàn)了問題所在: 要用UILabel來顯示文字, 而不是TextView!!
大體思路就是,把字符串分段落, 用段落去填充頁. 下面是這個小方法, 希望會對大家有幫助:
- -(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{
- //返回一個數(shù)組, 包含每一頁的字符串開始點和長度(NSRange)
- NSMutableArray *ranges=[NSMutableArray array];
- //斷行類型
- UILineBreakMode lineBreakMode=UILineBreakModeCharacterWrap;
- //顯示字體的行高
- CGFloat lineHeight=[@"Sample樣本" sizeWithFont:font].height;
- NSInteger maxLine=floor(r.size.height/lineHeight);
- NSInteger totalLines=0;
- NSLog(@”Max Line Per Page: %d (%.2f/%.2f)”,maxLine,r.size.height,lineHeight);
- NSString *lastParaLeft=nil;
- NSRange range=NSMakeRange(0, 0);
- //把字符串按段落分開, 提高解析效率
- NSArray *paragraphs=[cache componentsSeparatedByString:@"n"];
- for (int p=0;p< [paragraphs count];p++) {
- NSString *para;
- if (lastParaLeft!=nil) {
- //上一頁完成后剩下的內(nèi)容繼續(xù)計算
- para=lastParaLeft;
- lastParaLeft=nil;
- }else {
- para=[paragraphs objectAtIndex:p];
- if (p<[paragraphs count]-1)
- para=[para stringByAppendingString:@"n"]; //剛才分段去掉了一個換行,現(xiàn)在換給它
- }
- CGSize paraSize=[para sizeWithFont:font
- constrainedToSize:r.size
- lineBreakMode:lineBreakMode];
- NSInteger paraLines=floor(paraSize.height/lineHeight);
- if (totalLines+paraLines<maxLine) {
- totalLines+=paraLines;
- range.length+=[para length];
- if (p==[paragraphs count]-1) {
- //到了文章的結(jié)尾 這一頁也算
- [ranges addObject:[NSValue valueWithRange:range]];
- //IMILog(@”===========Page Over=============”);
- }
- }else if (totalLines+paraLines==maxLine) {
- //很幸運, 剛好一段結(jié)束,本頁也結(jié)束, 有這個判斷會提高一定的效率
- range.length+=[para length];
- [ranges addObject:[NSValue valueWithRange:range]];
- range.location+=range.length;
- range.length=0;
- totalLines=0;
- //IMILog(@”===========Page Over=============”);
- }else{
- //重頭戲, 頁結(jié)束時候本段文字還有剩余
- NSInteger lineLeft=maxLine-totalLines;
- CGSize tmpSize;
- NSInteger i;
- for (i=1; i<[para length]; i++) {
- //逐字判斷是否達(dá)到了本頁***容量
- NSString *tmp=[para substringToIndex:i];
- tmpSize=[tmp sizeWithFont:font
- constrainedToSize:r.size
- lineBreakMode:lineBreakMode];
- int nowLine=floor(tmpSize.height/lineHeight);
- if (lineLeft<nowLine) {
- //超出容量,跳出, 字符要回退一個, 應(yīng)為當(dāng)前字符已經(jīng)超出范圍了
- lastParaLeft=[para substringFromIndex:i-1];
- break;
- }
- }
- range.length+=i-1;
- [ranges addObject:[NSValue valueWithRange:range]];
- range.location+=range.length;
- range.length=0;
- totalLines=0;
- p–;
- //IMILog(@”===========Page Over=============”);
- }
- }
- return [NSArray arrayWithArray:ranges];
- }
小結(jié):詳解iPhone開發(fā)中電子書App里超長字符串分頁問題的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!