当前位置: 首页 > news >正文

深圳做网站多少费用免费设计logo的工具

深圳做网站多少费用,免费设计logo的工具,微信网页开发教程,wordpress留言页引言 在iOS开发中#xff0c;系统已经为我们提供了多种便捷的媒体资源选择方式#xff0c;如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好#xff0c;而且我们完全不需要担心性能和稳定性问题#xff0c;因为它们是由系统提供的系统已经为我们提供了多种便捷的媒体资源选择方式如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好而且我们完全不需要担心性能和稳定性问题因为它们是由系统提供的经过充分测试和优化。 然而在实际开发过程中为了使我们的APP更加独特界面更加新颖设计团队往往会提出个性化的媒体资源选择页面的需求。这时候我们就需要放弃系统提供的方案转而创建自定义的媒体资源选择器。本文将介绍如何使用Photos框架来自定义媒体资源选择器以满足特定的设计和功能需求。 AssetsLibrary - Photos 在iOS 8之前开发者主要使用AssetsLibrary框架来访问和管理用户的照片和视频。然而从iOS 8开始Apple引入了全新的Photos框架并逐步弃用AssetsLibrary。 自iOS 9起AssetsLibrary被正式标记为弃用Apple强烈建议开发者迁移到Photos框架。Photos框架不仅提供了更高效的性能和更丰富的功能还为开发者提供了更强大的工具来管理和操作用户的媒体资源。 通过Photos框架开发者可以更轻松地获取媒体元数据、编辑照片、创建自定义相册以及实现更多自定义功能。这一过渡标志着iOS媒体管理能力的重大提升为开发者提供了更广泛的可能性和更强大的控制力。 下面我们就使用Photos框架来创建一个初级的媒体资源选择器之后的博客中我们再不停的来完善它的功能。 创建媒体选择器 我打算把它分成数据和UI两部分来实现这个媒体选择器本篇博客我们就先从数据部分说起。 媒体数据读取 1.创建配置信息 在媒体资源读取时有很多数据我们可以进行任意配置比如读取的媒体类型、读取的视频最大时长、获取缩略图尺寸图片缓存个数等等为此我们创建了一个名为PHMediaConfig的类代码如下 import UIKit import Photosenum PHMediaType {/// 图片case image/// 视频case video/// 图片和视频case all }class PHMediaConfig: NSObject {/// 获取资源类型默认视频和图片var mediaType: PHMediaType .all/// 缩略图缓存数量var thumbnailCacheCount: Int 40/// 大图缓存数量var originalImageCacheCount: Int 10/// 获取视频的时长最大值var videoMaxDuration: TimeInterval 60/// 是否直接加载原图var isLoadOriginalImage: Bool false/// 可选图片最大数量var maxSelectedImageCount: Int 9/// 缩略图尺寸var thumbnailSize: CGSize CGSize(width: 200, height: 200)}里定义了很多配置信息并且也都设置了初始值。 2.创建媒体资源管理类 创建一个继承自NSObjct名为PHMediaManager的类用来读取媒体资源数据获取缩略原图等等一切和数据相关的内容并通过初始化方法传入配置信息代码如下 class PHMediaManager: NSObject {/// 缩略图缓存private var thumbnailCache NSCacheNSString, UIImage()/// 原图缓存private var originalImageCache NSCacheNSString, UIImage()/// 配置private var config: PHMediaConfig!init(config: PHMediaConfig PHMediaConfig()) {super.init()self.config configthumbnailCache.countLimit config.thumbnailCacheCountoriginalImageCache.countLimit config.originalImageCacheCount}.... } 除此之外我们还定义了两个缓存表稍后的代码中会使用到它们。 3.获取媒体库权限 苹果对隐私权限的申请非常重视所以在获取媒体资源前一定要检查权限和申请权限并给用户友好的提示包括infoplist文件内的文案也需要认真填写表明申请权限的用途。 检查和申请权限的代码如下 /// 查看相册权限func checkPhotoLibraryAuthorization() - Bool {let status PHPhotoLibrary.authorizationStatus()if status .authorized {return true} else {return false}}/// 查看并获取相册权限/// - Parameter completion: 回调func requestPhotoLibraryAuthorization(completion: escaping (Bool) - Void) {PHPhotoLibrary.requestAuthorization { status inif status .authorized {print(获取相册权限成功)completion(true)} else {print(获取相册权限失败)completion(false)}}}4.获取媒体资源 权限申请通过后就可以开始获取媒体资源了这时候有两个方案可以供我们选择 方案一在读取资源时通过PHAsset直接读取缩略图构建模型数组。 如果采用方案1的话在渲染列表时我们就可以直接使用UIImage进行渲染页面反应很快用户体验会很好。 但是呢预先加载所有的缩略图这样会占用很大的内存尤其是相册资源比较多的情况甚至可能会导致崩溃这样的话我们就需要手动控制一次加载资源的数量。 方案二在读取资源时只保存PHAsset。 这个方案呢我们到不需要考虑内存的问题因为只有在现实的时候才会加载缩略图显示完成之后就会自动被释放但是这就会有新的问题每次图片都是重新加载可能会使得页面不流畅影响用户体验。这样的话我们就需要自己来创建和管理缓存来提升用户体验。 我们来采取方案二 自定义缓存的方式来读取媒体资源这样的话我们的数据模型只需要保存PHAsset就可以了我们先来看一下自定义数据模型的代码 import UIKit import Photosclass PHMediaModel: NSObject {/// 资源var asset: PHAsset?/// 是否选中var isSelected: Bool false/// 资源标识var identifier: String?/// 类型var mediaType: PHAssetMediaType {get {return asset?.mediaType ?? .unknown}}/// 视频时长var videoDuration: TimeInterval {get {return asset?.duration ?? 0}} }除了PHAsset以外还定义了一些选中状态已经视频时长等数据稍后我们会使用到它们。 下面就开始读取媒体资源数据构建自定义数据模型 /// 获取相册资源/// - Parameters:func fetchLocalAlbums(completion: escaping ([PHMediaModel]) - Void) {self.fetchLocalAlbums(type: config.mediaType, completion: completion)}/// 获取本地相册资源/// - Parameters:/// - type: 类型/// - completion: 回调private func fetchLocalAlbums(type: PHMediaType, completion: escaping ([PHMediaModel]) - Void) {let options PHFetchOptions()options.sortDescriptors [NSSortDescriptor(key: creationDate, ascending: false)]if type .image {options.predicate NSPredicate(format: mediaType %d, PHAssetMediaType.image.rawValue)} else if type .video {options.predicate NSPredicate(format: mediaType %d, PHAssetMediaType.video.rawValue)} else {options.predicate NSPredicate(format: mediaType %d || mediaType %d, PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)}let fetchResult PHAsset.fetchAssets(with: options)var assets [PHMediaModel]()fetchResult.enumerateObjects { asset, index, stop inif asset.mediaType .image {let model PHMediaModel()model.asset assetmodel.identifier asset.localIdentifierassets.append(model)} else if asset.mediaType .video {if asset.duration self.config.videoMaxDuration {let model PHMediaModel()model.asset assetmodel.identifier asset.localIdentifierassets.append(model)}}}completion(assets)}通常情况下我们只关心图片类型和视频类型的数据并且根据视频的时长还进行了进一步的过滤。 5.获取资源缩略图 另外我们还单独定义了一个读取资源缩略图的方法并且在这个方法里面使用了缩略图缓存代码如下 /// 获取缩略图/// - Parameters:/// - asset: 资源/// - size: 尺寸/// - completion: 回调func fetchThumbnail(asset: PHAsset, size: CGSize? nil, completion: escaping (UIImage?) - Void) {if let size size {config.thumbnailSize size}let key asset.localIdentifier as NSStringif let image thumbnailCache.object(forKey: key) {completion(image)} else {let options PHImageRequestOptions()options.isSynchronous falseoptions.resizeMode .fastoptions.deliveryMode .opportunisticoptions.isNetworkAccessAllowed truePHImageManager.default().requestImage(for: asset, targetSize: config.thumbnailSize, contentMode: .aspectFill, options: options) { image, info inif let image image {self.thumbnailCache.setObject(image, forKey: key)completion(image)} else {completion(nil)}}}}6.获取图片资源原图 除了缩略图之外还需要读取图片原图用来图片单张预览代码如下 /// 获取原图/// - Parameters:/// - asset: 资源/// - completion: 回调func fetchOriginalImage(asset: PHAsset, completion: escaping (UIImage?) - Void) {let key asset.localIdentifier as NSStringif let image originalImageCache.object(forKey: key) {completion(image)} else {let options PHImageRequestOptions()options.isSynchronous falseoptions.resizeMode .fastoptions.deliveryMode .opportunisticoptions.isNetworkAccessAllowed truePHImageManager.default().requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFill, options: options) { image, info inif let image image {self.originalImageCache.setObject(image, forKey: key)completion(image)} else {completion(nil)}}}}7.获取视频原数据 获取完图片数据视频也需要原始的预览数据毕竟我们上传时不能只上传一个缩略图代码如下 /// 获取视频原数据/// - Parameters:/// - asset: 资源/// - completion: 回调func fetchVideoData(asset: PHAsset, completion: escaping (Data?) - Void) {let options PHVideoRequestOptions()options.isNetworkAccessAllowed truePHImageManager.default().requestAVAsset(forVideo: asset, options: options) { avAsset, audioMix, info inif let urlAsset avAsset as? AVURLAsset {do {let data try Data(contentsOf: urlAsset.url)completion(data)} catch {completion(nil)}} else {completion(nil)}}}结语 我们从自定义个媒体选择器入手来探讨一些Photos框架的用法本篇博客我们主要介绍了使用Photos获取相册权限读取媒体数据以及如何配置读取的数据参数。 下一篇博客我们将开始使用这些数据来构建一个媒体资源选择器的UI页面。
http://www.dnsts.com.cn/news/43137.html

相关文章:

  • 网站型跟商城型关于教育网站的策划书
  • 郑州关键词网站优化排名2个wordpress
  • 杭州网站设计渠道软件开发实例
  • 素材下载网站源码wordpress 相册形式
  • 机械加工类网站wordpress阅读数 显示k
  • 广州网站制作知名 乐云践新做网站比特币钱包
  • 期货网站做模拟百度优化点击软件
  • 手机端网站设计北京未来广告公司
  • 网站怎么做最省钱广州专业网站制作平台
  • php做网站安性如何大连网站开发
  • 利用cms怎么做网站wordpress增加登陆注册
  • 定制微信网站oppo应用商店下载官方app
  • 纸做的花朵成品网站蛇口网站建设
  • 秦皇岛哪里做网站服务器在国外的网站
  • 衡水市网站建设网站策划内容有哪些
  • 域名备案查询网站做网站职校选什么专业
  • 网站制作器保定模板建站定制网站
  • 在哪找专业做淘宝网站简单网站建设设计
  • 旅游预定型网站建设甘肃省城乡与住房建设厅网站
  • 基于php的网站开发流程wordpress mip插件
  • 新的网站建设技术软文广告是什么
  • 如何推广网站方法网站流量数据分析
  • 小企业如何优化网站建设中国画廊企业网站模板
  • 总公司网站备案后 分公司网站还需要备案吗域名与网站
  • 网站开发与设计 信科建设公司企业使命
  • 商城网站是免费开吗电子商务系统 网站建设
  • 十大免费音乐网站电子商务门户网站的研究与实现
  • 华强北电子网站建设外包做网站要十几万
  • 如何构建一个电子商务网站网站建设的主要结构
  • 域名是com好还是cn好seo实战培训学校