How to jump pdf page in UIWebView? - objective-c

I'm trying to scroll the pdf file by page
here is my code
-(void)viewDidLoad{
NSString *path = [[NSBundle mainBundle] pathForResource:#"myPdffile" ofType:#"pdf"];
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *urlrequest = [NSURLRequest requestWithURL:url];
[webview loadRequest:urlrequest];
webview.scalesPageToFit = YES;
[super viewDidLoad];
}
//goto next page
-(IBAction)nextpage{
[webview stringByEvaluatingJavaScriptFromString: ?????? ];
}
//goto previous page
-(IBAction)prevpage {
?????
}
what should i put after stringByEvaluatingJavaScriptFromString?
do i put same code in "prevpage"?
thanks!

In iOS 5 you can use this statement for page jumping
[[webView scrollView] setContentOffset:CGPointMake(0,y) animated:YES];
and in below iOS 5 you can use this statement
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:#"window.scrollTo(0.0, %f)", y]];
Where y is the height where you're going to jump.
Here i am writing some sample code for next and previous page
-(IBAction) nextPage: (id) sender
{
if (currentPage < numberOfPages)
{
float y = pageHeight * currentPage++;
if (isIOSAbove4)
{
[[webView scrollView] setContentOffset:CGPointMake(0,y) animated:YES];
}
else
{
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:#"window.scrollTo(0.0, %f)", y]];
}
}
}
For previous page:
-(IBAction) prevPage: (id) sender
{
if (currentPage - 1)
{
float y = --currentPage * pageHeight - pageHeight;
if (isIOSAbove4)
{
[[webView scrollView] setContentOffset:CGPointMake(0,y) animated:YES];
}
else
{
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:#"window.scrollTo(0.0, %f)", y]];
}
}
}
in above sample code isIOSAbove4 is defined in pch file
#define isIOSAbove4 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
Hope above code will solve your problem

I dont believe there is a way to do this, in other web browsers/PDF viewers you could use the querystring parameter to ?page=6 but that doesnt appear to be supported by the WebKit PDF engine

I have faced a similar problem, in which I had to navigate to particular page in PDF (which is displayed using UIWebView) on selection of a cell in tableView (thumbnail tableview).
So I wrote a piece of code which allows you to scroll to particular page in PDF. This works even if the PDF is in zoomed state. You can find the code here.

Related

Why does createWebviewWithConfiguration not change the displayed view when window.open is called?

I'm quite new to WKWebView and am struggling with this problem where my current view doesnt change when invoking windows.open from javascript see below...
function logo_click() {
window.open(some_valid_url);//url is valid www.google.com for example
}
I'm quite sure that this function is hit since I stepped on it using Safari Tech Preview. And I'm even getting the breakpoint in my createWebviewWithConfiguration() function in xcode obj-c when logo_click is invoked,
-(WKWebView*)webView:(WKWebView )webView createWebViewWithConfiguration:(nonnull WKWebViewConfiguration )inConfig forNavigationAction:(nonnull WKNavigationAction )navigationAction windowFeatures:(nonnull WKWindowFeatures )windowFeatures
{
_webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:inConfig];
if (!navigationAction.targetFrame.isMainFrame) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self.webView loadRequest:navigationAction.request];
//[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:#"https://www.google.com"]]];
}
return _webView;
}
I even tried hardcoding google.com to see if it can navigate from there but my displayed view is still the previous one. I already checked the tutorial on
iphonedevsdk.com/forum/iphone-sdk-development/122635-wkwebview-wont-open-external-links.html
but my view still doesn't change. What could I be missing?
I solved it using the following code...
-(WKWebView*)webView:(WKWebView *)webView createWebViewWithConfiguration:(nonnull WKWebViewConfiguration *)inConfig forNavigationAction:(nonnull WKNavigationAction *)navigationAction windowFeatures:(nonnull WKWindowFeatures *)windowFeatures
{
[_webView removeFromSuperview];
_webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:inConfig];
if (!navigationAction.targetFrame.isMainFrame) {
//[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLRequest* req = navigationAction.request;
[self.webView loadRequest:req];
}
_webView.navigationDelegate = self;
_webView.UIDelegate = self;
_webView.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:_webView];
return _webView;
}

UIWebView loads HTML from local file but fails occasionally

I've come across many ways to load and reload the content of a UIWebView from a local html file but it seems like the issue I have keeps coming back.
On my project I have a webView that dynamically loads HTML content pulled from one of the 50 different HTML files I have in my XCode project.
Depending on which button the user presses on the viewController before, a different HTML file is used to reload the content of my webView. Everything works fine most of the time but every now and then, the webView will simply display "(null)", after the webViewDidFinishLoad delegate method is called.
I don't understand what is going on, and when I go back and forth on this viewController and the webView is reloaded the HTML content ends up showing up properly eventually for the same HTML file.
Here is the code to load the HTML in the webView (called from the viewWillAppear method) :
- (void) reloadWebViewFromLocalFile{
// Reset the UIWebView
[self.contentWebView removeFromSuperview];
self.contentWebView = nil;
self.contentWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
[self.contentWebView setContentMode:UIViewContentModeScaleAspectFit];
[self.contentWebView setDelegate:self];
[self.contentScrollView addSubview:self.contentWebView];
[self.contentWebView release];
NSString *fileName = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:#"%d.%d",self.currentIndexPath.section+1,self.currentIndexPath.row+1] ofType:#"html"];
NSString *CSSContent = [NSString stringWithFormat:#"<style type=\"text/css\">body{padding-left:8px;padding-right:8px;font-family:\"%#\";}p{text-align:justify;}img{max-width:300px;display:block; margin:auto;}strong{font-family:\"%#\";}h1{font-size:20;font-family:\"%#\"}h2{font-size:18;font-family:\"%#\"}h3{font-size:17;font-family:\"%#\"}</style><script type=\"text/javascript\">touchMove = function(event) {event.preventDefault();}</script>", FONT_STAG_BOOK, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD];
self.HTMLString = [NSString stringWithFormat:#"<html><head>%#</head>%#</html>",CSSContent,[NSString stringWithUTF8String:[[NSData dataWithContentsOfFile:fileName] bytes]]];
[self.contentWebView loadHTMLString:self.HTMLString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
}
and this is the webViewDidFinishLoad delegate method :
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *stringContent = [self.contentWebView stringByEvaluatingJavaScriptFromString:#"document.body.innerHTML"];
float height = [[self.contentWebView stringByEvaluatingJavaScriptFromString:#"document.body.offsetHeight;"] floatValue] + 20;
[self.contentWebView setFrame:CGRectMake(0, 0, 320, height)];
[self.contentScrollView setContentSize:CGSizeMake(0, height+self.nextButton.frame.size.height)];
[self.nextButton setFrame:CGRectMake(0, height, 320, self.nextButton.frame.size.height)];
if ([self.contentWebView respondsToSelector:#selector(scrollView)]) {
self.contentWebView.scrollView.scrollEnabled = NO; // available starting in iOS 5
} else {
for (id subview in self.contentWebView .subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).scrollEnabled = NO;
}
}
Edit : Forgot to copy-paste the line that actually loads the HTML string in the webView
The problem seems to be using the bytes function, which doesn't work too well if the content encoding isn't exact...
[NSString stringWithUTF8String:[[NSData dataWithContentsOfFile:fileName] bytes]];
should be
[[NSString alloc] initWithData:[NSData dataWithContentsOfFile:fileName] encoding:NSUTF8StringEncoding];

iOS: Force UIWebView to reload / prevent caching

I have an iPhone app that shows a website. This website changes it's content from time to time but my app doesn't reload it every time it is opened. I tried to prevent the caching of the site, but without success.
This is my init method:
- (id)init:(NSString *)url withTitle:(NSString *)theTitle withPageName:(NSString *)pageName {
self = [super init];
if(self) {
NSLog(#"websiteviewcontroller init");
self.title = theTitle;
self.url = url;
self.pageName = pageName;
CGRect frame = [[UIScreen mainScreen] applicationFrame];
webView = [[UIWebView alloc] initWithFrame:frame];
NSURL *theURL = [NSURL URLWithString:url];
[webView loadRequest:[NSURLRequest requestWithURL:theURL]];
// support zooming
webView.scalesPageToFit = YES;
//[[NSURLCache sharedURLCache] removeAllCachedResponses];
[webView reload];
}
return self;
}
This is my viewWillAppear-Method:
- (void)viewWillAppear:(BOOL)animated {
CGRect frame = [[UIScreen mainScreen] applicationFrame];
webView = [[UIWebView alloc] initWithFrame:frame];
NSURL *theURL = [NSURL URLWithString:url];
[webView loadRequest:[NSURLRequest requestWithURL:theURL]];
[webView reload];
// support zooming
webView.scalesPageToFit = YES;
}
Please help me to solve this problem. All answers are much appreciated.
This code snipplet fixed my problem:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
The answer is just for the next question. For a ore complete answer:
UIwebview without Cache

stringByEvaluatingJavaScriptFromString recognize webview content height

i placed a Uiwebview in a UIscrollview because after the uiwebview i want to display some images with the PageController.
i'm using this line of code.
-(void)webViewDidFinishLoad:(UIWebView *)webView{
if (webView!=WebView)return;
float h;
NSLog(#"web view is %f high", WebView.frame.size.height);
NSString *heightString = [WebView stringByEvaluatingJavaScriptFromString:#"document.getElementById(\"body\").offsetHeight;"];
NSLog(#"web content is %# high",heightString);
h = [heightString floatValue] +12.0f;
WebView.frame = CGRectMake(WebView.frame.origin.x, WebView.frame.origin.y, WebView.frame.size.width, h);
h = WebView.frame.origin.y + h + 20;
[ScrollView setContentSize:CGSizeMake(320, h)];
}
But Web view is %f high doesn't work, it does not reconize the height of the WebView does anyone know how i can fix this? Is this because i'm using [WebView loadHTMLString:html baseURL:nil];
And: NSString *heightString = [WebView stringByEvaluatingJavaScriptFromString:#"document.getElementById(\"body\").offsetHeight;"];
NSString *html = [NSString stringWithFormat:#"<html><head><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>body { font: normal 13px helvetica; color: #565656; } </style></head><body><p>%#</p></body></html> ",text];
[WebView loadHTMLString:html baseURL:nil];
Try
NSString *heightString = [Bericht stringByEvaluatingJavaScriptFromString:#"document.body.offsetHeight;"];
Good luck,
Nathan
UIWebView already contains a scrollView, why are you adding it as a subview again. Check Apple's documentation here

How to tell when UIWebView has finished displaying content

I'm making a UIWebView load a pdf like this:
UIWebView *pdfView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];
pdfView.delegate = self;
[pdfView loadRequest:request];
And then doing some stuff with the view once it loads:
- (void)webViewDidFinishLoad:(UIWebView*)sender {
[sender takeScreenshot]; // my UIView category screenshot method
[sender release];
}
It all works, apart from the fact that at the point webViewDidFinishLoad is called, the view hasn't displayed anything yet, it displays a few milliseconds later. So is there any way to tell when the UIWebView has finished displaying its content (a pdf in this case)?
You could do:
[self performselector:#selector(getScreenshot) withObject:sender afterDelay:0.1];
-(void) getScreenshot:(UIWebView *)webView {
[webView takeScreenshot];
[webView release];
}
Or something similar.