iOS下PDF文件的浏览和涂鸦效果的简单实现

 更新时间:2015年10月28日 09:47:07   作者:念茜  
这篇文章主要介绍了iOS下PDF文件的浏览和涂鸦效果的简单实现,代码基于传统的Objective-C,需要的朋友可以参考下

浏览PDF的效果
方法一:利用webview

复制代码 代码如下:

-(void)loadDocument:(NSString *)documentName inView:(UIWebView *)webView 

    NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil]; 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 


利:1.实现简单
        2.还是实现简单
弊:1.仅能浏览,拿不到任何回调,safari不会鸟任何人。
        2.固定竖版拖动,想实现翻页动效果就扒瞎

2015102894335125.png (424×555)

下面的方法可以解决webview 显示pdf的弊,相对的,要付出一些汗水作为代价了。

方法二:利用CGContextDrawPDFPage

复制代码 代码如下:

CGPDFDocumentRef GetPDFDocumentRef(NSString *filename) 

    CFStringRef path; 
    CFURLRef url; 
    CGPDFDocumentRef document; 
    size_t count; 
     
    path = CFStringCreateWithCString (NULL, [filename UTF8String], kCFStringEncodingUTF8); 
    url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0); 
     
    CFRelease (path); 
    document = CGPDFDocumentCreateWithURL (url); 
    CFRelease(url); 
    count = CGPDFDocumentGetNumberOfPages (document); 
    if (count == 0) { 
        printf("[%s] needs at least one page!\n", [filename UTF8String]); 
        return NULL;  
    } else { 
        printf("[%ld] pages loaded in this PDF!\n", count); 
    } 
    return document; 

 
void DisplayPDFPage (CGContextRef myContext, size_t pageNumber, NSString *filename) 

    CGPDFDocumentRef document; 
    CGPDFPageRef page; 
     
    document = GetPDFDocumentRef (filename); 
    page = CGPDFDocumentGetPage (document, pageNumber); 
    CGContextDrawPDFPage (myContext, page); 
    CGPDFDocumentRelease (document); 


这样显示出来的pdf单页是倒立的,Quartz坐标系和UIView坐标系不一样所致,调整坐标系,使pdf正立:

复制代码 代码如下:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, 80, self.frame.size.height-60); 
CGContextScaleCTM(context, 1, -1); 


配合iOS5强大的UIPageViewController实现翻页浏览

复制代码 代码如下:

- (PDFViewController *)viewControllerAtIndex:(NSUInteger)index  

    //Return the PDFViewController for the given index. 
    if (([self.pagePDF count] == 0 )|| (index > [self.pagePDF count]) ) { 
        return nil; 
    } 
     
    //Create a new view controller and pass suitable data. 
    PDFViewController *dataViewController = [[PDFViewController alloc]initWithNibName:@"PDFViewController" bundle:nil]; 
    //dataViewController.pdfview = [self.pagePDF objectAtIndex:index]; 
    dataViewController.pdfview = [[PDFView alloc]initWithFrame:self.view.frame atPage:index]; 
    [dataViewController.view addSubview:dataViewController.pdfview]; 
    NSLog(@"index = %d",index); 
    return dataViewController; 

 
- (NSUInteger) indexOfViewController:(PDFViewController *)viewController 

    return [self.pagePDF indexOfObject:viewController.pdfview]; 

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

    NSUInteger index = [self indexOfViewController:(PDFViewController *)viewController]; 
    if ((index == 0 ) || (index == NSNotFound)){ 
        return nil; 
    } 
     
    index--; 
    return  [self viewControllerAtIndex:index]; 

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

    NSUInteger index = [self indexOfViewController:(PDFViewController *)viewController]; 
    if (index == NSNotFound) 
    { 
        return nil; 
    } 
     
    index++; 
     
    if (index == [self.pagePDF count]){ 
        return  nil; 
    } 
     
    return [self viewControllerAtIndex:index]; 


2015102894406303.png (385×514)

2015102894427910.png (385×512)

涂鸦效果
主要涉及:
1. 多context,分层画画

复制代码 代码如下:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx


2. 触摸事件touches族那些event

复制代码 代码如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
……


3. 初始化单页view传页码

复制代码 代码如下:

- (id)initWithFrame:(CGRect)frame onPage:(NSInteger)page


4.画轨迹方法

复制代码 代码如下:

CG_EXTERN void CGPathMoveToPoint(CGMutablePathRef path,
  const CGAffineTransform *m, CGFloat x, CGFloat y)
CG_EXTERN void CGPathAddLineToPoint(CGMutablePathRef path,
  const CGAffineTransform *m, CGFloat x, CGFloat y)


2015102894449261.png (383×512)

2015102894506965.png (386×513)

2015102894558662.png (770×575)

2015102894619851.png (770×577)

您可能感兴趣的文章:

相关文章

  • iOS实现转盘效果

    iOS实现转盘效果

    这篇文章主要为大家详细介绍了iOS实现转盘效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • iOS实现调用QQ客户端发起临时会话

    iOS实现调用QQ客户端发起临时会话

    本篇文章主要给大家详细分析了用IOS实现调用QQ客户端发起临时会话的功能,对此有需要的朋友收藏分享下。
    2018-02-02
  • iOS实现滚动字幕的动画特效

    iOS实现滚动字幕的动画特效

    这篇文章给大家带来一款应用非常实用的控件,滚动字幕,可以应用在新闻、财经、聊天等各类APP上,B格瞬间提升了一个档次有木有,下面跟着小编一起看看如何实现的吧。
    2016-09-09
  • IOS检测指定路径的文件是否存在

    IOS检测指定路径的文件是否存在

    本文给大家分享的是在IOS开发中检测指定文件是否存在的方法,给大家汇总了4种,十分实用,小伙伴们根据自己的需求自由选择吧。
    2015-05-05
  • 谈谈iOS中的多继承与多重代理

    谈谈iOS中的多继承与多重代理

    这篇文章主要给大家介绍了关于iOS中多继承与多重代理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • IOS开发中如何设计短信验证码防刷机制

    IOS开发中如何设计短信验证码防刷机制

    给大家详细分享一下在IOS的项目开发中如何设计短信验证码防刷机制,已经步骤详解,喜欢的朋友参考下吧。
    2018-02-02
  • iOS实现容器视图控制器的方法

    iOS实现容器视图控制器的方法

    本篇文章给大家详细讲述了iOS实现容器视图控制器的方法,对此感兴趣的朋友可以测试学习下。
    2018-02-02
  • IOS开发中延迟执行和取消

    IOS开发中延迟执行和取消

    这篇文章主要介绍了IOS开发中延迟执行和取消的相关资料,需要的朋友可以参考下
    2018-01-01
  • iOS APP 多服务器环境分离的方法

    iOS APP 多服务器环境分离的方法

    这篇文章主要介绍了iOS APP 多服务器环境分离的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • iOS实现全局悬浮按钮

    iOS实现全局悬浮按钮

    这篇文章主要为大家详细介绍了iOS实现全局悬浮按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论