实现 iPhone 电子书的分页显示功能
制作 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 电子书的分页显示功能相关推荐
- 实现 iPhone 电子书的分页显示功能的代码
本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650497 原文地址:实现 iPhone 电子书的分页显示功能的代码 作者: 醉 ...
- 实现iPhone电子书的分页显示功能(附代码)
实现iPhone电子书的分页显示功能(附代码) 2016-01-10 21:45 294人阅读 评论(0) 收藏 编辑 删除 最近我们介绍了几个iPhone开发的代码测试案例,今天我们将介绍 ...
- 实现 iPhone 电子书的分页显示功能的代码 转载
原文地址:实现 iPhone 电子书的分页显示功能的代码 作者:醉吻花颜 作 iPhone 电子书时,如果把大段文字放在 UITextView 或 UILabel里显示,是不能分页的,阅读时就像再看一 ...
- 实现 iPhone 电子书的分页显示功能的代码(收藏)
2019独角兽企业重金招聘Python工程师标准>>> http://www.cocoachina.com/iphonedev/sdk/2010/0908/2091.html 转载于 ...
- iPhone电子书toolbar的实现
iPhone电子书的toolbar一般都设计成半透明,上面放置一个进度条和一个Label(用于显示页码),这里用代码做一个最基本的实现. 生成一个UIToolbar UIToolbar *toolba ...
- iPhone 电子书toolbar的实现
iPhone电子书的toolbar一般都设计成半透明,上面放置一个进度条和一个Label(用于显示页码),这里用代码做一个最基本的实现. 生成一个UIToolbar UIToolbar *toolba ...
- 手把手之:教你怎样制作iPhone电子书
<script language='javascript' src='http://www.shiqiaotou.com/donetk/Header.js'></script> ...
- 一个简易版的iphone电子书阅读器
2019独角兽企业重金招聘Python工程师标准>>> 一个简易版的iphone电子书阅读器 里面的基本功能都有了 感兴趣的朋友可以下来研究 点击此处下载源码 转载:http://w ...
- web分页显示功能(“小案例:实现web端对客户资源的增删改查”里面的一个功能)
分页显示功能("小案例:实现web端对客户资源的增删改查"里面的一个功能) (2016年11月19日18:15:07 上课学习总结) 效果展示: 第n页/共M页 首页 上一页 ...
最新文章
- C++中 何时用. 何时用-」
- php反序列化漏洞原理,PHP反序列化原理及漏洞解析
- 只要用心就可以看见 十个幸福瞬间照片
- easypoi list中的map导出_如何优雅的导出 Excel
- 诗与远方:无题(十四)
- python中numpy、matplotlib的引入及测试
- 毕设日志——RCNN
- 给大家讲讲在哪些地方发外链最好
- 给java虚拟机增加一个属性,java -D
- 在 for 循环里写加号拼接字符串的那个同事,不见了~
- ansys linux安装包_ANSYS15.0 for Linux下载及安装教程 - 图文 -
- iOS12完美越狱来了!漫谈iOS12缓解机制
- 网页如何开启Gzip压缩
- DHCP原理及DHCP服务器的防攻击手段
- 计算机专业关于Java读书笔记_《Java8学习笔记》读书笔记(四)
- 编写一个方法,将一段文本中的各个单词的字母顺序翻转题
- must be unique: xxx.xxx.xxx:xxx:jar -> duplicate declaration of version 0.0.1 @ line 25, column 21
- Ubuntu下配置、训练YOLO的全过程——无人机检测小系统
- 网络故障诊断 - 使用TTL分析网络故障
- 引用图标库到自己页面
热门文章
- Android 12 预览版带给我们的1234
- abp mysql Failed executing DbCommand (0ms) [Parameters=[], CommandType=‘Text‘, CommandTimeout=‘30‘]
- 欧鹏浏览器html5用不了,HTML5新时代 欧朋浏览器H5体验版试用
- 用js判断是widows还是linux,JS 如何判断浏览器是安卓还是苹果
- 在微型计算机机箱的面板上,为了能装ATX主板,这款小机箱在设计上费尽心思
- 页面布局(2):腾讯首页
- win8 应用商店链接不上
- c#垂直投影法_第五套人民币10元和5元纸币采用了固定花卉水印和白水印,其中,白水印的特点是...
- Android四大组件之broadcast广播使用整理笔记
- 平板电脑 android 2,搭载Android2.2 万利达T2平板电脑评测