详解iPhone开发中电子书App里超长字符串分页问题

移动开发 iOS
iPhone开发中电子书App里超长字符串分页问题是本文哟啊介绍的内容,主要是来学习字符串分页的问题,来看本文详细内容讲解。

iPhone开发电子书App里超长字符串分页问题是本文哟啊介绍的内容,主要是来学习字符串分页的问题,来看本文详细内容讲解。超长字符串分页是所有做电子书之类的程序都会遇到的一个问题. 前一阵搞一个项目, 花了3天时间搞这个小方法, 总是分页不够精确. ***我发现了问题所在: 要用UILabel来显示文字, 而不是TextView!!

大体思路就是,把字符串分段落, 用段落去填充页. 下面是这个小方法, 希望会对大家有帮助:

  1. -(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{  
  2. //返回一个数组, 包含每一页的字符串开始点和长度(NSRange)  
  3. NSMutableArray *ranges=[NSMutableArray array];  
  4. //断行类型  
  5. UILineBreakMode lineBreakMode=UILineBreakModeCharacterWrap;  
  6. //显示字体的行高  
  7. CGFloat lineHeight=[@"Sample样本" sizeWithFont:font].height;  
  8. NSInteger maxLine=floor(r.size.height/lineHeight);  
  9. NSInteger totalLines=0;  
  10. NSLog(@”Max Line Per Page: %d (%.2f/%.2f)”,maxLine,r.size.height,lineHeight);  
  11. NSString *lastParaLeft=nil;  
  12. NSRange range=NSMakeRange(0, 0);  
  13. //把字符串按段落分开, 提高解析效率  
  14. NSArray *paragraphs=[cache componentsSeparatedByString:@"n"];  
  15. for (int p=0;p< [paragraphs count];p++) {  
  16. NSString *para;  
  17. if (lastParaLeft!=nil) {  
  18. //上一页完成后剩下的内容继续计算  
  19. para=lastParaLeft;  
  20. lastParaLeft=nil;  
  21. }else {  
  22. para=[paragraphs objectAtIndex:p];  
  23. if (p<[paragraphs count]-1)  
  24. para=[para stringByAppendingString:@"n"]; //刚才分段去掉了一个换行,现在换给它  
  25. }  
  26. CGSize paraSize=[para sizeWithFont:font  
  27. constrainedToSize:r.size  
  28. lineBreakMode:lineBreakMode];  
  29. NSInteger paraLines=floor(paraSize.height/lineHeight);  
  30. if (totalLines+paraLines<maxLine) {  
  31. totalLines+=paraLines;  
  32. range.length+=[para length];  
  33. if (p==[paragraphs count]-1) {  
  34. //到了文章的结尾 这一页也算  
  35. [ranges addObject:[NSValue valueWithRange:range]];  
  36. //IMILog(@”===========Page Over=============”);  
  37. }  
  38. }else if (totalLines+paraLines==maxLine) {  
  39. //很幸运, 刚好一段结束,本页也结束, 有这个判断会提高一定的效率  
  40. range.length+=[para length];  
  41. [ranges addObject:[NSValue valueWithRange:range]];  
  42. range.location+=range.length;  
  43. range.length=0;  
  44. totalLines=0;  
  45. //IMILog(@”===========Page Over=============”);  
  46. }else{  
  47. //重头戏, 页结束时候本段文字还有剩余  
  48. NSInteger lineLeft=maxLine-totalLines;  
  49. CGSize tmpSize;  
  50. NSInteger i;  
  51. for (i=1; i<[para length]; i++) {  
  52. //逐字判断是否达到了本页***容量  
  53. NSString *tmp=[para substringToIndex:i];  
  54. tmpSize=[tmp sizeWithFont:font  
  55. constrainedToSize:r.size  
  56. lineBreakMode:lineBreakMode];  
  57. int nowLine=floor(tmpSize.height/lineHeight);  
  58. if (lineLeft<nowLine) {  
  59. //超出容量,跳出, 字符要回退一个, 应为当前字符已经超出范围了  
  60. lastParaLeft=[para substringFromIndex:i-1];  
  61. break;  
  62. }  
  63. }  
  64. range.length+=i-1;  
  65. [ranges addObject:[NSValue valueWithRange:range]];  
  66. range.location+=range.length;  
  67. range.length=0;  
  68. totalLines=0;  
  69. p–;  
  70. //IMILog(@”===========Page Over=============”);  
  71. }  
  72.  
  73. }  
  74. return [NSArray arrayWithArray:ranges];  

小结:详解iPhone开发电子书App里超长字符串分页问题的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: i迷
相关推荐

2010-09-17 10:26:01

iPhone

2009-06-17 16:12:26

java电子书制作软件

2015-10-21 14:27:18

ORACLE 超长字符解决办法

2012-04-13 18:57:22

2012-04-09 17:24:11

电子书App

2009-06-12 16:52:49

2012-03-20 09:43:11

Boogie Boar

2013-06-14 10:13:06

PythonPython电子书Python教程

2020-03-03 15:17:45

Linux电子书命令

2011-12-13 14:43:29

51CTO

2021-12-15 19:37:49

索引字符串字段

2020-06-15 18:20:37

Fedora电子书开源

2023-05-04 07:37:44

KDEArianna

2018-12-05 16:00:32

MongoDB数据库NoSQL

2011-08-10 18:47:18

Cocoa字符串

2016-11-23 08:48:24

LinuxCalibre电子书

2012-11-28 11:33:46

Windows Ser

2020-01-02 11:20:35

LibreOffice电子书应用

2010-11-26 11:08:20

MySQL字符串

2010-08-27 09:24:14

盛大
点赞
收藏

51CTO技术栈公众号