当前位置: 首页 > 科技观察

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

时间:2023-03-14 20:00:42 科技观察

最近介绍了几个iPhone开发的代码测试用例,今天介绍一下iPhone电子书分页功能的代码。制作iPhone电子书时,如果在UITextView或UILabel中显示一大段文字,无法分页。阅读时就像阅读一大卷纸带,最后卷不完,用户体验很差。下面这段代码可以实现UILabel的固定大小,根据文字内容和字体动态显示页面,对于电子书应用应该很有用。//实现viewDidLoadtodo加载视图后的额外设置,通常来自manib。-(void)viewDidLoad{[superviewDidLoad];//总页数=0;当前页=0;//textLabel.numberOfLines=0;//if(!text){//从文件中加载文本字符串[selfloadString];//计算文本字符串的大小//如果能显示一页,直接显示所有字符串即可。if(totalTextSize.height}else{//计算理想情况下的页数和每页显示的字符数,仅作为参考值!NSUIntegertextLength=[textlength];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(NSUIntegerlocation=0;location//先计算临界点(大小刚好超过UILabel时的文本字符串大小)NSRangerange=NSMakeRange(location,referCharatersPerPage);//reachendoftext?NSString*pageText;CGSizepageTextSize;while(range.location+range.lengthpageText=[textsubstringWithRange:range];pageTextSize=[pageTextsizeWithFont:[UIFontsystemFontOfSize:FONT_SIZE_MAX]constrainedToSize:CGSelizeMakeratextsize.width,CGFLOAT_MAX)lineBreakMode:UILineBreakModeWordWrap];if(pageTextSize.height>textLabel.frame.size.height){中断;}else{range.length+=refer每页字符;}}if(range.location+range.length>=textLength){range.length=textLength-range.location;}//然后一个一个的缩短字符串的长度,当缩短后的字符串的大小小于textLabel的大小时满足while(range.length>0){pageText=[textsubstringWithRange:range];pageTextSize=[pageTextsizeWithFont:[UIFontsystemFontOfSize:FONT_SIZE_MAX]constrainedToSize:CGSizeMake(textLabel.frame.size.width,CGFLOAT_MAX)lineBreakMode:UILineWordp];if(pageTextSize.heightbreak;}else{range.length-=2;}}//获取一个页面的显示范围if(page>=maxPages){maxPages+=10;rangeOfPages=(NSRange*)realloc(rangeOfPages,maxPages*sizeof(NSRange));}rangeOfPages[page++]=range;//更新光标位置+=range.length;}//获取最终页数totalPages=page;//更新UILabel内容textLabel.text=[textsubstringWithRange:rangeOfPages[currentPage]];}}//显示当前页面进度信息,格式为:"8/100"pageInfoLabel.text=[NSStringstringWithFormat:@"%d/%d",currentPage+1,totalPages];}/////////////////////////////////////////////////////////////////////////////////////////上一页-(IBAction)actionPrevious:(id)sender{if(currentPage>0){currentPage--;NSRangerange=rangeOfPages[当前页];NSString*pageText=[textsubstringWithRange:range];textLabel.text=pageText;//pageInfoLabel.text=[NSStringstringWithFormat:@"%d/%d",currentPage+1,totalPages];}}///////////////////////////////////////////////////////////////////////////////////////////下一页-(IBAction)actionNext:(id)sender{if(currentPageNSRangerange=rangeOfPages[currentPage];NSString*pageText=[textsubstringWithRange:range];textLabel.text=pageText;//pageInfoLabel.text=[NSStringstringWithFormat:@"%d/%d",currentPage+1,totalPages];}}在设计iPhone电子书的时候一定要注意UILabel的固定大小,否则将无法实现iPhone电子书的分页【编者推荐】iPhone内存管理自动释放和便捷方法iPhone内存管理方面对象所有权和引用计数iPhone开发入门代码:Objective-C编码规范iPhone开发入门“HelloWorld”分析代码