南鑫林 5 yıl önce
ebeveyn
işleme
b835857f19

+ 267 - 0
RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliPlayerManager/AliPlayerManager.swift

@@ -0,0 +1,267 @@
+//
+//  AliPlayerManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/26.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+
+
+class AliPlayerManager: NSObject {
+    
+    deinit {
+        NXLLog("deinit")
+    }
+    
+    static let shared : AliPlayerManager = AliPlayerManager()
+    
+//=============================音频=============================================
+    
+    typealias StartPlayClosure = (() -> Void)?
+    var startPlayClosure : StartPlayClosure?
+    
+    lazy var audioPlayer: AliPlayer = {
+        let audioPlayer = AliPlayer()
+        audioPlayer?.delegate = self
+        return audioPlayer!
+    }()
+    
+//=============================视频===========================================
+    
+    lazy var videoPlayer: AliPlayer = {
+        let videoPlayer = AliPlayer()
+        videoPlayer?.delegate = self
+        return videoPlayer!
+    }()
+    
+    
+}
+
+// MARK: - 音乐播放
+extension AliPlayerManager {
+    
+    /// 开始播放音频
+    ///
+    /// - Parameters:
+    ///   - url: 网络链接
+    ///   - pathUrl: 本地链接
+    func initAudioPlayer(url:String? = nil, pathUrl:String? = nil,startPlayClosure :StartPlayClosure? = nil) {
+        
+        self.startPlayClosure = startPlayClosure
+        
+        if url != nil {
+            audioPlayer.setUrlSource(AVPUrlSource().url(with: url))
+        }
+        if pathUrl != nil {
+            audioPlayer.setUrlSource(AVPUrlSource().fileURL(withPath: pathUrl))
+        }
+        
+        audioPlayer.enableLog = false
+        audioPlayer.isLoop = true
+        audioPlayer.isMuted = false
+        audioPlayer.isAutoPlay = true
+        audioPlayer.prepare()
+    }
+}
+
+
+// MARK: - 视频播放
+extension AliPlayerManager {
+    func initVideoPlayer() {
+        
+    }
+}
+
+extension AliPlayerManager : AVPDelegate {
+    /**
+     @brief 播放器事件回调
+     @param player 播放器player指针
+     @param eventType 播放器事件类型
+     @see AVPEventType
+     */
+    func onPlayerEvent(_ player: AliPlayer!, eventType: AVPEventType) {
+        switch eventType {
+        case AVPEventPrepareDone:
+            // 准备完成事件
+            break
+        case AVPEventAutoPlayStart:
+            // 自动播放开始事件
+            if player == audioPlayer {
+                if let startPlayClosure = startPlayClosure {
+                    startPlayClosure!()
+                }
+            }
+            break
+        case AVPEventFirstRenderedStart:
+            // 首帧显示
+            break
+        case AVPEventCompletion:
+            // 播放完成
+            break
+        case AVPEventLoadingStart:
+            // 缓冲开始
+            break
+        case AVPEventLoadingEnd:
+            // 缓冲完成
+            break
+        case AVPEventSeekEnd:
+            // 跳转完成
+            break
+        case AVPEventLoopingStart:
+            // 循环播放开始
+            break
+        default:
+            break;
+        }
+    }
+    
+    /**
+     @brief 播放器事件回调
+     @param player 播放器player指针
+     @param eventWithString 播放器事件类型
+     @param description 播放器事件说明
+     @see AVPEventType
+     */
+    func onPlayerEvent(_ player: AliPlayer!, eventWithString: AVPEventWithString, description: String!) {
+        
+    }
+    
+    /**
+     @brief 错误代理回调
+     @param player 播放器player指针
+     @param errorModel 播放器错误描述,参考AVPErrorModel
+     @see AVPErrorModel
+     */
+    func onError(_ player: AliPlayer!, errorModel: AVPErrorModel!) {
+        
+    }
+    
+    /**
+     @brief 视频大小变化回调
+     @param player 播放器player指针
+     @param width 视频宽度
+     @param height 视频高度
+     @param rotation 视频旋转角度
+     */
+    func onVideoSizeChanged(_ player: AliPlayer!, width: Int32, height: Int32, rotation: Int32) {
+        
+    }
+    
+    /**
+     @brief 视频当前播放位置回调
+     @param player 播放器player指针
+     @param position 视频当前播放位置
+     */
+    func onCurrentPositionUpdate(_ player: AliPlayer!, position: Int64) {
+        
+    }
+    
+    /**
+     @brief 视频缓存位置回调
+     @param player 播放器player指针
+     @param position 视频当前缓存位置
+     */
+    func onBufferedPositionUpdate(_ player: AliPlayer!, position: Int64) {
+        
+    }
+    
+    /**
+     @brief 视频缓冲进度回调
+     @param player 播放器player指针
+     @param progress 缓存进度0-100
+     */
+    func onLoadingProgress(_ player: AliPlayer!, progress: Float) {
+        
+    }
+    
+    /**
+     @brief 获取track信息回调
+     @param player 播放器player指针
+     @param info track流信息数组
+     @see AVPTrackInfo
+     */
+    func onTrackReady(_ player: AliPlayer!, info: [AVPTrackInfo]!) {
+        
+    }
+    
+    /**
+     @brief track切换完成回调
+     @param player 播放器player指针
+     @param info 切换后的信息 参考AVPTrackInfo
+     @see AVPTrackInfo
+     */
+    func onTrackChanged(_ player: AliPlayer!, info: AVPTrackInfo!) {
+        
+    }
+    
+    /**
+     @brief 字幕显示回调
+     @param player 播放器player指针
+     @param index 字幕显示的索引号
+     @param subtitle 字幕显示的字符串
+     */
+    func onSubtitleShow(_ player: AliPlayer!, index: Int32, subtitle: String!) {
+        
+    }
+    
+    /**
+     @brief 字幕隐藏回调
+     @param player 播放器player指针
+     @param index 字幕显示的索引号
+     */
+    func onSubtitleHide(_ player: AliPlayer!, index: Int32) {
+        
+    }
+    /**
+     @brief 获取缩略图成功回调
+     @param positionMs 指定的缩略图位置
+     @param fromPos 此缩略图的开始位置
+     @param toPos 此缩略图的结束位置
+     @param image 缩图略图像指针,对于mac是NSImage,iOS平台是UIImage指针
+     */
+    func onGetThumbnailSuc(_ positionMs: Int64, fromPos: Int64, toPos: Int64, image: Any!) {
+        
+    }
+    
+    /**
+     @brief 获取缩略图失败回调
+     @param positionMs 指定的缩略图位置
+     */
+    func onGetThumbnailFailed(_ positionMs: Int64) {
+        
+    }
+    
+    /**
+     @brief 播放器状态改变回调
+     @param player 播放器player指针
+     @param oldStatus 老的播放器状态 参考AVPStatus
+     @param newStatus 新的播放器状态 参考AVPStatus
+     @see AVPStatus
+     */
+    func onPlayerStatusChanged(_ player: AliPlayer!, oldStatus: AVPStatus, newStatus: AVPStatus) {
+        
+    }
+    
+    /**
+     @brief 获取截图回调
+     @param player 播放器player指针
+     @param image 图像
+     @see AVPImage
+     */
+    func onCaptureScreen(_ player: AliPlayer!, image: UIImage!) {
+        
+    }
+    
+    /**
+     @brief SEI回调
+     @param type 类型
+     @param data 数据
+     @see AVPImage
+     */
+    func onSEIData(_ player: AliPlayer!, type: Int32, data: Data!) {
+        
+    }
+}

+ 238 - 0
RainbowPlanet/RainbowPlanet/Manager/PathManager/PathURLManager.swift

@@ -0,0 +1,238 @@
+//
+//  PathURLManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/25.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+class PathURLManager: NSObject {
+    
+    /// 获取程序的Home目录 ./
+    ///
+    /// - Returns: 获取程序的Home目录
+    private class func homePath() -> URL? {
+        return URL(fileURLWithPath: NSHomeDirectory())
+    }
+    
+    /// 获取Documnets目录  ./Documents
+    ///
+    /// - Returns: 获取Documnets目录
+    private class func documentPath() -> URL? {
+        return FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first
+    }
+    
+    /// 获取Library目录 ./Library
+    ///
+    /// - Returns: 获取Library目录
+    private class func libraryPath() -> URL? {
+        return FileManager.default.urls(for: .libraryDirectory,in: .userDomainMask).first
+    }
+    
+    /// 获取Caches目录  ./Library/Caches
+    ///
+    /// - Returns: 获取Caches目录
+    private class func cachesPath() -> URL? {
+        return FileManager.default.urls(for: .cachesDirectory,in: .userDomainMask).first
+    }
+    
+    /// 获取tmp目录  ./tmp
+    ///
+    /// - Returns: 获取tmp目录
+    class func tmpPath() -> URL? {
+        return URL(fileURLWithPath: NSTemporaryDirectory())
+    }
+}
+
+// MARK: - 创建项目目录路径
+extension PathURLManager {
+    
+    /// 获取Documnets目录 ./Documents/UpToYo
+    ///
+    /// - Returns: 获取Documnets目录
+    class func projectDocumentPath() -> URL? {
+        return documentPath()?.appendingPathComponent("UpToYo")
+    }
+    
+    /// 获取Library目录 ./Library/UpToYo
+    ///
+    /// - Returns: 获取Library目录
+    class func projectLibraryPath() -> URL? {
+        let uptoyo = libraryPath()?.appendingPathComponent("UpToYo")
+        return createDirectory(pathURL: uptoyo)
+    }
+    
+    /// 获取Caches目录 ./Library/Caches/UpToYo
+    ///
+    /// - Returns: 获取Caches目录
+    class func projectCachesPath() -> URL? {
+        let uptoyo = cachesPath()?.appendingPathComponent("UpToYo")
+        return createDirectory(pathURL: uptoyo)
+    }
+    
+    /// 获取tmp目录  ./tmp/UpToYo
+    ///
+    /// - Returns: 获取tmp目录
+    class func projectTmpPath() -> URL? {
+        let uptoyo = tmpPath()?.appendingPathComponent("UpToYo")
+        return createDirectory(pathURL: uptoyo)
+    }
+}
+
+// MARK: - 创建项目目录文件夹
+extension PathURLManager {
+    
+    /// 下载文件
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectDownloadsPath(parentURL:URL?) -> URL? {
+        let downloads = parentURL?.appendingPathComponent("Downloads")
+        return createDirectory(pathURL: downloads)
+    }
+    
+}
+
+// MARK: - 创建资源目录
+extension PathURLManager {
+    
+    /// 资源文件
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectResourcesPath(parentURL:URL?) -> URL? {
+        let resources = parentURL?.appendingPathComponent("Resources")
+        return createDirectory(pathURL: resources)
+    }
+    
+}
+
+// MARK: - 创建资源下的目录
+extension PathURLManager {
+    
+    /// 图片文件夹
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectPicturesPath(parentURL:URL?) -> URL? {
+        let pictures = parentURL?.appendingPathComponent("Pictures")
+        return createDirectory(pathURL: pictures)
+    }
+    
+    /// 视频文件夹
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectVideosPath(parentURL:URL?) -> URL? {
+        let videos = parentURL?.appendingPathComponent("Videos")
+        return createDirectory(pathURL: videos)
+    }
+    
+    /// 音频文件夹
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectAudiosPath(parentURL:URL?) -> URL? {
+        let audios = parentURL?.appendingPathComponent("Audios")
+        return createDirectory(pathURL: audios)
+    }
+    
+}
+
+// MARK: - 时间文件夹
+extension PathURLManager {
+    
+    /// 日期文件
+    ///
+    /// - Parameter parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectDatePath(parentURL:URL?) -> URL? {
+        let dateString = parentURL?.appendingPathComponent(PathURLManager.dateString())
+        return createDirectory(pathURL: dateString)
+    }
+    
+    /// 自定义格式生成日期文件
+    ///
+    /// - Parameters:
+    ///   - dateFormat: 日期格式
+    ///   - parentURL: 上一级的URL
+    /// - Returns: 下载文件下载文件
+    class func projectDateFormatPath(dateFormat:String,parentURL:URL?) -> URL? {
+        let dateString = parentURL?.appendingPathComponent(PathURLManager.dateString(dateFormat: dateFormat))
+        return createDirectory(pathURL: dateString)
+    }
+    
+}
+
+// MARK: - 文件名
+extension PathURLManager {
+    ///
+    /// - Parameters:
+    ///   - fileName: 文件名
+    ///   - parentURL: 上一级的URL
+    /// - Returns: 文件路径
+    class func projectFilePath(fileName:String,parentURL:URL?) -> URL? {
+        let fileUrlPath = parentURL?.appendingPathComponent(fileName)
+        return fileUrlPath
+    }
+}
+
+
+// MARK: - 创建路径
+extension PathURLManager {
+    /// 创建路径
+    ///
+    /// - Parameter pathURL: 路径
+    /// - Returns: 创建好的路径
+    class func createDirectory(pathURL:URL?) -> URL? {
+        //判断是否有路径
+        if FileManager.default.fileExists(atPath: pathURL?.path ?? "") {
+            return pathURL
+        }else {
+            do {
+                try FileManager.default.createDirectory(atPath: pathURL?.path ?? "", withIntermediateDirectories: true, attributes: nil)
+                return pathURL
+            } catch {
+                NXLLog("路径错误")
+                return nil
+            }
+        }
+    }
+}
+
+// MARK: - 生成日期
+extension PathURLManager {
+    
+    /// 生成日期
+    ///
+    /// - Returns: 日期字符串
+    class func dateString() -> String {
+        let dateStr = Date.dateToString(Date(), dateFormat: "yyyyMMdd")
+        return dateStr
+    }
+    
+    /// 自定义格式生成日期
+    ///
+    /// - Returns: 日期字符串
+    class func dateString(dateFormat:String) -> String {
+        let dateStr = Date.dateToString(Date(), dateFormat: dateFormat)
+        return dateStr
+    }
+}
+
+
+
+// MARK: - 生成随机字符串
+extension PathURLManager {
+    /// 生成随机字符串
+    ///
+    /// - Returns: 随机字符串
+    class func randomString() -> String {
+        let puuid = CFUUIDCreate(nil)
+        let uuidString = CFUUIDCreateString(nil, puuid)
+        let result = CFStringCreateCopy(nil, uuidString)
+        return result! as String
+    }
+}

+ 14 - 0
RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/View/CircleHeaderView/CircleHeaderView.swift

@@ -11,6 +11,15 @@ import SwiftyMediator
 
 class CircleHeaderView: BaseView {
     
+    deinit {
+        NXLLog("deinit")
+        if observe != nil {
+            NotificationCenter.default.removeObserver(observe!)
+        }
+    }
+    
+    weak var observe : NSObjectProtocol?
+    
     var imageViewFrame = CGRect(x: 0, y: 0, width: kScreenWidth, height: 114 + kNavBarTotalHeight + 8)
     
     override func setupViews() {
@@ -28,6 +37,11 @@ class CircleHeaderView: BaseView {
         addSubview(bottomView)
         bottomView.addSubview(iconImageView)
         bottomView.addSubview(noticeLabel)
+        observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CircleHeaderViewAlbumNumber"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
+            let count = notification.object as? Int
+            self?.communityCircleModel?.pictures?.extra = (self?.communityCircleModel?.pictures?.extra ?? 0) + (count ?? 0)
+            self?.albumNumberLabel.text = TGCaculateNumberTool.string(fromNumber: Double(self?.communityCircleModel?.pictures?.extra ?? 0), toFixedCount: 1, roundingMode: TGCNRoundingMode.onlyDown)
+        }
     }
     
     override func setupLayouts() {

+ 2 - 19
RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/ViewController/CircleViewController.swift

@@ -50,14 +50,10 @@ class CircleViewController: BaseViewController {
         navigationBgView.snp.makeConstraints { (make) in
             make.edges.equalToSuperview()
         }
-        avatarButton.snp.makeConstraints { (make) in
+        nameButton.snp.makeConstraints { (make) in
             make.left.equalTo(navigationBar.leftButton.snp.right)
-            make.size.equalTo(20)
             make.centerY.equalTo(navigationBar.rightButton)
-        }
-        nameButton.snp.makeConstraints { (make) in
-            make.centerY.equalTo(avatarButton)
-            make.left.equalTo(avatarButton.snp.right).offset(4)
+            make.right.equalTo(navigationBar.rightButton.snp.left).offset(5)
         }
         plusButton.snp.makeConstraints { (make) in
             make.bottom.equalTo(-(kSafeTabBarHeight + 48))
@@ -121,7 +117,6 @@ class CircleViewController: BaseViewController {
             self?.setupLayouts()
             self?.reloadData()
             self?.navigationBar.backgroundImageView.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? "default_pic"), placeholder: kImage(name: "default_pic"))
-            self?.avatarButton.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "default_avatar"))
             self?.nameButton.setTitle(self?.communityCircleModel?.name, for: UIControl.State.normal)
             self?.circleHeaderView.communityCircleModel = self?.communityCircleModel
             
@@ -136,7 +131,6 @@ class CircleViewController: BaseViewController {
         navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
         navigationBar.wr_setRightButton(image: kImage(name: "nav_share_white")!)
         navigationBar.addSubview(navigationBgView)
-        navigationBar.addSubview(avatarButton)
         navigationBar.addSubview(nameButton)
         navigationBar.insertSubview(navigationBgView, aboveSubview: navigationBar.backgroundImageView)
         navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
@@ -160,15 +154,6 @@ class CircleViewController: BaseViewController {
         self.pagingView.reloadData()
     }
     
-    lazy var avatarButton: UIButton = {
-        let avatarButton = UIButton(type: UIButton.ButtonType.custom)
-        avatarButton.setImage(kImage(name: "default_avatar"), for: UIControl.State.normal)
-        avatarButton.cornerRadius = 10
-        avatarButton.masksToBounds = true
-        avatarButton.alpha = 0
-        return avatarButton
-    }()
-    
     lazy var nameButton: UIButton = {
         let nameButton = UIButton(type: UIButton.ButtonType.custom)
         nameButton.setTitle("昵称", for: UIControl.State.normal)
@@ -330,7 +315,6 @@ extension CircleViewController : JXPagingViewDelegate {
         if (offsetY > kSafeStatusBarHeight) {
             let alpha = (offsetY - kSafeStatusBarHeight) / CGFloat(kNavBarTotalHeight)
             navigationBar.wr_setBackgroundAlpha(alpha: alpha)
-            avatarButton.alpha = alpha
             nameButton.alpha = alpha
             navigationBgView.alpha = alpha
             circleHeaderView.bgView.alpha = 1 - alpha
@@ -338,7 +322,6 @@ extension CircleViewController : JXPagingViewDelegate {
             
         } else {
             navigationBar.wr_setBackgroundAlpha(alpha: 0)
-            avatarButton.alpha = 0
             nameButton.alpha = 0
             navigationBgView.alpha = 0
             circleHeaderView.bgView.alpha = 1

+ 1 - 0
RainbowPlanet/RainbowPlanet/Modules/CircleModule/CircleAlbum/View/CircleAlbumHeaderView.swift

@@ -76,6 +76,7 @@ class CircleAlbumHeaderView: BaseView {
         SwiftMoyaNetWorkServiceCommunity.shared().communityCirclePicturePostApi(circleId: circleId ?? 0, imgs: self.imgUrlsStr) { [weak self] (_) -> (Void) in
             if let uploadSuccessClosure = self?.uploadSuccessClosure {
                 SwiftProgressHUD.shared().hide()
+                NotificationCenter.default.post(name: NSNotification.Name("CircleHeaderViewAlbumNumber"), object: self?.selectedAssets.count)
                 uploadSuccessClosure()
             }
         }

BIN
RainbowPlanet/RainbowPlanet/Src/AliyunResource/Filter/FilterResource/海蓝/color.png