2016-10-01 5 views
1

Как сделать снимок с помощью камеры или выбрать изображение из библиотеки фотографий, чтобы можно было отображать его в изображении? Например, например?Как загрузить изображение из камеры или библиотеки фотографий в Swift

Любая помощь по этому вопросу будет оценена по достоинству.

+0

Я отправил ответ для вас, но вы получаете все downvotes, потому что это не сайт для «кода для вас». вы должны предоставить код, и мы помогаем вам находить ошибки и улучшать ваш код. поэтому в следующий раз попробуйте решения Google и получите помощь, если вы застрянете. пока: я опубликовал полностью функциональный вариант для вас. получайте удовольствие –

+0

Я понимаю, что для меня это не место для людей, я просто прошу указать какие-то указания относительно того, где я могу начать. Я не ожидаю, что кто-нибудь напишет это для меня, хотя я ценю ваш ответ. –

+1

Я не хотел обидеть вас или что-то в этом роде. просто хотел сказать вам, почему вы все проголосовали. у меня есть надпись, так что это будет не так уж плохо, и если моя работа поможет вам, я буду рад ответить на ваш вопрос, чтобы вы могли это проверить. если вам нужна дополнительная помощь, просто дайте мне знать. –

ответ

19

Я использую следующие для Swift 3

// 
// DSCameraHandler.swift 
// 
// Created by David Seek on 23.04.17. 
// Copyright © 2016 David Seek. All rights reserved. 
// 

import MobileCoreServices 
import UIKit 

class DSCameraHandler: NSObject { 

    private let imagePicker = UIImagePickerController() 
    private let isPhotoLibraryAvailable = UIImagePickerController.isSourceTypeAvailable(.photoLibrary) 
    private let isSavedPhotoAlbumAvailable = UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) 
    private let isCameraAvailable = UIImagePickerController.isSourceTypeAvailable(.camera) 
    private let isRearCameraAvailable = UIImagePickerController.isCameraDeviceAvailable(.rear) 
    private let isFrontCameraAvailable = UIImagePickerController.isCameraDeviceAvailable(.front) 
    private let sourceTypeCamera = UIImagePickerControllerSourceType.camera 
    private let rearCamera = UIImagePickerControllerCameraDevice.rear 
    private let frontCamera = UIImagePickerControllerCameraDevice.front 

    var delegate: UINavigationControllerDelegate & UIImagePickerControllerDelegate 
    init(delegate_: UINavigationControllerDelegate & UIImagePickerControllerDelegate) { 
     delegate = delegate_ 
    } 

    func getPhotoLibraryOn(_ onVC: UIViewController, canEdit: Bool) { 

     if !isPhotoLibraryAvailable && !isSavedPhotoAlbumAvailable { return } 
     let type = kUTTypeImage as String 

     if isPhotoLibraryAvailable { 
      imagePicker.sourceType = .photoLibrary 
      if let availableTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) { 
       if availableTypes.contains(type) { 
        imagePicker.mediaTypes = [type] 
        imagePicker.allowsEditing = canEdit 
       } 
      } 
     } else if isPhotoLibraryAvailable { 
      imagePicker.sourceType = .savedPhotosAlbum 
      if let availableTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum) { 
       if availableTypes.contains(type) { 
        imagePicker.mediaTypes = [type] 
       } 
      } 
     } else { 
      return 
     } 

     imagePicker.allowsEditing = canEdit 
     imagePicker.delegate = delegate 
     onVC.present(imagePicker, animated: true, completion: nil) 
    } 

    func getCameraOn(_ onVC: UIViewController, canEdit: Bool) { 

     if !isCameraAvailable { return } 
     let type1 = kUTTypeImage as String 

     if isCameraAvailable { 
      if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) { 
       if availableTypes.contains(type1) { 
        imagePicker.mediaTypes = [type1] 
        imagePicker.sourceType = sourceTypeCamera 
       } 
      } 

      if isRearCameraAvailable { 
       imagePicker.cameraDevice = rearCamera 
      } else if isFrontCameraAvailable { 
       imagePicker.cameraDevice = frontCamera 
      } 
     } else { 
      return 
     } 

     imagePicker.allowsEditing = canEdit 
     imagePicker.showsCameraControls = true 
     imagePicker.delegate = delegate 
     onVC.present(imagePicker, animated: true, completion: nil) 
    } 
} 

Вызывается в нужной ViewController по:

extension ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { 

    func thisIsTheFunctionWeAreCalling() { 
     let camera = DSCameraHandler(delegate_: self) 
     let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 
     optionMenu.popoverPresentationController?.sourceView = self.view 

     let takePhoto = UIAlertAction(title: "Take Photo", style: .default) { (alert : UIAlertAction!) in 
      camera.getCameraOn(self, canEdit: true) 
     } 
     let sharePhoto = UIAlertAction(title: "Photo Library", style: .default) { (alert : UIAlertAction!) in 
      camera.getPhotoLibraryOn(self, canEdit: true) 
     } 
     let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (alert : UIAlertAction!) in 
     } 
     optionMenu.addAction(takePhoto) 
     optionMenu.addAction(sharePhoto) 
     optionMenu.addAction(cancelAction) 
     self.present(optionMenu, animated: true, completion: nil) 
    } 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

     let image = info[UIImagePickerControllerEditedImage] as! UIImage 

     // image is our desired image 

     picker.dismiss(animated: true, completion: nil) 
    } 
} 
+1

Хороший ответ David thx для обмена – Drew

+0

уверенный помощник, добро пожаловать –

+0

Ваш код работал нормально, за исключением случаев, когда загрузка из библиотеки с помощью canEdit: false, когда я выбираю изображение, которое он просто сбой –

Смежные вопросы