gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:32:59 24 4
gpt4 key购买 nike

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

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

那么有没有办法获得:

  1. Web View 中 PDF 单个页面的像素高度?
  2. 页面之间的间隙大小?

此信息可以从 UIWebView 获得,还是可以通过其他方式计算?

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

<小时/>

编辑我

我有一个解决方案,但它使用 UIWebDocumentView,它是 UIWebView 的私有(private) subview 。

我创建了一个名为 PDFViewerViewController 的 View Controller ,它是 WebViewerViewController 的子类,而 WebViewerViewController 本身也是一个包含 UIToolbar 的 View Controller ,一个UIWebView,并且符合UIWebViewDelegate协议(protocol)。

在调用 Web View 委托(delegate)方法 -webViewDidFinishLoad: 后,我的 PDFViewerViewController 计算有关封闭 Web View 和 PDF 数据的一些信息。

此信息用于计算通过 JavaScript 馈送到 Web View 的近似每页偏移量。

PDFViewerViewController.h

#import <UIKit/UIKit.h>
#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)]];
}

一些观察

  1. 偏移量计算并不完美。如果 PDF 文档不是 8.5 x 11(例如 A4),则偏移误差会更快变得更糟。

  2. 通过触摸拖动方式滚动 Web View 时,self.currentPage 属性不会更新。人们可能会拖动几页,然后触摸工具栏上的向左或向右箭头将导致偏移量意外移至上一页。

  3. 此解决方案使用 UIWebDocumentView,它是私有(private)的,可能会导致应用拒绝。

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

有人构建过非基于 UIWebView 的 PDF 查看器(带有源代码)吗?

最佳答案

所以这篇文章已经开放了一段时间了,但由于这是 Google 搜索“scroll pdf uiwebview”的第一个条目,我想我应该为 future 的读者提供我对此的看法。

您确实可以只使用纯 Java 脚本滚动到 PDF 文档中的特定页面。我已在我们的博客 ( http://apptech.next-munich.com/2011/02/pdf-in-uiwebview.html ) 上发布了示例代码,但这里是您需要执行的操作的简短摘要:

  1. 使用 window.outerHeight DOM 属性查找渲染的 PDF 文档的总高度。
  2. 使用 window.innerHeight DOM 属性查找浏览器坐标中浏览器窗口的高度。
  3. 使用window.scrollTo(x, y)函数跳转到页面。

但是,有一个问题,您不能仅通过页数来设置外层高度并跳转到您所得到的内容。相反,您必须乘以 innerHeight/webView.bounds.size.height 比率。

关于iphone - 有没有办法以编程方式滚动到 UIWebView 中的 PDF 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1927841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com