Доступ к приложению «Фото» для совместного использования / редактирования - PullRequest
0 голосов
/ 12 декабря 2018

Я делаю фото приложение, которое делает фотографии и сохраняет их в фотобиблиотеке.Я хотел бы, чтобы пользователь мог заходить в библиотеку фотографий с целью обмена / редактирования / удаления фотографий, как в реальном приложении камеры.Чтобы уточнить, я не хочу получить доступ к средству выбора изображений, чтобы выбрать изображение, а затем загрузить его обратно в мое приложение.Я хочу открыть собственное приложение для фотографий из своего приложения, чтобы пользователь мог там что-то делать, используя существующие встроенные функции приложения для фотографий.Это возможно?Кажется, он работает в стандартном приложении Apple для камер, но я не видел его больше нигде.Кажется, я ничего не могу найти по этому поводу, потому что, когда я в Google, я постоянно получаю информацию о средстве выбора изображений.

Сейчас самое лучшее, что у меня есть, это следующее, но вы покидаете мое приложение

UIApplication.shared.open(URL(string:"photos-redirect://")!)

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете реализовать

UIActivityViewController

Система предоставляет несколько стандартных сервисов, таких как копирование элементов в монтажную панель, размещение контента на сайтах социальных сетей, отправка элементовпо электронной почте или SMS и многое другое.Приложения также могут определять пользовательские службы.

https://developer.apple.com/documentation/uikit/uiactivityviewcontroller
0 голосов
/ 12 декабря 2018

Создайте новый файл swift, например Camera.swift, и скопируйте в него этот код.

Примечание. Вы должны добавить разрешение на конфиденциальность в ваш info.plist.

enter image description here

import Foundation
import MobileCoreServices
import UIKit
import CoreLocation

class Camera {
    var delegate: UIImagePickerControllerDelegate & UINavigationControllerDelegate

    init(source: UIImagePickerControllerDelegate & UINavigationControllerDelegate) {
        delegate = source
    }

    func PresentPhotoInput(target: UIViewController, canEdit: Bool = false) {

        let picker = UIAlertController(title: "Select Photo Source", message: "Would you like to take a new photo or add one from your photo library?", preferredStyle: UIAlertControllerStyle.actionSheet)

        picker.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.default, handler: { (action) in
            self.PresentMultyCamera(target: target, canEdit: canEdit)
        }))

        picker.addAction(UIAlertAction(title: "Photo Library", style: UIAlertActionStyle.default, handler: { (action) in
            self.PresentPhotoLibrary(target: target, canEdit: canEdit)
        }))

        picker.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.destructive, handler: { (action) in
            // foo
        }))

        target.present(picker, animated: true)

    }

    func PresentPhotoLibrary(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) && !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.savedPhotosAlbum) {
            return
        }

        let type = kUTTypeImage as String
        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            imagePicker.sourceType = .photoLibrary

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) {
                if (availableTypes as NSArray).contains(type) {
                    /* Set up defaults */
                    imagePicker.mediaTypes = [type]
                    imagePicker.allowsEditing = canEdit
                }
            }
        } else if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            imagePicker.sourceType = .savedPhotosAlbum

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum) {
                if (availableTypes as NSArray).contains(type) {
                    imagePicker.mediaTypes = [type]
                }
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil) // presents the imagepicker to the user

        return
    }

    func PresentMultyCamera(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
            return
        }

        let type1 = kUTTypeImage as String
        //let type2 = kUTTypeMovie as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {
                if (availableTypes as NSArray).contains(type1) {
                    imagePicker.mediaTypes = [type1/*, type2*/]
                    imagePicker.sourceType = UIImagePickerControllerSourceType.camera
                    imagePicker.showsCameraControls = true
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear
            } else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front
            }
        } else {
            // show alert, no camera available
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil) // presents the imagepicker to the user
    }

    func PresentPhotoCamera(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
            return
        }

        let type1 = kUTTypeImage as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {
                if (availableTypes as NSArray).contains(type1) {
                    imagePicker.mediaTypes = [type1]
                    imagePicker.sourceType = UIImagePickerControllerSourceType.camera
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear
            } else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front
            }
        } else {
            // show alert, no camera available
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        App.shared.isAuthenticating = true
        target.present(imagePicker, animated: true, completion: nil) // presents the imagepicker to the user
    }

    // Video Camera
    func PresentVideoCamera(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
            return
        }

        let type1 = kUTTypeMovie as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {
                if (availableTypes as NSArray).contains(type1) {
                    imagePicker.mediaTypes = [type1]
                    imagePicker.sourceType = UIImagePickerControllerSourceType.camera
                    imagePicker.videoMaximumDuration = 15.0
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear
            } else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front
            }
        } else {
            // show alert, no camera available
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil) // presents the imagepicker to the user
    }

    // video library
    func PresentVideoLibrary(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) && !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.savedPhotosAlbum) {
            return
        }

        let type = kUTTypeMovie as String
        let imagePicker = UIImagePickerController()

        imagePicker.videoMaximumDuration = 15.0

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            imagePicker.sourceType = .photoLibrary

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) {
                if (availableTypes as NSArray).contains(type) {
                    /* Set up defaults */
                    imagePicker.mediaTypes = [type]
                    imagePicker.allowsEditing = canEdit
                }
            }
        } else if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            imagePicker.sourceType = .savedPhotosAlbum

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum) {
                if (availableTypes as NSArray).contains(type) {
                    imagePicker.mediaTypes = [type]
                }
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil) // presents the imagepicker to the user

        return
    }
}

Теперь вы можете использовать этот класс для доступа к библиотеке фотографий.Пример приведен ниже.

import Foundation
import UIKit

class Example: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func some_action() {
        let camera = Camera(source: self)

        camera.PresentPhotoInput(target: self)

        //camera.PresentPhotoCamera(target: self, canEdit: false)

    }

    // MARK: - Image Picker Delegate Function

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


        if picker.sourceType == .photoLibrary {

            if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
                // do something
            } else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                // do something
            }

            picker.dismiss(animated: true, completion: nil)
        } else if picker.sourceType == .camera {

            // do something

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

}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...