实现iPhone电子书的分页显示功能(附代码)
2017-03-20 11:52
645 查看
实现iPhone电子书的分页显示功能(附代码)
2016-01-10 21:45 294人阅读 评论(0) 收藏 编辑 删除最近我们介绍了几个iPhone开发的代码测试案例,今天我们将介绍iPhone电子书的分页功能的代码。制作iPhone电子书时,如果把大段文字放在 UITextView 或 UILabel 里显示,是不能分页的,阅读时就像再看一大卷滚不到头的纸带,用户体验很差。下面这段代码可以实现
UILabel 尺寸固定,根据文本内容和字体动态分页显示,电子书方面的应用应该非常有用。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
//
totalPages = 0;
currentPage = 0;
//
textLabel.numberOfLines = 0;
//
if (!text) {
// 从文件里加载文本串
[self loadString];
// 计算文本串的大小尺寸
CGSize totalTextSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
// 如果一页就能显示完,直接显示所有文本串即可。
if (totalTextSize.height < textLabel.frame.size.height) {
texttextLabel.text = text;
}
else {
// 计算理想状态下的页面数量和每页所显示的字符数量,只是拿来作为参考值用而已!
NSUInteger textLength = [text length];
referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1;
referCharatersPerPage = textLength/referTotalPages;
// 申请最终保存页面NSRange信息的数组缓冲区
int maxPages = referTotalPages;
rangeOfPages = (NSRange *)malloc(referTotalPages*sizeof(NSRange));
memset(rangeOfPages, 0x0, referTotalPages*sizeof(NSRange));
// 页面索引
int page = 0;
for (NSUInteger location = 0; location < textLength; ) {
// 先计算临界点(尺寸刚刚超过UILabel尺寸时的文本串)
NSRange range = NSMakeRange(location, referCharatersPerPage);
// reach end of text ?
NSString *pageText;
CGSize pageTextSize;
while (range.location + range.length < textLength) {
pageText = [text substringWithRange:range];
pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize: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:[UIFont systemFontOfSize: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--;
NSRange range = 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++;
NSRange range = rangeOfPages[currentPage];
NSString *pageText = [text substringWithRange:range];
textLabel.text = pageText;
//
pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
}
}
在设计iPhone电子书时,一定要注意UILabel 尺寸固定,否则是无法实现iPhone电子书的分页。
相关文章推荐
- 实现 iPhone 电子书的分页显示功能的代码
- 实现 iPhone 电子书的分页显示功能的代码
- 实现 iPhone 电子书的分页显示功能的代码 转载
- 实现iPhone电子书的分页显示功能(附代码)
- iphone开发 UITableview实现分页显示方法(代码)
- 【用于ios6】【ios7以后用新的方法】实现电子书的分页显示功能
- 利用颠倒TOP分页算法实现分页功能的思考(java 代码实现)
- [学习笔记]小型论坛功能——实现按照指定每页的行数来分页显示记录[3]
- 对《自定义GridView分页模板中页码Button的实现》中程序的改进,追加显示空行功能
- jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 自动提示功能+分页显示+grails实现
- 存储过程分页实现代码,2005 T-SQL新增功能
- 实现PDF显示与缩放功能的代码
- 在MYSQL中实现分页显示的代码--SHOPPING
- PHP学习笔记 2009-8-25 实现分页显示功能
- 代码实现DataList控件的分页显示
- 使用MPLex实现语法高亮显示的功能代码解释
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能