关于UIWebView 加载网络PDF 实现翻页效果的那些事

首先呢  这里说的是加载网络的pdf  可不是本地的哦

新建一个view  主要是用于循环渲染绘制pdf单页面内容

.h重写init方法 用于自定义 接收docRef文件和传入的page页面

- (instancetype)initWithFrame:(CGRect)frame documentRef:(CGPDFDocumentRef)docRef andPageNum:(int)page;

.m页面呢 实现方法  并且需要属性方法

CGPDFDocumentRef  documentRef;  这个是pdf接收的doc文件类型

NSInteger pageNum;    接收当前的page

- (instancetype)initWithFrame:(CGRect)frame documentRef:(CGPDFDocumentRef)docRef andPageNum:(int)page{

self = [super initWithFrame:frame];

if(self){

documentRef= docRef;

_pageNum= page;

self.backgroundColor= [UIColor whiteColor];

}

return self;

}

然后呢 因为是循环渲染绘制  需要重写 drawRect  重写此方法,执行重绘任务

drawRect调用是在Controller->loadView,,Controller->viewDidLoad 两方法之后调用的

- (void)drawRect:(CGRect)rect {

[self drawPDFIncontext:UIGraphicsGetCurrentContext()];//将当前的上下文环境传递  新建方法

}

好了  最重要的一部分要来了

- (void)drawPDFIncontext:(CGContextRef)context {

//调整图形的位置

//Quartz坐标系和UIView坐标系不一样所致,调整坐标系,使pdf正立

CGContextTranslateCTM(context,0.0,self.frame.size.height);

//图形呈正立显示

CGContextScaleCTM(context,1.0, -1.0);

/获取指定页的pdf文档

CGPDFPageRef  pageRef =CGPDFDocumentGetPage(documentRef,_pageNum);

//记录当前绘制环境,防止多次绘画

CGContextSaveGState(context);

//创建一个仿射变换,该变换基于将PDF页的BOX映射到指定的矩形中。

CGAffineTransform  pdfTransForm =CGPDFPageGetDrawingTransform(pageRef,kCGPDFCropBox,self.bounds,0,true);

CGContextConcatCTM(context, pdfTransForm);

//将pdf绘制到上下文中

CGContextDrawPDFPage(context, pageRef);

//将pdf保存

CGContextRestoreGState(context);

}

好了 自定义的view 实现的方法就是这些了  然后回到vc页面去

主要是在.m里面的  viewDidLoad

下面 我要开始了哦

翻页我们可以想到很多 比如UIPageViewController  UICollectionView等  这里我主要说的是UIPageViewController

@property (nonatomic,strong) UIPageViewController *pageVC;

@property (nonatomic,strong) NSMutableArray *pdfArr;

这个你们都懂吧

self.pdfArr = [NSMutableArray array];

NSDictionary *options = [NSDictionary  dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey:UIPageViewControllerOptionSpineLocationKey];

self.pageVC = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];

_pageVC.view.frame = self.view.bounds;

_pageVC.delegate = self;

_pageVC.dataSource = self;

[self addChildViewController:_pageVC];

CGPDFDocumentRef pdfRef = [self pdfRefByDataByUrl:@"http://eb18036.ebenny.com/new_huasun_server/upload//pdf//1527047215118.pdf"];

size_t count = CGPDFDocumentGetNumberOfPages(pdfRef);//这个位置主要是获取pdf页码数;

for (int i = 0; i < count; i++) {

UIViewController *pdfVC = [[UIViewController alloc] init];

LLPDFView *pdfView = [[LLPDFView alloc]initWithFrame:self.view.bounds documentRef:pdfRef andPageNum:i+1];

[pdfVC.view addSubview:pdfView];

[_pdfArr addObject:pdfVC];

}

[_pageVC setViewControllers:[NSArray arrayWithObject:_pdfArr[0]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

[self.view addSubview:_pageVC.view];

- (CGPDFDocumentRef)pdfRefByDataByUrl:(NSString *)aFileUrl {

NSURL*url = [NSURL URLWithString:aFileUrl];

CFURLRef refURL = (__bridge_retained CFURLRef)url;

CGPDFDocumentRef document =CGPDFDocumentCreateWithURL(refURL);

if(refURL){

CFRelease(refURL);

}

if(document) {

return  document;//返回获取到的数据

}else{

return   NULL; //如果没获取到数据,则返回NULL,当然,你可以在这里添加一些打印日志,方便你发现问题

}

}

- (UIViewController *)viewControllerAtIndex:(NSInteger)index

{

//Create a new view controller and pass suitable data.

if (([_pdfArr count] == 0 )|| (index > [_pdfArr count]) ) {

return nil;

}

NSLog(@"index = %ld",(long)index);

return (UIViewController *)_pdfArr[index];

}

- (NSUInteger) indexOfViewController:(UIViewController *)viewController

{

return [self.pdfArr indexOfObject:viewController];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

{

NSUInteger index = [self indexOfViewController:(UIViewController *)viewController];

if (index == NSNotFound) {

return nil;

}

index++;

if (index == [_pdfArr count]){

return  nil;

}

return [self viewControllerAtIndex:index];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController

{

NSUInteger index = [self indexOfViewController:(UIViewController *)viewController];

if ((index == 0 ) || (index == NSNotFound)){

return nil;

}

index--;

return [self viewControllerAtIndex:index];

}

原文地址:https://www.cnblogs.com/liaolijun/p/9082523.html

时间: 2024-10-06 06:38:33

关于UIWebView 加载网络PDF 实现翻页效果的那些事的相关文章

iOS开发-UIWebView加载本地和网络数据

UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置的,实现一些基本的功能.UIWebView可以查看Html网页,pdf文件,docx文件,txt文件文件,系统自带的Safari就是UIWebView实现的. 基础布局 页面布局很简单就是一个文本框,一个按钮,一个UIWebView,页面布局如下: 如果想简单一点的话,其实用UIWebView也行,

ios UIWebView 加载网页、文件、 html

UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过alloc init 来初始化 创建webview,下列文本中 _webView.dataDetectorTypes = UIDataDetectorTypeAll; 是识别webview中的类型,例如 当webview中有电话号码,点击号码就能直接打电话 - (UIWebView *)webView

iOS UIWebView 加载https站点出现NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,

今天在加载https站点的时候遇到如下的错误问题.所以对自己之前写的iOS内嵌webview做了一些修改,可以让它加载http站点也可以让它加载https站点. 下面是我加载https站点的时候出现的错误. error:     NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) HTTPS 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protoc

在UIWebView加载的页面, WF: _WebFilterIsActive returning: NO

x iOS10下在UIWebView加载的页面, WF: _WebFilterIsActive returning: NO UIWebView加载了一个集成的微信支付SDK,在执行了webview的代理方法后,在回调支付结果的时候会出现奔溃WF: _userSettingsForUser mobile: {    filterBlacklist =     (    );    filterWhitelist =     (    );    restrictWeb = 1;    useCon

0521.使用UIWebView加载来自NetWork、Project、Documents的html、javascript文件

话不多少,直接上代码,思路还是挺简单的. UIWebView *webView = [[UIWebView alloc]initWithFrame:self.view.frame]; // HTML文件来自Project // 步骤:path - > url - > request with url - > loadRequest NSString *path_Proj = [[NSBundle mainBundle]pathForResource:@"index"

(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好,  今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 . 如果gif图片地址无效 了.      请大家自行到网上去寻找一个 gif图片地址 复制过去就可以了.谢谢大家 不会在 eclipse下使用  (android开源库android-gif-drawable)     请看我的这篇博客   (android开源库android-gif-drawable)第一篇 eclipse使用

android客户端加载网络大图片如何避免内存溢出

在Android开发中加载sdcard上的大图片到内存时容易导致OOM异常,常见的解决办法是基于BitmapFactory.Options类提供的方法定义指定的解码方式,设置inJustDecodeBounds属性为true,避免分配内存,返回一个null的Bitmap对象(包含outWidth,outHeightandoutMimeType),然后读取图片的尺寸和类型.再根据屏幕的高和宽对图片进行缩放,最后将缩放的图片加载到内存,主要代码如下: 1 Options opts = new Opt

IOS嵌套界面下 -UIWebView加载网页显示不全(尺寸适应问题)

最近有个朋友碰到一个关于在嵌套界面下UIWebView加载网页显示不全的问题 咋一看这种问题太easy了.但是不要忽视其背后的真正黑手,现在拿百度首页做个实验(百度就是这点好)先贴上一小段核心代码: 显示效果: 看到没 显示不全.现在你会说快用大招: 解决它.可惜这招也不行. 原因分析:为什么会显示不全呢? 主要问题就出在前面说的关于在嵌套界面下. 可为什么在嵌套界面下就不行呢? 显示不全是个问题. 是的 是个问题而且是个显示界面尺寸不匹配的问题.可在主界面就这可以, 而且frame我都是用的s

ASIHttpRequest加载网络数据和上传数据功能

使用ASIHttpRequest第三库,需要配置 二, 上传数据功能使用ASIFromDataRequest(可以上传二进制和字符串给服务器) 下面来牛刀小试 //建立一个工程,导入第三方库,在AppDelegate.h #import <UIKit/UIKit.h> #import "ASIFormDataRequest.h" @interface AppDelegate : UIResponder <UIApplicationDelegate,ASIHTTPReq