美文网首页
iOS 小知识7

iOS 小知识7

作者: AppleTTT | 来源:发表于2018-05-23 15:51 被阅读37次

    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,导致了一个问题就是 我设置了 flowLayoutminimumLineSpacing,这个参数只会在 同一个 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)
    }
    

    相关文章

      网友评论

          本文标题:iOS 小知识7

          本文链接:https://www.haomeiwen.com/subject/ofwrjftx.html