앱을 사용하면 사용자가 자신의 이미지를 추가 할 수 있습니다. 이를 위해 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에서 는 주 스레드에서 실행할 수 있도록하지만 왜
확실하지 작동하지 않았다하지만 지연하지 않는
내가 이 기각 라인을 포장 시도 (무기 호 : 사실, 완료 애니메이션) 단지 아이폰 장치렌더링 어떤 도움, 물리적 아이 패드에서 발생하는 매우이다
imageTapped func는 어디에서 호출 되었습니까? 그것은 백그라운드 스레드에있을 수 있습니까? – Khanal