当前位置:  开发笔记 > 编程语言 > 正文

有没有办法以编程方式滚动到UIWebView中的PDF页面?

如何解决《有没有办法以编程方式滚动到UIWebView中的PDF页面?》经验,为你挑选了0个好方法。

可以使用JavaScript来设置a的像素y偏移量UIWebView,例如:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];

有没有办法得到:

    Web视图中PDF的单个页面的像素高度?

    页面之间的差距大小?

这些信息UIWebView是否可以通过其他方式获得?

我想如果我有页数(通过CGPDFDocumentGetNumberOfPages),页面之间的像素高度差距,或单个页面的像素高度,我可以计算offset使用JavaScript调用.然后我只是连接一个UIButtonUISlider在页面之间移动.


编辑我

我有一个解决方案,但它使用UIWebDocumentView了一个私人子视图UIWebView.

我创建了一个名为的视图控制器PDFViewerViewController,它是一个子类WebViewerViewController,它本身就是一个视图控制器,它包含a UIToolbar,a UIWebView,并且符合UIWebViewDelegate协议.

在调用PDFViewerViewControllerWeb视图委托方法之后,我会计算有关封闭Web视图和PDF数据的一些信息-webViewDidFinishLoad:.

此信息用于计算通过JavaScript提供给Web视图的大致每页偏移量.

PDFViewerViewController.h

#import 
#import "WebViewerViewController.h"

@interface UIWebDocumentView : NSObject {}
@end

@interface PDFViewerViewController : WebViewerViewController {
    NSUInteger offset;
    NSUInteger currentPage;
    NSUInteger documentPages;
    CGFloat documentHeight;
    CGFloat pageHeight;
}

@property (assign) NSUInteger offset;
@property (assign) NSUInteger currentPage;
@property (assign) NSUInteger documentPages;
@property (assign) CGFloat documentHeight;
@property (assign) CGFloat pageHeight;

@end

PDFViewerViewController.m

#import "PDFViewerViewController.h"

@implementation PDFViewerViewController

@synthesize offset;
@synthesize currentPage;
@synthesize documentPages;
@synthesize documentHeight;
@synthesize pageHeight;

- (void) viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *_leftArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowLeft.png"] style:UIBarButtonItemStylePlain target:self action:@selector(leftArrow:)];
    UIBarButtonItem *_flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    UIBarButtonItem *_rightArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowRight.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rightArrow:)];
    [[super.viewerToolbarView toolbar] setItems:[NSArray arrayWithObjects:_leftArrow, _flexibleSpace, _rightArrow, nil]];
    [_leftArrow release];
    [_flexibleSpace release];
    [_rightArrow release];

    self.currentPage = 0;
}

- (void) webViewDidFinishLoad:(UIWebView *)_webView {
    for (UIView *_subview in [[[_webView subviews] objectAtIndex:0] subviews]) {
        if ([_subview isKindOfClass:[UIWebDocumentView class]]) {
            self.documentHeight = _subview.bounds.size.height;
        }
    }

    CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)baseURL);
    self.documentPages = CGPDFDocumentGetNumberOfPages(pdfDocument);
    CGPDFDocumentRelease(pdfDocument);

    self.pageHeight = (self.documentHeight + (10 * self.documentPages)) / self.documentPages;
    self.currentPage = 1;
    self.offset = 0;
}

- (void) leftArrow:(id)_param {
    if (self.currentPage == 1) 
        return;
    self.offset -= (NSUInteger)self.pageHeight;
    self.currentPage--;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

- (void) rightArrow:(id)_param {
    if (self.currentPage == self.documentPages) 
        return;
    self.offset += (NSUInteger)self.pageHeight;
    self.currentPage++;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

一些观察

    偏移计算不是页面完美的.如果PDF文档不是8.5 x 11(例如A4),则偏移误差会更快地恶化.

    self.currentPage通过触摸拖动滚动浏览Web视图时,该属性不会更新.可能会拖动几页,然后触摸工具栏上的向左或向右箭头将导致偏移意外移动到上一页.

    此解决方案使用UIWebDocumentView,这是私有的,可能会导致应用拒绝.

我想我会向Apple提交功能增强请求.

有没有人建立一个非UIWebView基础的PDF查看器(带源代码)?

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有