实现 iPhone 电子书的分页显示功能的代码
作 iPhone 电子书时,如果把大段文字放在 UITextView 或 UILabel里显示,是不能分页的,阅读时就像再看一大卷滚不到头的纸带,用户体验很差。下面这段代码可以实现 UILabel尺寸固定,根据文本内容和字体动态分页显示,电子书方面的应用应该非常有用。
// Implement viewDidLoad to do additional setup after loadingthe view, typically from a nib.
- (void)viewDidLoad {
[superviewDidLoad];
//
totalPages= 0;
currentPage= 0;
//
textLabel.numberOfLines= 0;
//
if(!text) {
//从文件里加载文本串
[selfloadString];
//计算文本串的大小尺寸
CGSizetotalTextSize = [text sizeWithFont:[UIFontsystemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width,CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
//如果一页就能显示完,直接显示所有文本串即可。
if(totalTextSize.height < textLabel.frame.size.height){
textLabel.text= text;
}
else{
//计算理想状态下的页面数量和每页所显示的字符数量,只是拿来作为参考值用而已!
NSUIntegertextLength = [text length];
referTotalPages=(int)totalTextSize.height/(int)textLabel.frame.size.height+1;
referCharatersPerPage= textLength/referTotalPages;
//申请最终保存页面NSRange信息的数组缓冲区
intmaxPages = referTotalPages;
rangeOfPages= (NSRange *)malloc(referTotalPages*sizeof(NSRange));
memset(rangeOfPages,0x0, referTotalPages*sizeof(NSRange));
//页面索引
intpage = 0;
for(NSUInteger location = 0; location < textLength; ){
//先计算临界点(尺寸刚刚超过UILabel尺寸时的文本串)
NSRangerange = NSMakeRange(location, referCharatersPerPage);
//reach end of text ?
NSString*pageText;
CGSizepageTextSize;
while(range.location + range.length < textLength) {
pageText= [text substringWithRange:range];
pageTextSize= [pageText sizeWithFont:[UIFontsystemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width,CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
if(pageTextSize.height > textLabel.frame.size.height){
break;
}
else{
range.length+= referCharatersPerPage;
}
}
if(range.location + range.length >= textLength){
range.length= textLength - range.location;
}
//然后一个个缩短字符串的长度,当缩短后的字符串尺寸小于textLabel的尺寸时即为满足
while(range.length > 0) {
pageText= [text substringWithRange:range];
pageTextSize= [pageText sizeWithFont:[UIFontsystemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width,CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
if(pageTextSize.height <= textLabel.frame.size.height){
range.length= [pageText length];
break;
}
else{
range.length-= 2;
}
}
//得到一个页面的显示范围
if(page >= maxPages) {
maxPages+= 10;
rangeOfPages= (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
}
rangeOfPages[page++]= range;
//更新游标
location+= range.length;
}
//获取最终页面数量
totalPages= page;
//更新UILabel内容
textLabel.text= [text substringWithRange:rangeOfPages[currentPage]];
}
}
//显示当前页面进度信息,格式为:"8/100"
pageInfoLabel.text= [NSString stringWithFormat:@"%d/%d", currentPage+1,totalPages];
}
////////////////////////////////////////////////////////////////////////////////////////
// 上一页
- (IBAction)actionPrevious:(id)sender {
if(currentPage > 0) {
currentPage--;
NSRangerange = rangeOfPages[currentPage];
NSString*pageText = [text substringWithRange:range];
textLabel.text= pageText;
//
pageInfoLabel.text= [NSString stringWithFormat:@"%d/%d", currentPage+1,totalPages];
}
}
////////////////////////////////////////////////////////////////////////////////////////
// 下一页
- (IBAction)actionNext:(id)sender {
if(currentPage < totalPages-1) {
currentPage++;
NSRangerange = rangeOfPages[currentPage];
NSString*pageText = [text substringWithRange:range];
textLabel.text= pageText;
//
pageInfoLabel.text= [NSString stringWithFormat:@"%d/%d", currentPage+1,totalPages];
}
}
实现 iPhone 电子书的分页显示功能的代码的更多相关文章
- iPhone OS 开发 - 了解并解决代码签名问题
译者:Jestery 发表时间:2010-04-24浏览量:21082评论数:0挑错数:0 了解并解决代码签名问题 (为保持跟开发环境以及APPLE开发者社区网站结构对应,一些名词未作翻译) 绝大多数 ...
- Mvc分页组件MvcSimplePager代码重构
1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...
- Mvc分页组件MvcSimplePager代码重构及使用
1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...
- 分页查询关键代码 多条件查询关键代码 删除选中商品关键代码 修改要先回显再修改 修改要先回显再修改 同一业务集中使用同一servlet的方法
分页查询关键代码: 通过servlet转发回来的各种信息进行分页的设计(转发回的信息有 分页查询的List集合 查询的页码 查询的条数 查询的数据库总条数 查询的总页码) 从开始时循环10次出现十个数 ...
- iPhone手机越狱-逆向砸壳-代码注入
iPhone手机越狱 逆向砸壳 代码注入 工具下载 操作越狱 安装待逆向应用(app) 使用OpenSSH连接手机 找到应用二进制文件地址 找到应用document沙盒地址 拷贝砸壳工具(dumpde ...
- django之分页,纯python代码
Django中分页 py文件代码 """ 自定义分页组件 可以返回分页的数据和分页的HTML代码 """ from django.http ...
- 静态页分页功能js代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 转:PHP分页技术的代码和示例
本文来自:10 Helpful PHP Pagination Scripts For Web Developers 分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在 ...
- php分页实例附代码
一个典型的PHP分页实例代码分享,学习php的朋友肯定用得到,主要是了解思路: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
随机推荐
- 转: HTTP Live Streaming直播(iOS直播)技术分析与实现
http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HTTP Live Streaming直播(iOS直播)技术分析与实现 ...
- iOS开发中经常使用的Xcode插件
1.全能搜索家CodePilot 2.0 你要找的是文件?是目录?是代码?Never Mind,CMD+SHIFT+X调出CodePilot,输入不论什么你想到搜的东西吧! 想搜appFinishLa ...
- Java Volatile keyword
Volatile修饰的成员变量在每次被线程訪问时,都强迫从主内存中重读该成员变量的值.并且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在不论什么时刻,两个不同的线程总是看到某个成员变量的 ...
- 倍福TwinCAT(贝福Beckhoff)应用教程12.1 TwinCAT控制松下伺服 连接和试运行
首先是用松下伺服自带的软件可以测试运行(驱动器,电机都连接好,然后用USB线连接到松下伺服驱动器的X1口),打开调试软件会自动提示连接到伺服 一般需要对驱动器清除绝对值编码器数据(驱动器可能报错4 ...
- [iOS]在NavigationController中的ScrollView中的子视图都会下移64个像素
情况是这种: 我有一个UINavigationController,设置为self.window的root视图, 然后有一个UIVIewController是UINavigtionController ...
- ColorSchemer Studio 2 破解
软件介绍: ColorSchemer Studio 2 is a professional color matching application for anyone from hobbyists t ...
- Js中数组的追加
Concat arrayObject.concat(arrayX,arrayX,......,arrayX) 常用于 加载更多 ,数组的追加.
- React Native :加载新闻列表
代码地址如下:http://www.demodashi.com/demo/13212.html 标签与内容页联动 上一节(React Native : 自定义视图)做到了点击标签自动移动,还差跟下面的 ...
- 神奇的CAReplicatorLayer
代码地址如下:http://www.demodashi.com/demo/11702.html 文档描述: The CAReplicatorLayer class creates a specifie ...
- asp.net core mvc视频A:笔记5-1.路由规则
方法一:通过MapRoute方法,配置文件位置 小例子:如果所有路径都要在admin下,可以这样写 方法二:通过路由属性 相对路由 现在需要加/admin/home/index才能正常访问原来的默认页 ...