MediaPicker是iOS中的所有选择器
嗨,大家好。 今天,我有一份与在iOS应用程序中访问文件有关的工作。 因此,我在Google,堆栈溢出,中等博客等方面进行了研究。 我遇到了一个博客,该博客写了关于如何在相机中拍照或在iOS应用程序中访问图像的方法,然后阅读了。 我认为,如果我使用它来选择iPhone或iPad中的许多类型的文件,那也许很棒。 所以我写了这个模块,需要公开这些知识。 我们开始做吧!!!!
第1节:
通过使用名称“ MediaPicker.swift”在Xcode Project中创建文件。
第2部分:
声明的类名称为MediaPicker。
导入UIKit
导入MobileCoreServicesclass MediaPicker:NSObject {//继承NSObject}
第3部分:
按照名称“ MediaType”创建枚举,以用于要使用的文件的句柄类型以及您可以编写的基本类型,如下所示。
枚举MediaType {案例图片案例媒体案例全部}
第4节:
通过名称“ Constants”创建新的Struct,以用于定义每个事件或按钮的名称,并使用户易于理解。 在现实生活中,通过“常量”可以存储字符串,文本,措辞等……它的好处是您需要存储1值并在许多控制器中使用(假设值是“测试”)。 如果您不存储在“常量”中,则必须在许多控制器中编写“测试”,但是如果您像Thanos那样坚强,那就没关系了。
糟糕,要编辑此值吗? 你好吗? 您必须在编写的每个控制器中进行编辑。 你累了吗?
我一直强调自己,我必须在“常量”中写一个常量值。 好吧,加油!
该“常数”的价值如下。
struct常量{static let camera =“ Camera” static let gallery =“ Gallery” static let video =“ Video”静态let file =“ File”静态let cancel =“ Cancel”静态let documentTypes = [“ com.microsoft.word。 doc”,“ public.data”,“ org.openxmlformats.wordprocessingml.document”,kUTTypePDF作为字符串] //用于指定需要提取的类型}
第5节:
声明变量如下。
静态让共享:MediaPicker = MediaPicker()// Singleton Patternfileprivate var currentViewController:UIViewController! var imagePickerBlock:(((_ image:UIImage)-> Void)?var videoPickerBlock:((_ data:Data?)-> Void)?var filePickerBlock:((_ URL:URL)-> Void)?
imagePickerBlock →选择或捕获的图像完成后,将返回图像的值:UIImage
videoPickerBlock →当您在图库中选择视频完成时,它将返回数据值:Data
filePickerBlock →当您在iCloud,Google Drive,Dropbox等中选择文件时…完成后,它将返回url的值:URL
currentViewController →是用于存储当前viewController显示的变量,它将呈现UIImagePickerController或UIDocumentMenuViewController
第6节:
创建函数如下
- 相机 →在需要拍照时使用。
fileprivate func camera(){如果UIImagePickerController.isSourceTypeAvailable(.camera){让pickerController = UIImagePickerController()pickerController.delegate = self; pickerController.sourceType = .camera currentViewController.present(pickerController,动画:true,完成:nil)}}
2. PhotoLibrary→用于需要访问图库中的图片时使用。
fileprivate func photoLibrary(){如果UIImagePickerController.isSourceTypeAvailable(.photoLibrary){让pickerController = UIImagePickerController()pickerController.delegate = self; pickerController.sourceType = .photoLibrary currentViewController.present(pickerController,动画:true,完成:nil)}}
3. 视频 →用于需要访问图库中的视频时使用。
fileprivate func video(){如果UIImagePickerController.isSourceTypeAvailable(.photoLibrary){让pickerController = UIImagePickerController()pickerController.delegate = self pickerController.sourceType = .photoLibrary pickerController.mediaTypes = [kUTTypeMovie as String,kUTTypeVideo as String] currentViewController.present(picker ,动画:true,完成:nil)}}
4. 文件 →用于需要从iCloud,Google云端硬盘,Dropbox等显示或发送文件时使用…,您可以按照我的指示进行操作。
4.1 转到Xcode中的Targets Project文件。
4.2 选择功能。
4.3 开启iCloud。
这很容易!!!
不要为了得到这个功能。
fileprivate func file(){让importMenuViewController = UIDocumentMenuViewController(documentTypes:Constants.documentTypes,in:.import)importMenuViewController.delegate = self importMenuViewController.modalPresentationStyle = .formSheet currentViewController.present(importMenuViewController,动画:true,完成:无)}
第6节:
创建ActionSheet函数以选择所需的文件。
func showActionSheet(viewController:UIViewController,type:MediaType){currentViewController = viewController let actionSheet = UIAlertController(title:nil,message:nil,preferredStyle:.actionSheet)let camera = UIAlertAction(title:Constants.camera,style:.default,handler :{(动作)-> self.camera()中的空隙()))let gallery = UIAlertAction(标题:Constants.gallery,style:.default,handler:{(动作)-> self.photoLibrary()中的空隙video = UIAlertAction(title:Constants.video,style:.default,handler:{(action)-> self.video()中的Void))
let file = UIAlertAction(title:Constants.file,style:.default,handler:{(action)-> self.file()中的Void))let cancel = UIAlertAction(title:Constants.cancel,style:.cancel,handler :nil)actionSheet.addAction(camera)actionSheet.addAction(gallery)如果type == .media {actionSheet.addAction(video)}否则,如果type == .all {actionSheet.addAction(video)actionSheet.addAction(file)} actionSheet.addAction(cancel)viewController.present(actionSheet,动画:true,完成:nil)}
通过此功能,您必须输入两个参数。
viewController →是您当前的viewController。
类型 →是枚举“ MediaType”,您必须按照需要选择类型
currentViewController的此功能将显示一个根据您指定的类型的操作表。
。 图片 →仅显示相机和图库。
。 media →将根据.image显示并增加视频类型。
。 全部 →将在模块中显示全部。
第7节:
实施从图库中拾取图像的协议,并从相机拍摄照片。
( UIImagePickerControllerDelegate,UINavigationControllerDelegate )。
扩展 MediaPicker:UIImagePickerControllerDelegate,UINavigationControllerDelegate { func imagePickerControllerDidCancel(_ picker:UIImagePickerController){currentViewController.dismiss(animated:true,completion: nil )} func imagePickerController(_ picker:UIImagePickerController,didFinishPickingMediaWithInfo信息:[:String =信息[UIImagePickerControllerOriginalImage] 为 ? UIImage {imagePickerBlock?(image)//如果不为null则返回图像} 否则 {print(“出问题了”)} 如果 让 videoUrl = info [UIImagePickerControllerMediaType] 为 ? 网址{ 让数据= 尝试 ? Data(contentsOf:videoUrl)videoPickerBlock?(data)//返回不为null时的视频URL} else {print(“出问题的地方”)} currentViewController.dismiss(动画:true,完成: nil )}}
第8节:
在iPhone,iPad的每个驱动器中实现Pick文件的协议。
(UIDocumentMenuDelegate,UIDocumentPickerDelegate)
扩展名 MediaPicker:UIDocumentMenuDelegate,UIDocumentPickerDelegate { func documentMenu(_ documentMenu:UIDocumentMenuViewController,didPickDocumentPicker documentPicker:UIDocumentPickerViewController){documentPicker.delegate = self currentViewController.present(documentPicker,动画:true,完成: nil )} func documentPicker(_ controller,didDocumentPickerDelegate url:URL){filePickerBlock?(url)//返回文件url(如果从驱动器中选择)。 } func documentMenuWasCancelled(_ documentMenu:UIDocumentMenuViewController){currentViewController.dismiss(动画:true,完成: nil )}}
第9节:
最后一步,您必须在Xcode项目中打开info.plist。 通过如下写出规定值
- 键 →隐私–相机使用说明, 值 →$(PRODUCT_NAME)相机使用。
- 键 →隐私–照片库使用说明, 值 →$(PRODUCT_NAME)照片使用。
第10节:
如何使用。
MockupViewController类:UIViewController {
私人var图片:UIImage?
私人var视频:数据?
私有var文件:URL? 覆盖基金viewDidLoad(){super.viewDidLoad()
MediaPicker.shared.showActionSheet(viewController:self,type:.all)//接收图像
MediaPicker.shared.imagePickerBlock = {(image)-> Void in
self.image = image} //接收视频
MediaPicker.shared.videoPickerBlock = {(视频)->无效
self.video = video} //接收文件
MediaPicker.shared.filePickerBlock = {(文件)-> self.file =文件中的空隙
}}
}
太神奇了,太简单了!
我希望这个博客对那些想研究如何在iOS应用程序中访问文件的人有用。 如果您喜欢此博客,则可以为我鼓掌并分享此博客。
享受编码。