實(shí)現(xiàn)iPhone電子書(shū)的分頁(yè)顯示功能(附代碼)
最近我們介紹了幾個(gè)iPhone開(kāi)發(fā)的代碼測(cè)試案例,今天我們將介紹iPhone電子書(shū)的分頁(yè)功能的代碼。制作iPhone電子書(shū)時(shí),如果把大段文字放在 UITextView 或 UILabel 里顯示,是不能分頁(yè)的,閱讀時(shí)就像再看一大卷滾不到頭的紙帶,用戶體驗(yàn)很差。下面這段代碼可以實(shí)現(xiàn) UILabel 尺寸固定,根據(jù)文本內(nèi)容和字體動(dòng)態(tài)分頁(yè)顯示,電子書(shū)方面的應(yīng)用應(yīng)該非常有用。
- // 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];
 - // 計(jì)算文本串的大小尺寸
 - CGSize totalTextSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
 - constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
 - lineBreakMode:UILineBreakModeWordWrap];
 - // 如果一頁(yè)就能顯示完,直接顯示所有文本串即可。
 - if (totalTextSize.height < textLabel.frame.size.height) {
 - texttextLabel.text = text;
 - }
 - else {
 - // 計(jì)算理想狀態(tài)下的頁(yè)面數(shù)量和每頁(yè)所顯示的字符數(shù)量,只是拿來(lái)作為參考值用而已!
 - NSUInteger textLength = [text length];
 - referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1;
 - referCharatersPerPage = textLength/referTotalPages;
 - // 申請(qǐng)最終保存頁(yè)面NSRange信息的數(shù)組緩沖區(qū)
 - int maxPages = referTotalPages;
 - rangeOfPages = (NSRange *)malloc(referTotalPages*sizeof(NSRange));
 - memset(rangeOfPages, 0x0, referTotalPages*sizeof(NSRange));
 - // 頁(yè)面索引
 - int page = 0;
 - for (NSUInteger location = 0; location < textLength; ) {
 - // 先計(jì)算臨界點(diǎn)(尺寸剛剛超過(guò)UILabel尺寸時(shí)的文本串)
 - 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;
 - }
 - // 然后一個(gè)個(gè)縮短字符串的長(zhǎng)度,當(dāng)縮短后的字符串尺寸小于textLabel的尺寸時(shí)即為滿足
 - 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;
 - }
 - }
 - // 得到一個(gè)頁(yè)面的顯示范圍
 - if (page >= maxPages) {
 - maxPages += 10;
 - rangeOfPages = (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
 - }
 - rangeOfPages[page++] = range;
 - // 更新游標(biāo)
 - location += range.length;
 - }
 - // 獲取最終頁(yè)面數(shù)量
 - totalPages = page;
 - // 更新UILabel內(nèi)容
 - textLabel.text = [text substringWithRange:rangeOfPages[currentPage]];
 - }
 - }
 - // 顯示當(dāng)前頁(yè)面進(jìn)度信息,格式為:"8/100"
 - pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
 - }
 - ////////////////////////////////////////////////////////////////////////////////////////
 - // 上一頁(yè)
 - - (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];
 - }
 - }
 - ////////////////////////////////////////////////////////////////////////////////////////
 - // 下一頁(yè)
 - - (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];
 - }
 - }
 
在設(shè)計(jì)iPhone電子書(shū)時(shí),一定要注意UILabel 尺寸固定,否則是無(wú)法實(shí)現(xiàn)iPhone電子書(shū)的分頁(yè)。
【編輯推薦】















 
 
 


 
 
 
 