制作 iPhone 电子书时,如果把大段文字放在 UITextView 或 UILabel 里显示,是不能分页的,阅读时就像再看一大卷滚不到头的纸带,用户体验很差。下面这段代码可以实现 UILabel 尺寸固定,根据文本内容和字体动态分页显示,电子书方面的应用应该非常有用。

  1 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  2 - (void)viewDidLoad {  3     [super viewDidLoad];  4       5     //  6     totalPages = 0;  7     currentPage = 0;  8       9     // 10     textLabel.numberOfLines = 0; 11      12     // 13     if (!text) { 14         // 从文件里加载文本串 15         [self loadString]; 16          17         // 计算文本串的大小尺寸 18         CGSize totalTextSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX] 19                                          constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX) 20                                     lineBreakMode:UILineBreakModeWordWrap]; 21  22         // 如果一页就能显示完,直接显示所有文本串即可。 23         if (totalTextSize.height < textLabel.frame.size.height) { 24             textLabel.text = text; 25         } 26         else { 27             // 计算理想状态下的页面数量和每页所显示的字符数量,只是拿来作为参考值用而已! 28             NSUInteger textLength = [text length]; 29             referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1; 30             referCharatersPerPage = textLength/referTotalPages; 31              32             // 申请最终保存页面NSRange信息的数组缓冲区 33             int maxPages = referTotalPages; 34             rangeOfPages = (NSRange *)malloc(referTotalPages*sizeof(NSRange)); 35             memset(rangeOfPages, 0x0, referTotalPages*sizeof(NSRange)); 36              37             // 页面索引 38             int page = 0; 39              40             for (NSUInteger location = 0; location < textLength; ) { 41                 // 先计算临界点(尺寸刚刚超过UILabel尺寸时的文本串) 42                 NSRange range = NSMakeRange(location, referCharatersPerPage); 43                  44                 // reach end of text ? 45                 NSString *pageText; 46                 CGSize pageTextSize; 47                  48                 while (range.location + range.length < textLength) { 49                     pageText = [text substringWithRange:range]; 50                      51                     pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX] 52                                         constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX) 53                                             lineBreakMode:UILineBreakModeWordWrap]; 54                      55                     if (pageTextSize.height > textLabel.frame.size.height) { 56                         break; 57                     } 58                     else { 59                         range.length += referCharatersPerPage; 60                     } 61                 } 62                  63                 if (range.location + range.length >= textLength) { 64                     range.length = textLength - range.location; 65                 } 66                  67                 // 然后一个个缩短字符串的长度,当缩短后的字符串尺寸小于textLabel的尺寸时即为满足 68                 while (range.length > 0) { 69                     pageText = [text substringWithRange:range]; 70                      71                     pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX] 72                                         constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX) 73                                             lineBreakMode:UILineBreakModeWordWrap]; 74                      75                     if (pageTextSize.height <= textLabel.frame.size.height) { 76                         range.length = [pageText length]; 77                         break; 78                     } 79                     else { 80                         range.length -= 2; 81                     } 82                 } 83                  84                 // 得到一个页面的显示范围 85                 if (page >= maxPages) { 86                     maxPages += 10; 87                     rangeOfPages = (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange)); 88                 } 89                 rangeOfPages[page++] = range; 90                  91                 // 更新游标 92                 location += range.length; 93             } 94  95             // 获取最终页面数量 96             totalPages = page; 97              98             // 更新UILabel内容 99             textLabel.text = [text substringWithRange:rangeOfPages[currentPage]];100         }101     }102     103     // 显示当前页面进度信息,格式为:"8/100"104     pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];105 }

 1 // 上一页 2 - (IBAction)actionPrevious:(id)sender { 3     if (currentPage > 0) { 4         currentPage--; 5          6         NSRange range = rangeOfPages[currentPage]; 7         NSString *pageText = [text substringWithRange:range]; 8          9         textLabel.text = pageText;10 11         //12         pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];13     }14 }

 1 // 下一页 2 - (IBAction)actionNext:(id)sender { 3     if (currentPage < totalPages-1) { 4         currentPage++; 5          6         NSRange range = rangeOfPages[currentPage]; 7         NSString *pageText = [text substringWithRange:range]; 8          9         textLabel.text = pageText;10         11         //12         pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];13     }14 }

转载于:https://www.cnblogs.com/pengyingh/articles/2341022.html

实现 iPhone 电子书的分页显示功能相关推荐

  1. 实现 iPhone 电子书的分页显示功能的代码

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650497 原文地址:实现 iPhone 电子书的分页显示功能的代码 作者: 醉 ...

  2. 实现iPhone电子书的分页显示功能(附代码)

    实现iPhone电子书的分页显示功能(附代码) 2016-01-10 21:45  294人阅读  评论(0)  收藏  编辑  删除 最近我们介绍了几个iPhone开发的代码测试案例,今天我们将介绍 ...

  3. 实现 iPhone 电子书的分页显示功能的代码 转载

    原文地址:实现 iPhone 电子书的分页显示功能的代码 作者:醉吻花颜 作 iPhone 电子书时,如果把大段文字放在 UITextView 或 UILabel里显示,是不能分页的,阅读时就像再看一 ...

  4. 实现 iPhone 电子书的分页显示功能的代码(收藏)

    2019独角兽企业重金招聘Python工程师标准>>> http://www.cocoachina.com/iphonedev/sdk/2010/0908/2091.html 转载于 ...

  5. iPhone电子书toolbar的实现

    iPhone电子书的toolbar一般都设计成半透明,上面放置一个进度条和一个Label(用于显示页码),这里用代码做一个最基本的实现. 生成一个UIToolbar UIToolbar *toolba ...

  6. iPhone 电子书toolbar的实现

    iPhone电子书的toolbar一般都设计成半透明,上面放置一个进度条和一个Label(用于显示页码),这里用代码做一个最基本的实现. 生成一个UIToolbar UIToolbar *toolba ...

  7. 手把手之:教你怎样制作iPhone电子书

    <script language='javascript' src='http://www.shiqiaotou.com/donetk/Header.js'></script> ...

  8. 一个简易版的iphone电子书阅读器

    2019独角兽企业重金招聘Python工程师标准>>> 一个简易版的iphone电子书阅读器 里面的基本功能都有了 感兴趣的朋友可以下来研究 点击此处下载源码 转载:http://w ...

  9. web分页显示功能(“小案例:实现web端对客户资源的增删改查”里面的一个功能)

    分页显示功能("小案例:实现web端对客户资源的增删改查"里面的一个功能) (2016年11月19日18:15:07 上课学习总结) 效果展示: 第n页/共M页   首页  上一页 ...

最新文章

  1. C++中 何时用. 何时用-」
  2. php反序列化漏洞原理,PHP反序列化原理及漏洞解析
  3. 只要用心就可以看见 十个幸福瞬间照片
  4. easypoi list中的map导出_如何优雅的导出 Excel
  5. 诗与远方:无题(十四)
  6. python中numpy、matplotlib的引入及测试
  7. 毕设日志——RCNN
  8. 给大家讲讲在哪些地方发外链最好
  9. 给java虚拟机增加一个属性,java -D
  10. 在 for 循环里写加号拼接字符串的那个同事,不见了~
  11. ansys linux安装包_ANSYS15.0 for Linux下载及安装教程 - 图文 -
  12. iOS12完美越狱来了!漫谈iOS12缓解机制
  13. 网页如何开启Gzip压缩
  14. DHCP原理及DHCP服务器的防攻击手段
  15. 计算机专业关于Java读书笔记_《Java8学习笔记》读书笔记(四)
  16. 编写一个方法,将一段文本中的各个单词的字母顺序翻转题
  17. must be unique: xxx.xxx.xxx:xxx:jar -> duplicate declaration of version 0.0.1 @ line 25, column 21
  18. Ubuntu下配置、训练YOLO的全过程——无人机检测小系统
  19. 网络故障诊断 - 使用TTL分析网络故障
  20. 引用图标库到自己页面

热门文章

  1. Android 12 预览版带给我们的1234
  2. abp mysql Failed executing DbCommand (0ms) [Parameters=[], CommandType=‘Text‘, CommandTimeout=‘30‘]
  3. 欧鹏浏览器html5用不了,HTML5新时代 欧朋浏览器H5体验版试用
  4. 用js判断是widows还是linux,JS 如何判断浏览器是安卓还是苹果
  5. 在微型计算机机箱的面板上,为了能装ATX主板,这款小机箱在设计上费尽心思
  6. 页面布局(2):腾讯首页
  7. win8 应用商店链接不上
  8. c#垂直投影法_第五套人民币10元和5元纸币采用了固定花卉水印和白水印,其中,白水印的特点是...
  9. Android四大组件之broadcast广播使用整理笔记
  10. 平板电脑 android 2,搭载Android2.2 万利达T2平板电脑评测