2017-10-22 9 views
0

私はこのチュートリアルのオンラインhttps://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/に従っています(ちょっとした工夫をしています)。私はUIImagePickerControllerをwebviewから呼び出そうとしており、コードが正しく動作するようにコードを変更する方法がわかりません。違いは、私はjavascriptから呼び出しを受け取り、UIButtonの代わりに結果としてピッカーを呼び出すことになるということです。それから私はjavascriptインターフェイスを使ってbase64文字列としてイメージを送り返したいと思います。UIImagePickerControllerのwebviewからの使用方法

これまで私がこれまで持っていたことは次のとおりです。私はそれを考え出しオーケー

import UIKit 
import WebKit 

class ViewController: UIViewController, 
         WKScriptMessageHandler, 
         UIImagePickerControllerDelegate, 
         UINavigationControllerDelegate { 


    var webView: WKWebView? 
    let userContentController = WKUserContentController() 
    let picker = UIImagePickerController(); 

    @IBAction func photoFromLibrary(_ sender: UIBarButtonItem) { 
     picker.allowsEditing = false 
     picker.sourceType = .photoLibrary 
     picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! 
     present(picker, animated: true, completion: nil) 
    } 


    override func loadView() { 
     super.loadView() 


     let config = WKWebViewConfiguration() 
     config.userContentController = userContentController 

     self.webView = WKWebView(frame: self.view.bounds, configuration: config) 
     userContentController.add(self, name: "iOS") 

     let url = URL(string:"https://relate.lavishweb.com/account") 
     let request = URLRequest(url: url!) 
     _ = webView?.load(request) 

     self.view = self.webView 



    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     picker.delegate = self 
    } 


    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 

     webView?.evaluateJavaScript("window.settings.setImageBase64FromiOS()") { (result, error) in 
      if error != nil { 
       print("Success") 
      } else { 
       print("Failure") 
      } 
     } 


     // now use the name and token as you see fit! 
    } 

    func imagePickerController(_ picker: UIImagePickerController, 
           didFinishPickingMediaWithInfo info: [String : AnyObject]) 
    { 
     let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //2 
     //  myImageView.contentMode = .scaleAspectFit //3 
     //  myImageView.image = chosenImage //4 

     //I want to do additional stuff here and send back as a base64 String 
     dismiss(animated:true, completion: nil) //5 

    } 
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     dismiss(animated: true, completion: nil) 
    } 
} 

答えて

0

だから私はIBActionだったが、基本的にはそれが何を意味するのか知りませんでした

こと、私はそれがインタフェースによって呼び出されたものです後に宣言するつもりだ機能ビルダーUIButtonなどの要素。私はJavasScriptから電話を受けたとき、これを実現した後、私はちょうど

func photoFromLibrary() { 
    picker.allowsEditing = false 
    picker.sourceType = .photoLibrary 
    picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! 
    present(picker, animated: true, completion: nil) 
} 

に機能を変更し、その後、私はJavaScriptインターフェイスに私は単に関数を呼び出しました。

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 

    webView?.evaluateJavaScript("window.settings.setImageBase64FromiOS()") { (result, error) in 
     if error != nil { 
      print("failure") 
     } else { 
      self.photoFromLibrary() 
     } 
    } 
} 

滞在をチューニングし、私もロード時にそれを縮小しながら、Base64文字列に画像をエンコードする方法を掲載します

EDIT(私はofcourseのことを行う方法を見つけたら):私は考え出しましたどのように画像のサイズを変更し、Base64文字列に変換するかを非常に素早く行うことができます。

私は

extension UIImage { 
    func resized(withPercentage percentage: CGFloat) -> UIImage? { 
     let canvasSize = CGSize(width: size.width * percentage, height: size.height * percentage) 
     UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale) 
     defer { UIGraphicsEndImageContext() } 
     draw(in: CGRect(origin: .zero, size: canvasSize)) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 
    func resized(toWidth width: CGFloat) -> UIImage? { 
     let canvasSize = CGSize(width: width, height: CGFloat(ceil(width/size.width * size.height))) 
     UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale) 
     defer { UIGraphicsEndImageContext() } 
     draw(in: CGRect(origin: .zero, size: canvasSize)) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 

...この拡張機能を実装し、その後、私はそうのような文字列を返さ...

func imagePickerController(_ picker: UIImagePickerController, 
          didFinishPickingMediaWithInfo info: [String : AnyObject]) 
{ 
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    let thumb = chosenImage.resized(toWidth: 72.0) 
    let imageData:NSData = UIImagePNGRepresentation(thumb!)! as NSData 
    let dataImage = imageData.base64EncodedString(options: .lineLength64Characters) 
    print(dataImage) 
    dismiss(animated:true, completion: nil) //5 

} 
1

こんにちは、私はEINがそれを解決し、同じ問題を抱えているが、それはです少しダーティ。 viewDidLoad()では、WKWebViewからデリゲートをオーバーライドします。 WKWebViewもDelegateを使用します。デリゲートローカルを保存する必要があります。

var oldDelegate: UIImagePickerControllerDelegate? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    oldDelegate = picker.delegate // save the Delegate from WKWebView 
    picker.delegate = self 
} 

これで、デリゲートでコードを実行できます。あなたのメソッドimagePickerController()の終わりに、古いデリゲートからimagePickerController()を呼び出さなければなりません。

func imagePickerController(_ picker: UIImagePickerController, 
           didFinishPickingMediaWithInfo info: [String : AnyObject]){ 
     var myinfo = info 
     let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //2 
     //  myImageView.contentMode = .scaleAspectFit //3 
     //  myImageView.image = chosenImage //4 
     myinfo[UIImagePickerControllerOriginalImage] = chosenImage 
     myinfo[UIImagePickerControllerImageURL] = nil 

     oldDelegate?.imagePickerController!(picker, didFinishPickingMediaWithInfo: myinfo) 
    } 

URLが満たされている場合、WKWebViewはドライブからイメージを直接ロードするため、URLはnilに設定します。 myinfo [UIImagePickerControllerImageURL] = nil

私はこれが役に立ちそうです。

関連する問題