2017-10-22 1 views
0

나는이 튜토리얼을 온라인 https://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/에 따라 다닙니다. webview에서 내 UIImagePickerController을 호출하려고하는데 제대로 작동하도록 코드를 변경하는 방법을 모르겠습니다. 차이점은 자바 스크립트에서 전화를 받고 UIButton 대신 결과로 피커를 호출한다는 것입니다. 그럼 내 자바 스크립트 인터페이스를 사용하여 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과 같은 Builder 요소. 이것을 실현 후, 난 그냥 자바 스크립트에에서 전화를 받았을 때 나는 단순히 함수를 호출 내 자바 스크립트 인터페이스에서

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

에 기능을 변경했습니다. .

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

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

스테이 튜닝과 나는 또한로드시를 축소하면서 Base64로 문자열에 이미지를 인코딩하는 방법을 게시 할 예정입니다

편집을 (일단 나는 당연히 작업을 수행하는 방법을 알아) : 내가 알아 냈어 이미지 크기를 조정하고 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() 
    } 
} 

와 나는 내가 EIN이 그것을 해결 같은 문제가 있으므로 같은 문자열 ...

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

안녕을 반환하지만, 그것은이다 조금 더러운. viewDidLoad()에서 WKWebView에서 대리인을 재정의합니다. WKWebView는 위임자도 사용합니다. Delegate local을 저장해야합니다.

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

도움이되기를 바랍니다.

관련 문제