iOS 小知识7
Photos type 记录
获取相册数据时,媒体类型以及子类型记录
PHAssetCollectionType
enum PHAssetCollectionType : Int {
case Album //从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
case SmartAlbum //经由相机得来的相册
case Moment //Photos 为我们自动生成的时间分组的相册
}
PHAssetCollectionSubtype
enum PHAssetCollectionSubtype : Int {
case AlbumRegular //用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
case AlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
case AlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
case AlbumSyncedAlbum //做了 AlbumSyncedEvent 应该做的事
case AlbumImported //从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
case AlbumMyPhotoStream //用户的 iCloud 照片流
case AlbumCloudShared //用户使用 iCloud 共享的相册
case SmartAlbumGeneric //文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
case SmartAlbumPanoramas //相机拍摄的全景照片
case SmartAlbumVideos //相机拍摄的视频
case SmartAlbumFavorites //收藏文件夹
case SmartAlbumTimelapses //延时视频文件夹,同时也会出现在视频文件夹中
case SmartAlbumAllHidden //包含隐藏照片或视频的文件夹
case SmartAlbumRecentlyAdded //相机近期拍摄的照片或视频
case SmartAlbumBursts //连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
case SmartAlbumSlomoVideos //Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
case SmartAlbumUserLibrary //这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
case Any //包含所有类型
PHCollectionListType
typedef NS_ENUM(NSInteger, PHCollectionListType) {
PHCollectionListTypeMomentList = 1, // 包含了PHAssetCollectionTypeMoment类型的资源集合的列表
PHCollectionListTypeFolder = 2, // 包含了PHAssetCollectionTypeAlbum类型或PHAssetCollectionTypeSmartAlbum类型的资源集合的列表
PHCollectionListTypeSmartFolder = 3, // 同步到设备的智能文件夹的列表
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
PHCollectionListSubtype
typedef NS_ENUM(NSInteger, PHCollectionListSubtype) {
// PHCollectionListTypeMomentList的子类型
PHCollectionListSubtypeMomentListCluster = 1, // 时刻
PHCollectionListSubtypeMomentListYear = 2, // 年度
// PHCollectionListTypeFolder的子类型
PHCollectionListSubtypeRegularFolder = 100, // 包含了其他文件夹或者相簿的文件夹
// PHCollectionListTypeSmartFolder的子类型
PHCollectionListSubtypeSmartFolderEvents = 200, // 包含了一个或多个从iPhone同步的事件的智能文件夹
PHCollectionListSubtypeSmartFolderFaces = 201, // 包含了一个或多个从iPhone同步的面孔(人物)的智能文件夹
// 如果你不关心子类型是什么,则使用下面这个
PHCollectionListSubtypeAny = NSIntegerMax
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
PHCollectionEditOperation
typedef NS_ENUM(NSInteger, PHCollectionEditOperation) {
PHCollectionEditOperationDeleteContent = 1, // 删除集合中包含的内容,删除的东西会永久的从照片库中删除
PHCollectionEditOperationRemoveContent = 2, // 移除集合中包含的内容,但移除的东西不会从照片库中删除
PHCollectionEditOperationAddContent = 3, // 从其他的集合中添加内容
PHCollectionEditOperationCreateContent = 4, // 创建新的内容或者从其他的容器中复制内容到这个容器中
PHCollectionEditOperationRearrangeContent = 5, // 改变内容的顺序
PHCollectionEditOperationDelete = 6, // 删除容器但不删除内容
PHCollectionEditOperationRename = 7, // 重命名容器的名字
} PHOTOS_AVAILABLE_IOS_TVOS(8_0, 10_0);
PHAssetCollectionType
enum PHAssetCollectionType : Int {
case Album //从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
case SmartAlbum //经由相机得来的相册
case Moment //Photos 为我们自动生成的时间分组的相册
}
PHAssetCollectionSubtype
enum PHAssetCollectionSubtype : Int {
case AlbumRegular //用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
case AlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
case AlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
case AlbumSyncedAlbum //做了 AlbumSyncedEvent 应该做的事
case AlbumImported //从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
case AlbumMyPhotoStream //用户的 iCloud 照片流
case AlbumCloudShared //用户使用 iCloud 共享的相册
case SmartAlbumGeneric //文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
case SmartAlbumPanoramas //相机拍摄的全景照片
case SmartAlbumVideos //相机拍摄的视频
case SmartAlbumFavorites //收藏文件夹
case SmartAlbumTimelapses //延时视频文件夹,同时也会出现在视频文件夹中
case SmartAlbumAllHidden //包含隐藏照片或视频的文件夹
case SmartAlbumRecentlyAdded //相机近期拍摄的照片或视频
case SmartAlbumBursts //连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
case SmartAlbumSlomoVideos //Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
case SmartAlbumUserLibrary //这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
case Any //包含所有类型
}
PHAssetBurstSelectionType 连拍属性
swift switch 中 case 呼不出来
记得 switch 的对象,一定要是解包的,最好加上 !
,就可以呼出来了
图片浏览器中的图片显示的时候会有一个往下掉的动作
今天在看图片浏览器的时候,发现图片和视频都会在 iPhone X 上出现下掉的动画,很奇怪,
系统会有提示信息,但是不是崩溃的信息,如下:
he behavior of the UICollectionViewFlowLayout is not defined because:
the item width must be less than the width of the UICollectionView minus the section insets left and right values, minus the content insets left and right Example[16070:269647] The relevant UICollectionViewFlowLayout instance is , and it is attached to ; animations = { position=; bounds.origin=; bounds.size=; }; layer = ; contentOffset: {0, 0}; contentSize: {1024, 770}> collection view layout: .
只有在 iPhone X上出现了,解决办法也很奇葩,居然是注释掉这段代码
if #available(iOS 11.0, *) {
let top = self.view.safeAreaInsets.top
let bottom = self.view.safeAreaInsets.bottom
collectionView.frame.size.height -= bottom
collectionView.frame.origin.y = top
}
转场动画
https://github.com/seedante/iOS-Note/wiki/ViewController-Transition
minimumLineSpacing 的坑
今天在做自定义 MediaBrowser
的时候,排版一直排不好,因为我用了多个 Section
,导致了一个问题就是 我设置了 flowLayout
的 minimumLineSpacing
,这个参数只会在 同一个 Section
里面的时候,才会生效,在不同的 Section
之间的时候,是 没有这个 space
的,导致了两个 Section
连接的两张图是紧挨在一起的,找了半天才找到这个问题,我们需要给这个 CollectionView
设置 Section
Header,并且要在代理方法里面设置,因为如果我们直接在 flowLayout
设置的话,第 0 个 Section
也会有空隙,这个是我们不需要的,因此需要在代理方法里面设置这个值,如下:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if section == 0 {
return CGSize.zero
}
return CGSize.init(width: 30, height: view.bounds.size.height)
}
两个 collectionView 联动的时候,滑动的坑
我们在做一个图片或者视频浏览器的时候,都会碰到这样的情况,我们需要两个 CollectionView ,一个是 grid 显示的,一个是 preview 的;当我们在 preview 中滑动的时候,为了达到可以下滑返回到 grid 界面的目的(类似 Apple 相册或者是 WeChat 那样的效果),必须让我们在 preview 和 gird 界面显示同步,也就是 grid 界面显示的内容一定也是跟着 preview 界面显示的内容移动的,因此我们需要设置一个代理,在 preview 界面做如下操作:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let cell = collectionView.visibleCells.first
let scrollIndexPath = collectionView.indexPath(for: cell!)!
mediaBrowserDelegate?.mediaBrowser(self, didScrollAt: scrollIndexPath)
}
在 grid 界面实现代理方法:
func mediaBrowser(_ mediaBrowser: MediaBrowserViewController, didScrollAt indexPath: IndexPath) {
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.centeredVertically, animated: false)
}