epub ios
2019-03-04 11:25:00 weixin_34194087 阅读数 4

因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;
其中对解压缩和数据加载方面进行了改造优化,使其更加的完美;

 

其大概原理是首先将 epub 文件解压后得到其资源文件包,其中会包含相应的文件夹,通过 OEBPS 文件夹中的资源文件提取所需的数据并进行拼装后渲染;
其中包含了文件的解压缩和通过 touchXML 对 xml 数据的解析和写入;
对 xml 解析获取到节点内容并保存,遍历数据数组找到其中所需的节点,将其遍历节点得到所需属性的 name 和 value 作为字典对象填充至模型.

/**
 解析 OPF 文件,从 ncx 读取书籍目录
 @param opfRelativePath 文件相对路径
 @param bookInfoModel 数据填充模型
 @return 结果集
 */
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}

具体内容还是直接通过 Demo 中的 code 表述更加直观,Demo 中也包含了一些注释看着相对较为轻松;

 

效果样式图

     

    

 

关于 SDK 集成

1)首先,引入'SSZipArchive',通过该解压进行对 EPub 文件的解压,获取其文件资源;
2)其次,引入'MWPhotoBrowser'库,此处需要注意因'MWPhotoBrowser'库已经将'SDWebImage'和'MBProgressHUD'两个库包含其中.若项目中已经引入上面两个库可以直接通过'MWPhotoBrowser'来代替,避免导致文件冲突的异常;
3)最后,引入'DTCoreText',将 html 字符串转化为富文本使用的工具,保证原生实现的同时起到灵活修改样式的功能,且在性能方面相比 WebView 加载方式更具优势.

platform :ios, '8.0'
target "TestEpub" do
 
pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'
end

 

关于项目集成后配置

1)将头文件引入至 pch 文件中

#import "XDSReaderHeader.h"

pch 文件创建请见此篇文章

2)编译会抛出 arc 的文件异常,勿慌,此异常由于类文件包中的文件所引起

 

按照下图所示步骤,在所对应的类中添加"-fno-objc-arc"即可搞定

3)arc 异常处理完毕后再次编译程序会再次提示文件缺失的异常信息

工程文件层级目录中对文件进行检索"mdjyml"后将其文件删除,再次编译工程即可搞定

 

 

 

 

关于方法调用

配置好文件路径后调用如下方法即可

    // 张学良传     TestEpub
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"张学良传"withExtension:@"epub"];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];//文件位置
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [self presentViewController:pageView animated:YES completion:nil];
        });
    });

文件夹方式读取加载方式

    /** 配置文件路径*/
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", @"xx文件名称xx"]];
 
    // 文件检索
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:filePath]) {
        [MBProgressHUD showError:@"暂无此书" toView:controller.view];
        return;
    }
 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    // Reading book
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [controller presentViewController:pageView animated:YES completion:nil];
        });
    });

 

Demo 已上传至 GitHub,直接引入所需的 epub 文件(Demo 中含示例文件)后编译即可查阅效果;

https://github.com/survivorsfyh/YHEpubDemo

 

_______

以上便是此次 Epub 阅读器的小结,首次搞还望多多指教.

 

转载于:https://www.cnblogs.com/survivorsfyh/p/10469656.html

2019-03-04 03:18:24 weixin_34112900 阅读数 5
因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;
其中对解压缩和数据加载方面进行了改造优化,使其更加的完美;




其大概原理是首先将 epub 文件解压后得到其资源文件包,其中会包含相应的文件夹,通过 OEBPS 文件夹中的资源文件提取所需的数据并进行拼装后渲染; 其中包含了文件的解压缩和通过 touchXML 对 xml 数据的解析和写入; 对 xml 解析获取到节点内容并保存,遍历数据数组找到其中所需的节点,将其遍历节点得到所需属性的 name 和 value 作为字典对象填充至模型.

/**
 解析 OPF 文件,从 ncx 读取书籍目录
 @param opfRelativePath 文件相对路径
 @param bookInfoModel 数据填充模型
 @return 结果集
 */
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}复制代码

具体内容还是直接通过 Demo 中的 code 表述更加直观,Demo 中也包含了一些注释看着相对较为轻松;


关于 SDK 集成 

1)首先,引入'SSZipArchive',通过该解压进行对 EPub 文件的解压,获取其文件资源; 

2)其次,引入'MWPhotoBrowser'库,此处需要注意因'MWPhotoBrowser'库已经将'SDWebImage'和'MBProgressHUD'两个库包含其中.若项目中已经引入上面两个库可以直接通过'MWPhotoBrowser'来代替,避免导致文件冲突的异常; 

3)最后,引入'DTCoreText',将 html 字符串转化为富文本使用的工具,保证原生实现的同时起到灵活修改样式的功能,且在性能方面相比 WebView 加载方式更具优势.

platform :ios, '8.0'
target "TestEpub" do
 
pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'
end复制代码


关于项目集成后配置

1)将头文件引入至 pch 文件中

pch 文件创建请见此篇文章

2)编译会抛出 arc 的文件异常,勿慌,此异常由于类文件包中的文件所引起


按照下图所示步骤,在所对应的类中添加"-fno-objc-arc"即可搞定


3)arc 异常处理完毕后再次编译程序会再次提示文件缺失的异常信息


工程文件层级目录中对文件进行检索"mdjyml"后将其文件删除,再次编译工程即可搞定




关于方法调用

配置好文件路径后调用如下方法即可

    // 张学良传     TestEpub
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"张学良传"withExtension:@"epub"];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];//文件位置
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [self presentViewController:pageView animated:YES completion:nil];
        });
    });复制代码

文件夹方式读取加载方式

    /** 配置文件路径*/
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", @"xx文件名称xx"]];
 
    // 文件检索
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:filePath]) {
        [MBProgressHUD showError:@"暂无此书" toView:controller.view];
        return;
    }
 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    // Reading book
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [controller presentViewController:pageView animated:YES completion:nil];
        });
    });复制代码


Demo 已上传至 GitHub,直接引入所需的 epub 文件(Demo 中含示例文件)后编译即可查阅效果;

[GitHub Demo](github.com/survivorsfy…)


_______

以上便是此次 Epub 阅读器的小结,首次搞还望多多指教.



2019-03-01 23:22:04 survivorsfyh 阅读数 662

因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;
其中对解压缩和数据加载方面进行了改造优化,使其更加的完美;

其大概原理是首先将 epub 文件解压后得到其资源文件包,其中会包含相应的文件夹,通过 OEBPS 文件夹中的资源文件提取所需的数据并进行拼装后渲染;
其中包含了文件的解压缩和通过 touchXML 对 xml 数据的解析和写入;
对 xml 解析获取到节点内容并保存,遍历数据数组找到其中所需的节点,将其遍历节点得到所需属性的 name 和 value 作为字典对象填充至模型.

/**
 解析 OPF 文件,从 ncx 读取书籍目录

 @param opfRelativePath 文件相对路径
 @param bookInfoModel 数据填充模型
 @return 结果集
 */
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}

具体内容还是直接通过 Demo 中的 code 表述更加直观,Demo 中也包含了一些注释看着相对较为轻松;

 

效果样式图

                                          

                                                                   

 

关于 SDK 集成


1)首先,引入'SSZipArchive',通过该解压进行对 EPub 文件的解压,获取其文件资源;
2)其次,引入'MWPhotoBrowser'库,此处需要注意因'MWPhotoBrowser'库已经将'SDWebImage'和'MBProgressHUD'两个库包含其中.若项目中已经引入上面两个库可以直接通过'MWPhotoBrowser'来代替,避免导致文件冲突的异常;
3)最后,引入'DTCoreText',将 html 字符串转化为富文本使用的工具,保证原生实现的同时起到灵活修改样式的功能,且在性能方面相比 WebView 加载方式更具优势.

platform :ios, '8.0'
target "TestEpub" do

pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'

end

 

关于项目集成后配置


1)将头文件引入至 pch 文件中

#import "XDSReaderHeader.h"

pch 文件创建请见此篇文章

2)编译会抛出 arc 的文件异常,勿慌,此异常由于类文件包中的文件所引起

按照下图所示步骤,在所对应的类中添加"-fno-objc-arc"即可搞定

3)arc 异常处理完毕后再次编译程序会再次提示文件缺失的异常信息

 

工程文件层级目录中对文件进行检索"mdjyml"后将其文件删除,再次编译工程即可搞定

 

关于方法调用


配置好文件路径后调用如下方法即可

    // 张学良传     TestEpub
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"张学良传"withExtension:@"epub"];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];//文件位置
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [self presentViewController:pageView animated:YES completion:nil];
        });
    });

文件夹方式读取加载方式

    /** 配置文件路径*/
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", @"xx文件名称xx"]];

    // 文件检索
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:filePath]) {
        [MBProgressHUD showError:@"暂无此书" toView:controller.view];
        return;
    }

    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    // Reading book
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [controller presentViewController:pageView animated:YES completion:nil];
        });
    });

 

Demo 已上传至 GitHub,直接引入所需的 epub 文件(Demo 中含示例文件)后编译即可查阅效果;

https://github.com/survivorsfyh/YHEpubDemo

 

_______

以上便是此次 Epub 阅读器的小结,首次搞还望多多指教.

2015-06-11 16:49:13 xxs0827 阅读数 887
  • 1.在http://www.apple.com/cn/itunes/download/下载安装itunes.如果您已经安装过,请忽略。
  • 2.数据线连接您的ios设备和电脑,在手机的弹出提示框选择信任,如下图所示
  • 设备弹出信任框
  • 3.连接成功后,进入itunes的手机详情页,如下图所示
  • 进入itunes的手机详情页
  • 4.选择图书标签,如下图所示
  • 选择图书标签
  • 5.选择将文件添加到资料库,如下图所示
  • 文件添加到资料库
  • 6.选择您下载好的epub文件,如下图所示
  • 选择epub文件
  • 7.同步文件到您的ios设备,如下图所示
  • 选择epub文件
  • 8.同步完成后,在您的设备上找到ibooks这个软件(如果您的ios版本过久,可以进入appstore下载ibooks),如下图所示
  • 找到ibooks
  • 9.最后开始畅快的阅读epub文件,如下图所示
  • 阅读epub文件
  • 这里有:epub电子书下载
2016-05-26 15:43:00 m372897500 阅读数 4984

demo功能:读取epub电子书的阅读器demo,可以更改字体大小,查询,按电子书章节索引。

demo说明:按照epub结构读取内容并显示。主要使用webview显示内容,章节内用js制作的翻页效果(效果不是很好,有点闪烁)。主要代码在:EPubViewController.m中。

demo截屏:



demo的主要代码:翻页控制部分

  1. - (void) chapterDidFinishLoad:(Chapter *)chapter{  
  2.     totalPagesCount+=chapter.pageCount;  
  3.   
  4.     if(chapter.chapterIndex + 1 < [loadedEpub.spineArray count]){  
  5.         [[loadedEpub.spineArray objectAtIndex:chapter.chapterIndex+1] setDelegate:self];  
  6.         [[loadedEpub.spineArray objectAtIndex:chapter.chapterIndex+1] loadChapterWithWindowSize:webView.bounds fontPercentSize:currentTextSize];  
  7.         [currentPageLabel setText:[NSString stringWithFormat:@"?/%d", totalPagesCount]];  
  8.     } else {  
  9.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  10.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];  
  11.         paginating = NO;  
  12.         NSLog(@"Pagination Ended!");  
  13.     }  
  14. }  
  15.   
  16. - (int) getGlobalPageCount{  
  17.     int pageCount = 0;  
  18.     for(int i=0; i<currentSpineIndex; i++){  
  19.         pageCount+= [[loadedEpub.spineArray objectAtIndex:i] pageCount];   
  20.     }  
  21.     pageCount+=currentPageInSpineIndex+1;  
  22.     return pageCount;  
  23. }  
  24.   
  25. - (void) loadSpine:(int)spineIndex atPageIndex:(int)pageIndex {  
  26.     [self loadSpine:spineIndex atPageIndex:pageIndex highlightSearchResult:nil];  
  27. }  
  28.   
  29. - (void) loadSpine:(int)spineIndex atPageIndex:(int)pageIndex highlightSearchResult:(SearchResult*)theResult{  
  30.       
  31.     webView.hidden = YES;  
  32.       
  33.     self.currentSearchResult = theResult;  
  34.   
  35.     [chaptersPopover dismissPopoverAnimated:YES];  
  36.     [searchResultsPopover dismissPopoverAnimated:YES];  
  37.       
  38.     NSURL* url = [NSURL fileURLWithPath:[[loadedEpub.spineArray objectAtIndex:spineIndex] spinePath]];  
  39.     [webView loadRequest:[NSURLRequest requestWithURL:url]];  
  40.     currentPageInSpineIndex = pageIndex;  
  41.     currentSpineIndex = spineIndex;  
  42.     if(!paginating){  
  43.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  44.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];    
  45.     }  
  46. }  
  47.   
  48. - (void) gotoPageInCurrentSpine:(int)pageIndex{  
  49.     if(pageIndex>=pagesInCurrentSpineCount){  
  50.         pageIndex = pagesInCurrentSpineCount - 1;  
  51.         currentPageInSpineIndex = pagesInCurrentSpineCount - 1;   
  52.     }  
  53.       
  54.     float pageOffset = pageIndex*webView.bounds.size.width;  
  55.   
  56. //注入js 滚动到指定的坐标--js翻页效果  
  57.     NSString* goToOffsetFunc = [NSString stringWithFormat:@" function pageScroll(xOffset){ window.scroll(xOffset,0); } "];  
  58.     NSString* goTo =[NSString stringWithFormat:@"pageScroll(%f)", pageOffset];  
  59.       
  60.     [webView stringByEvaluatingJavaScriptFromString:goToOffsetFunc];  
  61.     [webView stringByEvaluatingJavaScriptFromString:goTo];  
  62.       
  63.     if(!paginating){  
  64.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  65.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];    
  66.     }  
  67.       
  68.     webView.hidden = NO;  
  69.       
  70. }  
  71.   
  72. - (void) gotoNextSpine {  
  73.     if(!paginating){  
  74.         if(currentSpineIndex+1<[loadedEpub.spineArray count]){  
  75.             [self loadSpine:++currentSpineIndex atPageIndex:0];  
  76.         }     
  77.     }  
  78. }  
  79.   
  80. - (void) gotoPrevSpine {  
  81.     if(!paginating){  
  82.         if(currentSpineIndex-1>=0){  
  83.             [self loadSpine:--currentSpineIndex atPageIndex:0];  
  84.         }     
  85.     }  
  86. }  
  87.   
  88. - (void) gotoNextPage {  
  89.     if(!paginating){  
  90.         if(currentPageInSpineIndex+1<pagesInCurrentSpineCount){  
  91.             [self gotoPageInCurrentSpine:++currentPageInSpineIndex];  
  92.         } else {  
  93.             [self gotoNextSpine];  
  94.         }         
  95.     }  
  96. }  
  97.   
  98. - (void) gotoPrevPage {  
  99.     if (!paginating) {  
  100.         if(currentPageInSpineIndex-1>=0){  
  101.             [self gotoPageInCurrentSpine:--currentPageInSpineIndex];  
  102.         } else {  
  103.             if(currentSpineIndex!=0){  
  104.                 int targetPage = [[loadedEpub.spineArray objectAtIndex:(currentSpineIndex-1)] pageCount];  
  105.                 [self loadSpine:--currentSpineIndex atPageIndex:targetPage-1];  
  106.             }  
  107.         }  
  108.     }  
  109. }  
  110.   
  111.   
  112. - (IBAction) increaseTextSizeClicked:(id)sender{  
  113.     if(!paginating){  
  114.         if(currentTextSize+25<=200){  
  115.             currentTextSize+=25;  
  116.             [self updatePagination];  
  117.             if(currentTextSize == 200){  
  118.                 [incTextSizeButton setEnabled:NO];  
  119.             }  
  120.             [decTextSizeButton setEnabled:YES];  
  121.         }  
  122.     }  
  123. }  
  124. - (IBAction) decreaseTextSizeClicked:(id)sender{  
  125.     if(!paginating){  
  126.         if(currentTextSize-25>=50){  
  127.             currentTextSize-=25;  
  128.             [self updatePagination];  
  129.             if(currentTextSize==50){  
  130.                 [decTextSizeButton setEnabled:NO];  
  131.             }  
  132.             [incTextSizeButton setEnabled:YES];  
  133.         }  
  134.     }  
  135. }  
  136.   
  137. - (IBAction) doneClicked:(id)sender{  
  138.     [self dismissModalViewControllerAnimated:YES];  
  139. }  
  140.   
  141.   
  142. - (IBAction) slidingStarted:(id)sender{  
  143.     int targetPage = ((pageSlider.value/(float)100)*(float)totalPagesCount);  
  144.     if (targetPage==0) {  
  145.         targetPage++;  
  146.     }  
  147.     [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d", targetPage, totalPagesCount]];  
  148. }  
  149.   
  150. - (IBAction) slidingEnded:(id)sender{  
  151.     int targetPage = (int)((pageSlider.value/(float)100)*(float)totalPagesCount);  
  152.     if (targetPage==0) {  
  153.         targetPage++;  
  154.     }  
  155.     int pageSum = 0;  
  156.     int chapterIndex = 0;  
  157.     int pageIndex = 0;  
  158.     for(chapterIndex=0; chapterIndex<[loadedEpub.spineArray count]; chapterIndex++){  
  159.         pageSum+=[[loadedEpub.spineArray objectAtIndex:chapterIndex] pageCount];  
  160. //      NSLog(@"Chapter %d, targetPage: %d, pageSum: %d, pageIndex: %d", chapterIndex, targetPage, pageSum, (pageSum-targetPage));  
  161.         if(pageSum>=targetPage){  
  162.             pageIndex = [[loadedEpub.spineArray objectAtIndex:chapterIndex] pageCount] - 1 - pageSum + targetPage;  
  163.             break;  
  164.         }  
  165.     }  
  166.     [self loadSpine:chapterIndex atPageIndex:pageIndex];  
  167. }  
  168.   
  169. - (IBAction) showChapterIndex:(id)sender{  
  170.     if(chaptersPopover==nil){  
  171.         ChapterListViewController* chapterListView = [[ChapterListViewController alloc] initWithNibName:@"ChapterListViewController" bundle:[NSBundle mainBundle]];  
  172.         [chapterListView setEpubViewController:self];  
  173.         chaptersPopover = [[UIPopoverController alloc] initWithContentViewController:chapterListView];  
  174.         [chaptersPopover setPopoverContentSize:CGSizeMake(400, 600)];  
  175.         [chapterListView release];  
  176.     }  
  177.     if ([chaptersPopover isPopoverVisible]) {  
  178.         [chaptersPopover dismissPopoverAnimated:YES];  
  179.     }else{  
  180.         [chaptersPopover presentPopoverFromBarButtonItem:chapterListButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];         
  181.     }  
  182. }  
  183.   
  184.   
  185. //webview 完成加载,将css注入。webview加载一次是一个epub里的xhtml内容,可能是一页,也可能是多页。  
  186. //可以看看demo中的.epub文件。将.epub改成zip 解压就可以看到epub的内容  
  187. - (void)webViewDidFinishLoad:(UIWebView *)theWebView{  
  188.       
  189.     NSString *varMySheet = @"var mySheet = document.styleSheets[0];";  
  190.       
  191.     NSString *addCSSRule =  @"function addCSSRule(selector, newRule) {"  
  192.     "if (mySheet.addRule) {"  
  193.     "mySheet.addRule(selector, newRule);"                               // For Internet Explorer  
  194.     "} else {"  
  195.     "ruleIndex = mySheet.cssRules.length;"  
  196.     "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"   // For Firefox, Chrome, etc.  
  197.     "}"  
  198.     "}";  
  199.       
  200.     NSString *insertRule1 = [NSString stringWithFormat:@"addCSSRule('html', 'padding: 0px; height: %fpx; -webkit-column-gap: 0px; -webkit-column-width: %fpx;')", webView.frame.size.height, webView.frame.size.width];  
  201.     NSString *insertRule2 = [NSString stringWithFormat:@"addCSSRule('p', 'text-align: justify;')"];  
  202.     NSString *setTextSizeRule = [NSString stringWithFormat:@"addCSSRule('body', '-webkit-text-size-adjust: %d%%;')", currentTextSize];  
  203.     NSString *setHighlightColorRule = [NSString stringWithFormat:@"addCSSRule('highlight', 'background-color: yellow;')"];  
  204.   
  205.       
  206.     [webView stringByEvaluatingJavaScriptFromString:varMySheet];  
  207.       
  208.     [webView stringByEvaluatingJavaScriptFromString:addCSSRule];  
  209.           
  210.     [webView stringByEvaluatingJavaScriptFromString:insertRule1];  
  211.       
  212.     [webView stringByEvaluatingJavaScriptFromString:insertRule2];  
  213.       
  214.     [webView stringByEvaluatingJavaScriptFromString:setTextSizeRule];  
  215.       
  216.     [webView stringByEvaluatingJavaScriptFromString:setHighlightColorRule];  
  217.       
  218.     if(currentSearchResult!=nil){  
  219.     //  NSLog(@"Highlighting %@", currentSearchResult.originatingQuery);  
  220.         [webView highlightAllOccurencesOfString:currentSearchResult.originatingQuery];  
  221.     }  
  222.       
  223.       
  224.     int totalWidth = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollWidth"] intValue];  
  225.     pagesInCurrentSpineCount = (int)((float)totalWidth/webView.bounds.size.width);  
  226.       
  227.     [self gotoPageInCurrentSpine:currentPageInSpineIndex];  
  228. }  
  229.   
  230. - (void) updatePagination{  
  231.     if(epubLoaded){  
  232.         if(!paginating){  
  233.             NSLog(@"Pagination Started!");  
  234.             paginating = YES;  
  235.             totalPagesCount=0;  
  236.             [self loadSpine:currentSpineIndex atPageIndex:currentPageInSpineIndex];  
  237.             [[loadedEpub.spineArray objectAtIndex:0] setDelegate:self];  
  238.             [[loadedEpub.spineArray objectAtIndex:0] loadChapterWithWindowSize:webView.bounds fontPercentSize:currentTextSize];  
  239.             [currentPageLabel setText:@"?/?"];  
  240.         }  
  241.     }  
  242. }  

demo下载地址:http://download.csdn.net/download/donny_zhang/5647857


没有更多推荐了,返回首页