热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实现iPhone电子书的分页显示功能

制作iPhone电子书时,如果把大段文字放在UITextView或UILabel里显示,是不能分页的,阅读时就像再看一大卷滚不到头的纸带&

制作 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 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 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 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 <&#61; textLabel.frame.size.height) {
76 range.length &#61; [pageText length];
77 break;
78 }
79 else {
80 range.length -&#61; 2;
81 }
82 }
83
84 // 得到一个页面的显示范围
85 if (page >&#61; maxPages) {
86 maxPages &#43;&#61; 10;
87 rangeOfPages &#61; (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
88 }
89 rangeOfPages[page&#43;&#43;] &#61; range;
90
91 // 更新游标
92 location &#43;&#61; range.length;
93 }
94
95 // 获取最终页面数量
96 totalPages &#61; page;
97
98 // 更新UILabel内容
99 textLabel.text &#61; [text substringWithRange:rangeOfPages[currentPage]];
100 }
101 }
102
103 // 显示当前页面进度信息&#xff0c;格式为&#xff1a;"8/100"
104 pageInfoLabel.text &#61; [NSString stringWithFormat:&#64;"%d/%d", currentPage&#43;1, totalPages];
105 }

 

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



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





推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
听天由命____497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有