Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotate PDF in UIWebView with Swift

I got a view that is used to show different PDF files in a UIWebView, this UIWebView load the PDF file as NSData like:

webView.loadData(pdfData, MIMEType: "application/pdf", textEncodingName: "utf-8", baseURL: NSURL())

Now there are some PDF files that need to be rotated via UIButton that is above the UIWebView, is there a way to rotate the PDF inside of the UIWebView?

What i did try so far was

webView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))

but this was not getting me the result i was looking for.

like image 806
Fabian Boulegue Avatar asked Mar 30 '16 19:03

Fabian Boulegue


3 Answers

  • To rotate the single view-controller in application, override the shouldAutorotate method.
  • Check the current statusBarOrientation, then update the UIInterfaceOrientation as follows:-

    let interfaceOrienation : UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
    
    if(interfaceOrienation == UIInterfaceOrientation.Portrait){
        let value = UIInterfaceOrientation.LandscapeLeft.rawValue
        UIDevice.currentDevice().setValue(value, forKey: "orientation")
    }else{
        let value = UIInterfaceOrientation.Portrait.rawValue
        UIDevice.currentDevice().setValue(value, forKey: "orientation")
    }
    

I developed a sample project for you. Please follow the below link to download the full code. https://www.dropbox.com/s/3hk5y9g7v74cbkd/Stackoverflow_webview.zip?dl=0

enter image description here

like image 72
pkc456 Avatar answered Sep 22 '22 14:09

pkc456


If I have understand your problem it's to center your PDF after you have rotate it, to showing it correctly from the top, unfortunately CGAffineTransformMakeRotation only it's not enough..

You can do:

webView.scalesPageToFit = true
let scale = CGAffineTransformMakeScale(0.6, 0.6)
let translate = CGAffineTransformMakeTranslation(webView.frame.origin.x, webView.frame.origin.y - webView.frame.size.height * 0.25)
let transform =  CGAffineTransformConcat(translate, scale);
webView.transform =  CGAffineTransformRotate(transform, CGFloat(M_PI_2))

And to return back from transform:

webView.transform = CGAffineTransformIdentity

There is also another working method but I don't recommend to do:

(it's too long and too hard to handle html page just to make a rotation..)

set webView -> load a responsive HTML page -> this responsive HTML page load PDF -> inject to webView the following javascript code

func webViewDidFinishLoad(webView: UIWebView) {
    let js = "document.body.style.setProperty('-webkit-transform', 'rotate(-90deg)', null);"
    webView.stringByEvaluatingJavaScriptFromString(js)
}

You can check your JS also from JSFiddle if you want to do it.

like image 36
Alessandro Ornano Avatar answered Sep 19 '22 14:09

Alessandro Ornano


Currently i do use this code to rotate, but the "view does not stay centered (i think based on my auto layout)

print(webView.transform)
        if (webView.transform.a == 1.0 && webView.transform.d == 1.0) {webView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI/2));print("done1")}
        else if(webView.transform.b == 1.0 && webView.transform.c == -1.0) {webView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI));print("done2")}
        else if(webView.transform.a == -1.0 && webView.transform.d == -1.0) {webView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI+(M_PI/2)));print("done3")}
        else if(webView.transform.b == -1.0 && webView.transform.c == 1.0) {webView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI + M_PI));print("done4")}
        else{print("nothing happens")}

example vid http://imgur.com/O2Qjuu2

like image 28
Fabian Boulegue Avatar answered Sep 23 '22 14:09

Fabian Boulegue