2017-11-07 1 views
1

앱을 사용하면 사용자가 자신의 이미지를 추가 할 수 있습니다. 이를 위해 UIImagePicker를 사용합니다.카메라를 닫고 앱으로 돌아 오는 데 오랜 시간이 걸립니다.

다음 기능을 살펴보십시오. 이미지를 두드리면 팝업으로보기를 엽니 다.

func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) 
{ 


    let userDetails:Dictionary = (UserDefaults.standard.value(forKey: "myUserDetails") as? [String:Any])! 
    let UserID:Int = userDetails["UserID"] as! Int 

    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "imager") as! imagerVC 
    popOverVC.UserID = UserID 

    self.addChildViewController(popOverVC) 
    popOverVC.view.frame = self.view.frame 
    self.view.addSubview(popOverVC.view) 

    popOverVC.didMove(toParentViewController: self) 


    popOverVC.callback = { image in 
     // do something with the image 


     self.profile_image.image = image 
     if let data = UIImagePNGRepresentation(image) { 
      //save profile image as NewUserID 
      UserDefaults.standard.set(data, forKey: String(UserID)) 
      UserDefaults.standard.synchronize() 
     } 
    } 
} 

이것은 카메라를 활성화하는보기 코드이며이보기는 위의 코드에서 popOverVC로 열립니다.

import UIKit 

    class imagerVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
     var UserID:Int = 0 
     @IBOutlet weak var myImageView: UIImageView! 
     var callback : ((UIImage) ->())? 

     @IBOutlet weak var btn_end: UIButton! 
     @IBOutlet weak var from_camera: UIBarButtonItem! 
     @IBOutlet weak var from_gallery: UIBarButtonItem! 

     @IBAction func btn_end_pressed(_ sender: UIButton) { 
      self.view.removeFromSuperview() 
     } 

     @IBAction func btn_closer(_ sender: UIButton) { 
      self.view.removeFromSuperview() 
     } 


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



     @IBAction func shootPhoto(_ sender: UIBarButtonItem) { 
      if UIImagePickerController.isSourceTypeAvailable(.camera) { 

       UserDefaults.standard.set(true, forKey: "is_selfie") 
       UserDefaults.standard.synchronize() 

       DispatchQueue.main.async { 
        self.picker.allowsEditing = false 
        self.picker.sourceType = UIImagePickerControllerSourceType.camera 
        self.picker.cameraCaptureMode = .photo 
        self.picker.modalPresentationStyle = .fullScreen 
        self.present(self.picker,animated: true,completion: nil) 
       } 

      } else { 
       noCamera() 
      }  
     } 


     let picker = UIImagePickerController() 

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

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 


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


      myImageView.layer.borderWidth = 1 
      myImageView.layer.masksToBounds = false 
      myImageView.layer.borderColor = UIColor.black.cgColor 
      myImageView.layer.cornerRadius = myImageView.frame.height/4 
      myImageView.clipsToBounds = true 

      callback?(chosenImage) 

      dismiss(animated:true, completion: nil) 
     } 

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

     func noCamera(){ 
      let alertVC = UIAlertController(
       title: "No Camera", 
       message: "Sorry, this device has no camera", 
       preferredStyle: .alert) 
      let okAction = UIAlertAction(
       title: "OK", 
       style:.default, 
       handler: nil) 
      alertVC.addAction(okAction) 
      present(
       alertVC, 
       animated: true, 
       completion: nil) 
     }  
} 

두 가지 문제점이 있습니다. 어쩌면 관련이 있을지도 모릅니다. 주된 문제는 카메라보기가로드되고 사진이 찍힌 후 단추 사용을 누르면 사진이 즉시 닫히지 않고 카메라보기가 사라질 때까지 약 1 분이 소요된다는 것입니다. 콜백 기능은 곧 "사진 사용"버튼이 눌러 지도록 트리거됩니다.

이 연결되어 있는지 확실하지 않다 그러나 나는 다음과 같은 경고를 얻을 : 인스턴스 방법 'imagePickerController가 (_ : didFinishPickingMediaWithInfo이 :)'내가 엑스 코드는 카메라 기능이 작동을 멈추기 저를 자동 수정 할 때 거의 아직 요구 사항과 일치합니다. DispatchQueue.main.async에서 는 주 스레드에서 실행할 수 있도록하지만 왜

확실하지 작동하지 않았다하지만 지연하지 않는

내가 이 기각 라인을 포장 시도 (무기 호 : 사실, 완료 애니메이션) 단지 아이폰 장치

렌더링 어떤 도움, 물리적 아이 패드에서 발생하는 매우이다

+0

imageTapped func는 어디에서 호출 되었습니까? 그것은 백그라운드 스레드에있을 수 있습니까? – Khanal

답변

-1

감사이 시뮬레이터에서 동작을 예상대로입니다. 기기에서 뒤쳐져서는 안되며 기기에서 작동한다고 말한대로 작동해야합니다. !!!

+0

동작이 물리적 장치에 있습니다. 3 iphone 6 –

+0

실제 전화에서 작동하지 않습니다. – Khanal

관련 문제