Browse Source

Merge branch 'master' into module

* master:
  添加是否导出水印参数 enableWatermarkMovie
  添加新图片修改大小方法
  1.添加分享弹窗限制key
  1.迁移NX相关到Common
  1.迁移NX相关到Common
  适配xcode13
  1.add actity enum
  1.修改素材选择详情
  1.gif detail
  update func displayGIF
  1.update key
  1.修改枚举
  1.update framework
  1.update framework
  1.update framework

# Conflicts:
#	BFCommonKit.podspec
#	BFCommonKit/Classes/BFBase/Controller/PQBaseViewController.swift
#	BFCommonKit/Classes/BFBase/View/PQLoadingHUB.swift
#	BFCommonKit/Classes/BFCategorys/BFUIImage+Ext.swift
#	BFCommonKit/Classes/BFCategorys/BFUIView+Ext.swift
#	Example/Podfile.lock
harry 3 năm trước cách đây
mục cha
commit
f80202fca1

+ 5 - 5
BFCommonKit.podspec

@@ -5,7 +5,7 @@
 # Any lines starting with a # are optional, but their use is encouraged
 # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
 #
-
+# update framework 2021.11.1
 Pod::Spec.new do |s|
   s.name             = 'BFCommonKit'
   s.version          = '1.4.9'
@@ -39,7 +39,7 @@ TODO: Add long description of the pod here.
   s.subspec 'BFBase' do |bb|
     bb.source_files = 'BFCommonKit/Classes/BFBase/**/*'
     bb.frameworks = 'UIKit', 'WebKit'
-    bb.dependency 'Alamofire','5.4.3'
+    bb.dependency 'Alamofire','5.4.4'
     bb.dependency 'SnapKit','5.0.1'
     bb.dependency 'BFCommonKit/BFUtility'
     bb.dependency 'BFCommonKit/BFConfig'
@@ -57,10 +57,10 @@ TODO: Add long description of the pod here.
   s.subspec 'BFUtility' do |uu|
     uu.source_files = 'BFCommonKit/Classes/BFUtility/*'
     uu.frameworks = 'Foundation','UIKit','AdSupport','Photos','AudioToolbox','AVKit'
-    uu.dependency 'Alamofire','5.4.3'
-    uu.dependency 'KeychainAccess','4.2.2'
-    uu.dependency 'Kingfisher','6.3.0'
     uu.dependency 'KingfisherWebP','1.3.0'
+    uu.dependency 'Alamofire','5.4.4'
+    uu.dependency 'KeychainAccess','4.2.2'
+    uu.dependency 'Kingfisher','6.3.1'
     uu.dependency 'Toast-Swift','5.0.1'
     uu.dependency 'BFCommonKit/BFCategorys'
     uu.dependency 'BFCommonKit/BFConfig'

+ 1 - 1
BFCommonKit/Classes/BFCategorys/BFBundle+Ext.swift

@@ -10,7 +10,7 @@ import Foundation
 public extension Bundle {
     // bf main bundle url
 //    func BF_mainbundle_URL() -> URL {
-//        let bundle: Bundle = Bundle(for: PQBaseViewController.self)
+//        let bundle: Bundle = Bundle(for: BFBaseViewController.self)
 //        return bundle.url(forResource: "BFFramework", withExtension: "bundle")!
 //    }
 

+ 1 - 1
BFCommonKit/Classes/BFCategorys/BFColor+Ext.swift

@@ -43,7 +43,7 @@ public extension UIColor {
         Scanner(string: bStr).scanHexInt32(&b)
         return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: alpha)
     }
-
+    
     // MARK: - hex (0x000000) -> UIColor
 
     ///

+ 25 - 1
BFCommonKit/Classes/BFCategorys/BFInt+Ext.swift → BFCommonKit/Classes/BFCategorys/BFNumber+Ext.swift

@@ -1,5 +1,5 @@
 //
-//  Int+Ext.swift
+//  BFNumber+Ext.swift
 //  PQSpeed
 //
 //  Created by SanW on 2020/7/20.
@@ -106,3 +106,27 @@ public extension Float64 {
         return result
     }
 }
+
+extension Float {
+    /// 准确的小数尾截取 - 没有进位
+    /*
+     // 11.999003  -> 12.0
+     var pp = 11.999003
+     String(format: "%.1f", pp)  这个方法会进行四舍五入
+     */
+    public func decimalString(_ base: Self = 1) -> String {
+       return "\(self.decimalNumber(base))"
+    }
+    public func decimalNumber(_ base: Self = 1) -> Float {
+        let tempCount: Self = pow(10, base)
+        let temp = self*tempCount
+        
+        let target = Self(Int(temp))
+        let stepone = target/tempCount
+        if stepone.truncatingRemainder(dividingBy: 1) == 0 {
+            return Float(String(format: "%.0f", stepone)) ?? 0.0
+        }else{
+            return stepone
+        }
+    }
+}

+ 0 - 389
BFCommonKit/Classes/BFCategorys/NXUI+Ext.swift

@@ -1,389 +0,0 @@
-//
-//  NXUI+Ext.swift
-//  NXFramework-Swift-Demo
-//
-//  Created by ak on 2020/10/26.
-//  Copyright © 2020 NXFramework-Swift. All rights reserved.
-//
-
-import UIKit
-
-public extension UIViewController {
-    func showAlert(withTitle title: String?, message: String?) {
-        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
-        let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
-        alert.addAction(action)
-
-        present(alert, animated: true, completion: nil)
-    }
-
-    var contentViewController: UIViewController {
-        if let navcon = self as? UINavigationController {
-            return navcon.visibleViewController ?? self
-        } else {
-            return self
-        }
-    }
-}
-
-// Shake oritention
-public enum ShakeDirection: Int {
-    case horizontal
-    case vertical
-}
-
-public extension UIView {
-    func shake(direction: ShakeDirection = .horizontal, times: Int = 5,
-               interval: TimeInterval = 0.1, delta: CGFloat = 2,
-               completion: (() -> Void)? = nil)
-    {
-        UIView.animate(withDuration: interval, animations: { () -> Void in
-            switch direction {
-            case .horizontal:
-                self.layer.setAffineTransform(CGAffineTransform(translationX: delta, y: 0))
-            case .vertical:
-                self.layer.setAffineTransform(CGAffineTransform(translationX: 0, y: delta))
-            }
-        }) { (_) -> Void in
-            if times == 0 {
-                // last shaking finish, reset location, callback
-                UIView.animate(withDuration: interval, animations: { () -> Void in
-                    self.layer.setAffineTransform(CGAffineTransform.identity)
-                }, completion: { (_) -> Void in
-                    completion?()
-                })
-            } else {
-                // not last shaking, continue
-                self.shake(direction: direction, times: times - 1, interval: interval,
-                           delta: delta * -1, completion: completion)
-            }
-        }
-    }
-}
-
-public extension UIView {
-    var x: CGFloat {
-        set {
-            var frame = self.frame
-            frame.origin.x = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.origin.x
-        }
-    }
-
-    var y: CGFloat {
-        set {
-            var frame = self.frame
-            frame.origin.y = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.origin.y
-        }
-    }
-
-    var centerX: CGFloat {
-        set {
-            var center = self.center
-            center.x = newValue
-            self.center = center
-        }
-        get {
-            return center.x
-        }
-    }
-
-    var centerY: CGFloat {
-        set {
-            var center = self.center
-            center.y = newValue
-            self.center = center
-        }
-        get {
-            return center.y
-        }
-    }
-
-    var width: CGFloat {
-        set {
-            var frame = self.frame
-            frame.size.width = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.size.width
-        }
-    }
-
-    var height: CGFloat {
-        set {
-            var frame = self.frame
-            frame.size.height = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.size.height
-        }
-    }
-
-    var size: CGSize {
-        set {
-            var frame = self.frame
-            frame.size = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.size
-        }
-    }
-
-    var origin: CGPoint {
-        set {
-            var frame = self.frame
-            frame.origin = newValue
-            self.frame = frame
-        }
-        get {
-            return frame.origin
-        }
-    }
-
-    var bottomY: CGFloat {
-        set {
-            var frame = self.frame
-            frame.origin.y = newValue - frame.size.height
-            self.frame = frame
-        }
-        get {
-            return height + y
-        }
-    }
-
-    var rightX: CGFloat {
-        set {
-            var frame = self.frame
-            frame.origin.x = newValue - frame.size.width
-            self.frame = frame
-        }
-        get {
-            return width + x
-        }
-    }
-
-    // MARK: - UIView round corner
-
-    ///
-    /// - Parameter cornerRadius: radius
-    func roundedCorners(cornerRadius: CGFloat) {
-        roundedCorners(cornerRadius: cornerRadius, borderWidth: 0, borderColor: nil)
-    }
-
-    ///
-    /// - Parameters:
-    ///   - cornerRadius:
-    ///   - borderWidth:
-    ///   - borderColor:
-    func roundedCorners(cornerRadius: CGFloat?, borderWidth: CGFloat?, borderColor: UIColor?) {
-        layer.cornerRadius = cornerRadius!
-        layer.borderWidth = borderWidth!
-        layer.borderColor = borderColor?.cgColor
-        layer.masksToBounds = true
-    }
-
-    ///
-    /// - Parameters:
-    ///   - cornerRadius:
-    ///   - rectCorner:
-    func roundedCorners(cornerRadius: CGFloat?, rectCorner: UIRectCorner?) {
-        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: rectCorner!, cornerRadii: CGSize(width: cornerRadius!, height: cornerRadius!))
-        let layer = CAShapeLayer()
-        layer.frame = bounds
-        layer.path = path.cgPath
-        self.layer.mask = layer
-    }
-
-    ///
-    /// - Parameters:
-    ///   - colors:
-    ///   - locations:
-    ///   - startPoint: [0...1]
-    ///   - endPoint: [0...1]
-    func gradientColor(colors: [CGColor], locations: [NSNumber], startPoint: CGPoint, endPoint: CGPoint) {
-        let gradientLayer = CAGradientLayer()
-        gradientLayer.colors = colors
-        gradientLayer.locations = locations
-        /*
-         // vertical
-         gradientLayer.startPoint = CGPoint(x: 0, y: 0)
-         gradientLayer.endPoint = CGPoint(x: 0, y: 1)
-         */
-        gradientLayer.startPoint = startPoint
-        gradientLayer.endPoint = endPoint
-        gradientLayer.frame = frame
-        layer.insertSublayer(gradientLayer, at: 0)
-    }
-
-    // MARK: - UIView blur
-
-    ///
-    /// - Parameter style: UIBlurEffectStyle
-    func addBlurEffect(style _: UIBlurEffect.Style) {
-        let effect = UIBlurEffect(style: UIBlurEffect.Style.light)
-        let effectView = UIVisualEffectView(effect: effect)
-        effectView.frame = bounds
-        backgroundColor = .clear
-        addSubview(effectView)
-        sendSubviewToBack(effectView)
-    }
-}
-
-public extension UIView {
-    /// 往当前视图添加一个子视图
-    /// - Parameters:
-    ///   - rect: 子视图大小
-    ///   - bgColor: 子视图背景色
-    /// - Returns: 子视图
-    func nx_addView(rect: CGRect = .zero, bgColor: UIColor = .white) -> UIView {
-        let view = UIView(frame: rect)
-        view.backgroundColor = bgColor
-        addSubview(view)
-        return view
-    }
-
-    /// 往当前视图添加UIImageView
-    /// - Parameters:
-    ///   - image: 图片对象
-    ///   - rect: UIImageView
-    ///   - contentMode: 图片填充模式
-    /// - Returns: 图片
-    func nx_addImageView(image: UIImage?, rect: CGRect = .zero, contentMode: ContentMode = .scaleAspectFit) -> UIImageView {
-        let imageView = UIImageView(frame: rect)
-        imageView.image = image
-        imageView.contentMode = contentMode
-        addSubview(imageView)
-        return imageView
-    }
-
-    /// 添加文本控件
-    /// - Parameters:
-    ///   - fontSize: 文本大小
-    ///   - text: 文本
-    ///   - textColor: 文本颜色
-    ///   - bgColor: 背景颜色
-    /// - Returns: 文本控件
-    func nx_addLabel(fontSize: CGFloat, text: String, textColor: UIColor, bgColor: UIColor) -> UILabel {
-        return nx_addLabel(font: UIFont.systemFont(ofSize: fontSize),
-                           text: text,
-                           textColor: textColor,
-                           bgColor: bgColor)
-    }
-
-    /// 添加文本控件
-    /// - Parameters:
-    ///   - font: 文本大小
-    ///   - text: 文本
-    ///   - textColor: 文本颜色
-    ///   - bgColor: 背景颜色
-    /// - Returns: 文本控件
-    func nx_addLabel(font: UIFont, text: String, textColor: UIColor, bgColor: UIColor) -> UILabel {
-        let label = UILabel(frame: .zero)
-        label.font = font
-        label.text = text
-        label.textColor = textColor
-        label.backgroundColor = bgColor
-        addSubview(label)
-        return label
-    }
-
-    /// 添加按钮控件
-    /// - Parameters:
-    ///   - rect: 控件大小
-    ///   - title: 标题
-    ///   - titleColor: 标题颜色
-    ///   - font: 字体
-    ///   - image: 图片
-    ///   - bgImg: 背景图片
-    ///   - target: 事件响应者
-    ///   - action: 事件响应方法
-    ///   - event: 响应事件
-    /// - Returns: 按钮
-    func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, font: UIFont, image: UIImage?, bgImg: UIImage?, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-        let btn = UIButton(type: .custom)
-        btn.frame = rect
-        btn.setTitle(title, for: .normal)
-        btn.setTitle(title, for: .highlighted)
-        btn.setTitleColor(titleColor, for: .normal)
-        btn.setTitleColor(titleColor, for: .highlighted)
-        btn.setImage(image, for: .normal)
-        btn.setImage(image, for: .highlighted)
-        btn.setBackgroundImage(bgImg, for: .normal)
-        btn.setBackgroundImage(bgImg, for: .highlighted)
-        btn.titleLabel?.font = font
-        if let sel = action, let e = event {
-            btn.addTarget(target, action: sel, for: e)
-        }
-        addSubview(btn)
-        return btn
-    }
-
-    /// 添加一个文本类型的按钮控件
-    /// - Parameters:
-    ///   - rect: 按钮大小
-    ///   - title: 文本
-    ///   - titleColor: 文本颜色
-    ///   - target: 事件响应者
-    ///   - action: 事件响应方法
-    ///   - event:响应事件
-    /// - Returns: 按钮控件
-    func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-        return nx_addButton(rect: rect,
-                            title: title,
-                            titleColor: titleColor,
-                            font: UIFont.systemFont(ofSize: 14),
-                            image: nil,
-                            bgImg: nil,
-                            target: target,
-                            action: action,
-                            event: event)
-    }
-
-    /// 添加图片类型按钮
-    /// - Parameters:
-    ///   - rect: 按钮大小
-    ///   - image: 图片
-    ///   - target: 事件响应者
-    ///   - action: 事件响应方法
-    ///   - event: 响应事件
-    /// - Returns: 按钮控件
-    func nx_addButton(rect: CGRect, image: UIImage, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-        return nx_addButton(rect: rect,
-                            title: "",
-                            titleColor: .white,
-                            font: UIFont.systemFont(ofSize: 14),
-                            image: image,
-                            bgImg: nil,
-                            target: target,
-                            action: action,
-                            event: event)
-    }
-
-    /// 添加tableView
-    /// - Parameters:
-    ///   - rect: 大小
-    ///   - delegate: delegate对象
-    ///   - dataSource: dataSource 对象
-    /// - Returns: 表视图
-    func nx_addTableView(rect: CGRect, delegate: UITableViewDelegate?, dataSource: UITableViewDataSource?) -> UITableView {
-        let tableView = UITableView(frame: rect)
-        tableView.delegate = delegate
-        tableView.dataSource = dataSource
-        backgroundColor = .white
-        tableView.tableFooterView = UIView()
-        if #available(iOS 11.0, *) {
-            tableView.contentInsetAdjustmentBehavior = .never
-        }
-        return tableView
-    }
-}

+ 0 - 201
BFCommonKit/Classes/BFCategorys/UIImage+NXCategory.h

@@ -1,201 +0,0 @@
-//
-//  UIImage+UIImage_NXCategory.h
-//  AKImovie
-//
-//  Created by AK on 16/2/21.
-//  Copyright © 2016年 ak. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-typedef NS_ENUM(NSInteger, NXCropImageStyle) {
-    NXCropImageStyleRight = 0,               // 右半部分
-    NXCropImageStyleCenter = 1,              // 中间部分
-    NXCropImageStyleLeft = 2,                // 左半部分
-    NXCropImageStyleRightOneOfThird = 3,     // 右侧三分之一部分
-    NXCropImageStyleCenterOneOfThird = 4,    // 中间三分之一部分
-    NXCropImageStyleLeftOneOfThird = 5,      // 左侧三分之一部分
-    NXCropImageStyleRightQuarter = 6,        // 右侧四分之一部分
-    NXCropImageStyleCenterRightQuarter = 7,  // 中间右侧四分之一部分
-    NXCropImageStyleCenterLeftQuarter = 8,   // 中间左侧四分之一部分
-    NXCropImageStyleLeftQuarter = 9,         // 左侧四分之一部分
-};
-
-@interface UIImage (NXCategory)
-
-#pragma mark - blur 效果
-/**
- 给图片打马赛克
- @param image 原始图片
- @param blur 值越 blurry 就越大
- @return 处理后的图片
- */
-+ (UIImage *)nx_blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur;
-
-/**
-  boxblur image 这个要在整理
-
-  @param toBlurImage 要处理的图片
-  @return 处理后图片
- */
-+ (UIImage *)nx_boxblurImage:(UIImage *)toBlurImage;
-
-#pragma mark - 旋转
-/**
-  照片旋转90度,如从系统相册中取出的原图要转正
-
- @param aImage 原图
- @param isFront YES 为前置拍照
- @return 转正后图片
- */
-+ (UIImage *)nx_fixOrientation:(UIImage *)aImage isFront:(BOOL)isFront;
-
-/**
- 旋转图片
-
- @param image 原图
- @param orientation 旋转的方向
- @return 旋转后的图片
- */
-+ (UIImage *)nx_rotationImage:(UIImage *)image orientation:(UIImageOrientation)orientation;
-
-#pragma mark - 缩放
-/**
- 等比缩放图片
-
- @param size 放到的大小(单位为像素)
- @return 处理后的图片
- */
-- (UIImage *)nx_scaleToSize:(CGSize)size;
-
-/**
- 等比缩放图片 按照最短边缩放
- @param maxLength 边长最大值 (单位为像素)
- @return 处理后的图片
- */
-- (UIImage *)nx_scaleWithMaxLength:(float)maxLength;
-
-#pragma mark - 截取
-/**
- 截取 uiimage 指定区域
-
- @param style 类型为 NXCropImageStyle
- @return 裁剪后的图片
- */
-- (UIImage *)nx_imageByCroppingWithStyle:(NXCropImageStyle)style;
-
-/**
-  截取 uiimage 指定区域
-
- @param rect 裁剪区域
- @return 裁剪后的图片
- */
-- (UIImage *)imageByCroppingWithRect:(CGRect)rect;
-
-
-/**
- 将图片按照最短边等比截取图片中间部分
-
- @return 截取后到正方形图片
- */
-- (UIImage *)nx_cropImageToSquare;
-
-/**
- *  将图片等比绘制到正方形画布中并重新生成新图
- *
- *  @return 处理后的图片
- */
-- (UIImage *)nx_zoomImageToSquare;
-
-/**
- 将图片等比缩放的指定的画布中并生成新图。(跟画布比例不一样的做 左右或者上下留白处理)
-
- @param size 指定画布大小
- @return 处理后的新图
- */
-- (UIImage *)nx_zoomWithSize:(CGSize)size;
-
-/**
- 高清截屏 opaque 为no 有透明度速度会慢一些
-
- @param view 指定的VIEW
- @return 截屏图片
- */
-+ (UIImage *)nx_screenHierarchyShots:(UIView *)view;
-
-/**
- 高清截屏
-
- @param view 指定的VIEW
- @param opaque 透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
- @return 截屏图片
- */
-+ (UIImage *)nx_screenHierarchyShots:(UIView *)view isOpaque:(BOOL)opaque;
-
-/**
- 获得裁剪图片
-
- e.g.
- int squalWidth = MIN(self.clipImage.size.width, self.clipImage.size.height);
-
- float clipX = _clipScroll.contentOffset.x;
- float clipY = _clipScroll.contentOffset.y;
- CGRect rect = CGRectMake(clipX, clipY, NX_MAIN_SCREEN_WIDTH, NX_MAIN_SCREEN_WIDTH);
-
- clipedImage =
- [UIImage nx_cropImageView:_bigImageView toRect:rect zoomScale:1
- containerView:_backView outputWith:squalWidth];
-
- @param imageView 原始VIEW
- @param rect 截取区域
- @param zoomScale 缩放大小
- @param containerView 显示区域VIEW
- @param outputWith 输出大小
- @return 处理后图片
- */
-+ (UIImage *)nx_cropImageView:(UIImageView *)imageView
-                       toRect:(CGRect)rect
-                    zoomScale:(double)zoomScale
-                containerView:(UIView *)containerView
-                   outputWith:(CGFloat)outputWith;
-
-#pragma mark - 圆角
-/**
- 切圆角 可防止离屏渲染
- e.g.
- UIImage *placeHolder = [[UIImage imageNamed:@"userIcon"] circleImage];
-
- @param img 原图片
- @return 处理后的图片
- */
-+ (UIImage *)nx_circleImage:(UIImage *)img;
-
-/** 切圆角 可防止离屏渲染
- * @param image 需要进行圆角的图片
- * @param direction 切割的方向
- * @param cornerRadii 圆角半径
- * @param borderWidth 边框宽度
- * @param borderColor 边框颜色
- * @param backgroundColor 背景色
- * @return 处理后的图片
- */
-+ (UIImage *)nx_circleImage:(UIImage *)image cuttingDirection:(UIRectCorner)direction cornerRadii:(CGFloat)cornerRadii borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor backgroundColor:(UIColor *)backgroundColor;
-
-/**
- 获取当前屏幕大小的的开屏页图片
- 
- @return 开屏页图片
- */
-+ (UIImage *)nx_launchImage;
-
-
-/**
- 把指定颜色背景变成透明
-
- @param image 原图数据
- @param color 原背景色
- @return 背景透明后的图
- */
-+ (UIImage*)transparentBackClear:(UIImage*)image color:(UIColor*)color;
-
-@end

+ 0 - 642
BFCommonKit/Classes/BFCategorys/UIImage+NXCategory.m

@@ -1,642 +0,0 @@
-//
-//  UIImage+UIImage_NXCategory.m
-//  AKImovie
-//
-//  Created by AK on 16/2/21.
-//  Copyright © 2016年 ak. All rights reserved.
-//
-
-#import "UIImage+NXCategory.h"
-#import <Accelerate/Accelerate.h>
-
-@implementation UIImage (NXCategory)
-
-#pragma mark - blur 效果
-+ (UIImage *)nx_blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur
-{
-    CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
-    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"
-                                  keysAndValues:kCIInputImageKey, inputImage, @"inputRadius", @(blur), nil];
-
-    CIImage *outputImage = filter.outputImage;
-    CIContext *context = [CIContext contextWithOptions:nil];
-    CGImageRef outImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
-    return [UIImage imageWithCGImage:outImage];
-}
-
-+ (UIImage *)nx_boxblurImage:(UIImage *)toBlurImage
-{
-    UIImage *newImage =
-
-        [toBlurImage nx_scaleToSize:CGSizeMake(toBlurImage.size.width / 2., toBlurImage.size.height / 2.)];
-
-    NSData *jpgData = UIImageJPEGRepresentation(newImage, 0.01);
-
-    UIImage *image = [UIImage imageWithData:jpgData];
-    CGFloat blur = 0.3f;
-
-    int boxSize = (int)(blur * 40);
-    boxSize = boxSize - (boxSize % 2) + 1;
-
-    CGImageRef img = image.CGImage;
-    vImage_Buffer inBuffer, outBuffer;
-    vImage_Error error;
-    void *pixelBuffer;
-
-    // create vImage_Buffer with data from CGImageRef
-    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
-    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
-
-    inBuffer.width = CGImageGetWidth(img);
-    inBuffer.height = CGImageGetHeight(img);
-    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
-
-    inBuffer.data = (void *)CFDataGetBytePtr(inBitmapData);
-
-    // create vImage_Buffer for output
-    pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
-
-    if (pixelBuffer == NULL) NSLog(@"No pixelbuffer");
-
-    outBuffer.data = pixelBuffer;
-    outBuffer.width = CGImageGetWidth(img);
-    outBuffer.height = CGImageGetHeight(img);
-    outBuffer.rowBytes = CGImageGetBytesPerRow(img);
-
-    // perform convolution
-    error =
-        vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
-            ?: vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
-                   ?: vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL,
-                                                 kvImageEdgeExtend);
-
-    if (error)
-    {
-        NSLog(@"error from convolution %ld", error);
-    }
-
-    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
-    CGContextRef ctx = CGBitmapContextCreate(outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes,
-                                             colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast);
-    CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
-    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
-
-    // clean up
-    CGContextRelease(ctx);
-    CGColorSpaceRelease(colorSpace);
-
-    free(pixelBuffer);
-    CFRelease(inBitmapData);
-    CGImageRelease(imageRef);
-
-    return returnImage;
-}
-
-#pragma mark - 旋转
-+ (UIImage *)nx_fixOrientation:(UIImage *)aImage isFront:(BOOL)isFront;
-{
-    // No-op if the orientation is already correct
-    if (aImage.imageOrientation == UIImageOrientationUp) return aImage;
-
-    // We need to calculate the proper transformation to make the image upright.
-    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
-    CGAffineTransform transform = CGAffineTransformIdentity;
-
-    if (isFront)
-    {
-        transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
-        transform = CGAffineTransformScale(transform, -1, 1);
-    }
-
-    switch (aImage.imageOrientation)
-    {
-        case UIImageOrientationDown:
-        case UIImageOrientationDownMirrored:
-            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
-            transform = CGAffineTransformRotate(transform, M_PI);
-            break;
-
-        case UIImageOrientationLeft:
-        case UIImageOrientationLeftMirrored:
-            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
-            transform = CGAffineTransformRotate(transform, M_PI_2);
-            break;
-
-        case UIImageOrientationRight:
-        case UIImageOrientationRightMirrored:
-            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
-            transform = CGAffineTransformRotate(transform, -M_PI_2);
-            break;
-        default:
-            break;
-    }
-
-    switch (aImage.imageOrientation)
-    {
-        case UIImageOrientationUpMirrored:
-        case UIImageOrientationDownMirrored:
-            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
-            transform = CGAffineTransformScale(transform, -1, 1);
-            break;
-
-        case UIImageOrientationLeftMirrored:
-        case UIImageOrientationRightMirrored:
-            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
-            transform = CGAffineTransformScale(transform, -1, 1);
-            break;
-        default:
-            break;
-    }
-
-    // Now we draw the underlying CGImage into a new context, applying the
-    // transform
-    // calculated above.
-    CGContextRef ctx =
-        CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),
-                              0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage));
-    CGContextConcatCTM(ctx, transform);
-    switch (aImage.imageOrientation)
-    {
-        case UIImageOrientationLeft:
-        case UIImageOrientationLeftMirrored:
-        case UIImageOrientationRight:
-        case UIImageOrientationRightMirrored:
-            // Grr...
-            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage);
-            break;
-
-        default:
-            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.CGImage);
-            break;
-    }
-
-    // And now we just create a new UIImage from the drawing context
-    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
-    UIImage *img = [UIImage imageWithCGImage:cgimg];
-    CGContextRelease(ctx);
-    CGImageRelease(cgimg);
-    return img;
-}
-
-// 旋转
-+ (UIImage *)nx_rotationImage:(UIImage *)image orientation:(UIImageOrientation)orientation
-{
-    long double rotate = 0.0;
-    CGRect rect;
-    float translateX = 0;
-    float translateY = 0;
-    float scaleX = 1.0;
-    float scaleY = 1.0;
-
-    switch (orientation)
-    {
-        case UIImageOrientationLeft:
-            rotate = M_PI_2;
-            rect = CGRectMake(0, 0, image.size.height, image.size.width);
-            translateX = 0;
-            translateY = -rect.size.width;
-            scaleY = rect.size.width / rect.size.height;
-            scaleX = rect.size.height / rect.size.width;
-            break;
-        case UIImageOrientationRight:
-            rotate = 3 * M_PI_2;
-            rect = CGRectMake(0, 0, image.size.height, image.size.width);
-            translateX = -rect.size.height;
-            translateY = 0;
-            scaleY = rect.size.width / rect.size.height;
-            scaleX = rect.size.height / rect.size.width;
-            break;
-        case UIImageOrientationDown:
-            rotate = M_PI;
-            rect = CGRectMake(0, 0, image.size.width, image.size.height);
-            translateX = -rect.size.width;
-            translateY = -rect.size.height;
-            break;
-        default:
-            rotate = 0.0;
-            rect = CGRectMake(0, 0, image.size.width, image.size.height);
-            translateX = 0;
-            translateY = 0;
-            break;
-    }
-
-    UIGraphicsBeginImageContext(rect.size);
-    CGContextRef context = UIGraphicsGetCurrentContext();
-    //做CTM变换
-    CGContextTranslateCTM(context, 0.0, rect.size.height);
-    CGContextScaleCTM(context, 1.0, -1.0);
-    CGContextRotateCTM(context, rotate);
-    CGContextTranslateCTM(context, translateX, translateY);
-
-    CGContextScaleCTM(context, scaleX, scaleY);
-    //绘制图片
-    CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
-
-    UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
-    NSLog(@"image size %f---%f", image.size.width, image.size.height);
-    UIGraphicsEndImageContext();
-    return newPic;
-}
-
-#pragma mark - 缩放
-- (UIImage *)nx_scaleToSize:(CGSize)size
-{
-    CGFloat width = CGImageGetWidth(self.CGImage);
-    CGFloat height = CGImageGetHeight(self.CGImage);
-
-    float verticalRadio = size.height * 1.0 / height;
-    float horizontalRadio = size.width * 1.0 / width;
-
-    float radio = 1;
-    if (verticalRadio > 1 && horizontalRadio > 1)
-    {
-        radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio;
-    }
-    else
-    {
-        radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio;
-    }
-
-    width = width * radio;
-    height = height * radio;
-
-    int xPos = (size.width - width) / 2;
-    int yPos = (size.height - height) / 2;
-
-    // 创建一个bitmap的context
-    // 并把它设置成为当前正在使用的context
-    UIGraphicsBeginImageContext(size);
-
-    // 绘制改变大小的图片
-    [self drawInRect:CGRectMake(xPos, yPos, width, height)];
-
-    // 从当前context中创建一个改变大小后的图片
-    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
-
-    // 使当前的context出堆栈
-    UIGraphicsEndImageContext();
-
-    // 返回新的改变大小后的图片
-    return scaledImage;
-}
-
-//按照最短边缩放 maxlength 边长最大值
-- (UIImage *)nx_scaleWithMaxLength:(float)maxLength
-{
-    if (self.size.width > maxLength || self.size.height > maxLength)
-    {
-        float maxWidth = maxLength;
-        float maxHeight = maxLength;
-
-        if (self.size.width != self.size.height)
-        {
-            if (self.size.width > self.size.height)
-            {
-                //按照宽 来缩放
-                float imageScale = maxLength / self.size.width;
-                maxHeight = self.size.height * imageScale;
-            }
-            else if (self.size.width < self.size.height)
-            {
-                float imageScale = maxLength / self.size.height;
-
-                maxWidth = self.size.width * imageScale;
-            }
-        }
-        // 返回新的改变大小后的图片
-        return [self nx_scaleToSize:CGSizeMake(maxWidth, maxHeight)];
-    }
-
-    return self;
-}
-
-#pragma mark - 截取
-- (UIImage *)nx_imageByCroppingWithStyle:(NXCropImageStyle)style
-{
-    CGRect rect = CGRectZero;
-    switch (style)
-    {
-        case NXCropImageStyleLeft:
-            rect = CGRectMake(0, 0, self.size.width / 2, self.size.height);
-            break;
-        case NXCropImageStyleCenter:
-            rect = CGRectMake(self.size.width / 4, 0, self.size.width / 2, self.size.height);
-            break;
-        case NXCropImageStyleRight:
-            rect = CGRectMake(self.size.width / 2, 0, self.size.width / 2, self.size.height);
-            break;
-        case NXCropImageStyleLeftOneOfThird:
-            rect = CGRectMake(0, 0, self.size.width / 3, self.size.height);
-            break;
-        case NXCropImageStyleCenterOneOfThird:
-            rect = CGRectMake(self.size.width / 3, 0, self.size.width / 3, self.size.height);
-            break;
-        case NXCropImageStyleRightOneOfThird:
-            rect = CGRectMake(self.size.width / 3 * 2, 0, self.size.width / 3, self.size.height);
-            break;
-        case NXCropImageStyleLeftQuarter:
-            rect = CGRectMake(0, 0, self.size.width / 4, self.size.height);
-            break;
-        case NXCropImageStyleCenterLeftQuarter:
-            rect = CGRectMake(self.size.width / 4, 0, self.size.width / 4, self.size.height);
-            break;
-        case NXCropImageStyleCenterRightQuarter:
-            rect = CGRectMake(self.size.width / 4 * 2, 0, self.size.width / 4, self.size.height);
-            break;
-        case NXCropImageStyleRightQuarter:
-            rect = CGRectMake(self.size.width / 4 * 3, 0, self.size.width / 4, self.size.height);
-            break;
-        default:
-            break;
-    }
-
-    return [self imageByCroppingWithRect:rect];
-}
-
-- (UIImage *)imageByCroppingWithRect:(CGRect)rect
-{
-    CGImageRef imageRef = self.CGImage;
-    CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, rect);
-    UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
-    CGImageRelease(imagePartRef);
-    return cropImage;
-}
-
-- (UIImage *)nx_cropImageToSquare{
-
-    if(self.size.width == self.size.height)
-    {
-        return self;
-    }
-    double w = self.size.width;
-    double h = self.size.height;
-    double m = MIN(w, h);
-    CGRect rect = CGRectMake((self.size.width - m)/2.0f , (self.size.height - m)/2.0f, m, m);
-    return [self imageByCroppingWithRect:rect];
-}
-
-- (UIImage *)nx_zoomWithSize:(CGSize)size{
-
-    if(self == nil)
-    {
-        return nil;
-    }
-    
-    double w  = self.size.width;
-    double h =self.size.height;
-    double vRatio = w / size.width;
-    double hRatio = h / size.height;
-    double ratio = MAX(vRatio, hRatio);
-    w /= ratio;
-    h /= ratio;
-    CGRect drawRect = CGRectMake((size.width - w)/2.0f , (size.height - h)/2.0f, w, h);
-    // 创建一个bitmap的context
-    // 并把它设置成为当前正在使用的context
-    UIGraphicsBeginImageContext(size);
-    // 绘制改变大小的图片
-    [self drawInRect:drawRect];
-    // 从当前context中创建一个改变大小后的图片
-    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
-    // 使当前的context出堆栈
-    UIGraphicsEndImageContext();
-    return  scaledImage;
-    
-}
-
-
-- (UIImage *)nx_zoomImageToSquare
-{
-    if (self == nil)
-    {
-        return nil;
-    }
-    double tw = MIN(self.size.width, self.size.height);
-
-    return [self nx_scaleToSize:CGSizeMake(tw, tw)];
-}
-
-//截屏 有透明的
-+ (UIImage *)nx_screenHierarchyShots:(UIView *)view { return [UIImage nx_screenHierarchyShots:view isOpaque:NO]; }
-//高清截屏 opaque 是否有透明图层
-+ (UIImage *)nx_screenHierarchyShots:(UIView *)view isOpaque:(BOOL)opaque
-{
-    // size——同UIGraphicsBeginImageContext
-    // opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
-    // scale—–缩放因子
-    UIGraphicsBeginImageContextWithOptions(view.bounds.size, opaque, 0);
-    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
-    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
-    UIGraphicsEndImageContext();
-    return image;
-}
-
-/// 获得裁剪后的图片
-+ (UIImage *)nx_cropImageView:(UIImageView *)imageView
-                       toRect:(CGRect)rect
-                    zoomScale:(double)zoomScale
-                containerView:(UIView *)containerView
-                   outputWith:(CGFloat)outputWith
-{
-    CGAffineTransform transform = CGAffineTransformIdentity;
-    // 平移的处理
-    CGRect imageViewRect = [imageView convertRect:imageView.bounds toView:containerView];
-    CGPoint point = CGPointMake(imageViewRect.origin.x + imageViewRect.size.width / 2,
-                                imageViewRect.origin.y + imageViewRect.size.height / 2);
-
-    CGPoint zeroPoint =
-        CGPointMake(CGRectGetWidth(containerView.frame) / 2., CGRectGetHeight(containerView.frame) / 2.);
-
-    CGPoint translation = CGPointMake(point.x - zeroPoint.x, point.y - zeroPoint.y);
-    transform = CGAffineTransformTranslate(transform, translation.x, translation.y);
-    // 缩放的处理
-    transform = CGAffineTransformScale(transform, zoomScale, zoomScale);
-
-    CGImageRef imageRef = [self nx_newTransformedImage:transform
-                                           sourceImage:imageView.image.CGImage
-                                            sourceSize:imageView.image.size
-                                           outputWidth:outputWith
-                                              cropSize:rect.size
-                                         imageViewSize:imageView.frame.size];
-    UIImage *cropedImage = [UIImage imageWithCGImage:imageRef];
-    CGImageRelease(imageRef);
-    return cropedImage;
-}
-
-+ (CGImageRef)nx_newTransformedImage:(CGAffineTransform)transform
-                         sourceImage:(CGImageRef)sourceImage
-                          sourceSize:(CGSize)sourceSize
-                         outputWidth:(CGFloat)outputWidth
-                            cropSize:(CGSize)cropSize
-                       imageViewSize:(CGSize)imageViewSize
-{
-    CGImageRef source = [self nx_newScaledImage:sourceImage toSize:sourceSize];
-
-    CGFloat aspect = cropSize.height / cropSize.width;
-    CGSize outputSize = CGSizeMake(outputWidth, outputWidth * aspect);
-
-    CGContextRef context =
-        CGBitmapContextCreate(NULL, outputSize.width, outputSize.height, CGImageGetBitsPerComponent(source), 0,
-                              CGImageGetColorSpace(source), CGImageGetBitmapInfo(source));
-    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
-    CGContextFillRect(context, CGRectMake(0, 0, outputSize.width, outputSize.height));
-
-    CGAffineTransform uiCoords =
-        CGAffineTransformMakeScale(outputSize.width / cropSize.width, outputSize.height / cropSize.height);
-    uiCoords = CGAffineTransformTranslate(uiCoords, cropSize.width / 2.0, cropSize.height / 2.0);
-    uiCoords = CGAffineTransformScale(uiCoords, 1.0, -1.0);
-    CGContextConcatCTM(context, uiCoords);
-
-    CGContextConcatCTM(context, transform);
-    CGContextScaleCTM(context, 1.0, -1.0);
-
-    CGContextDrawImage(context, CGRectMake(-imageViewSize.width / 2, -imageViewSize.height / 2.0, imageViewSize.width,
-                                           imageViewSize.height),
-                       source);
-    CGImageRef resultRef = CGBitmapContextCreateImage(context);
-    CGContextRelease(context);
-    CGImageRelease(source);
-    return resultRef;
-}
-
-+ (CGImageRef)nx_newScaledImage:(CGImageRef)source toSize:(CGSize)size
-{
-    CGSize srcSize = size;
-    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
-    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, rgbColorSpace,
-                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
-    CGColorSpaceRelease(rgbColorSpace);
-
-    CGContextSetInterpolationQuality(context, kCGInterpolationNone);
-    CGContextTranslateCTM(context, size.width / 2, size.height / 2);
-
-    CGContextDrawImage(context, CGRectMake(-srcSize.width / 2, -srcSize.height / 2, srcSize.width, srcSize.height),
-                       source);
-
-    CGImageRef resultRef = CGBitmapContextCreateImage(context);
-    CGContextRelease(context);
-    return resultRef;
-}
-
-#pragma mark - 圆角
-+ (UIImage *)nx_circleImage:(UIImage *)img
-{
-   return [self nx_circleImage:img cuttingDirection:UIRectCornerAllCorners cornerRadii:img.size.height/2. borderWidth:0 borderColor: [UIColor clearColor] backgroundColor: [UIColor clearColor]];
-}
-
-+ (UIImage *)nx_circleImage:(UIImage *)image cuttingDirection:(UIRectCorner)direction cornerRadii:(CGFloat)cornerRadii borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor backgroundColor:(UIColor *)backgroundColor
-{
-    //处理后的数据
-    UIImage * newImage = nil;
-    if (image.size.height != 0 && image.size.width != 0)
-    {
-        if (cornerRadii == 0)
-        {
-            cornerRadii = image.size.height / 2;
-        }
-        CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
-        UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
-        CGContextRef currnetContext = UIGraphicsGetCurrentContext();
-        if (currnetContext) {
-            
-            UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:direction cornerRadii:CGSizeMake(cornerRadii - borderWidth, cornerRadii - borderWidth)];
-            CGContextAddPath(currnetContext,path.CGPath);
-            CGContextClip(currnetContext);
-            
-            [image drawInRect:rect];
-            [borderColor setStroke];// 画笔颜色
-            [backgroundColor setFill];// 填充颜色
-            [path stroke];
-            [path fill];
-            newImage = UIGraphicsGetImageFromCurrentImageContext();
-            UIGraphicsEndImageContext();
-        }
-        
-        return newImage;
-    }
-    
-    return newImage;
-}
-
-+ (UIImage *)nx_launchImage
-{
-    CGSize viewSize  = [UIScreen mainScreen].bounds.size;
-    
-    NSString * viewOrientation = @"Portrait";
-    NSString * launchImageName = nil;
-    NSArray * imageDict = [[[NSBundle mainBundle] infoDictionary]valueForKey:@"UILaunchImages"];
-    for (NSDictionary  * dict in imageDict)
-    {
-        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
-        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
-        {
-            launchImageName = dict[@"UILaunchImageName"];
-        }
-    }
-    UIImage * launchImage = [UIImage imageNamed:launchImageName];
-    
-    return launchImage;
-}
-
-
-+ (UIImage*)transparentBackClear:(UIImage*)image color:(UIColor*)color
-{
-    // 分配内存
-    const int imageWidth = image.size.width;
-    const int imageHeight = image.size.height;
-    size_t bytesPerRow = imageWidth * 4;
-    uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
-    
-    // 创建context
-    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
-    CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
-                                                 kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
-    CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
-    
-    // 遍历像素
-    int pixelNum = imageWidth * imageHeight;
-    uint32_t* pCurPtr = rgbImageBuf;
-    for (int i = 0; i < pixelNum; i++, pCurPtr++)
-    {
-        if ((*pCurPtr & 0xFFFFFF00) == 0xffffff00) {
-            
-            // 此处把白色背景颜色给变为透明
-            uint8_t* ptr = (uint8_t*)pCurPtr;
-            ptr[0] = 0;
-            
-        }else{
-            
-            // 改成下面的代码,会将图片转成想要的
-            //            uint8_t* ptr = (uint8_t*)pCurPtr;
-            //
-            //            ptr[3] = 0; //0~255
-            //
-            //            ptr[2] = 0;
-            //
-            //            ptr[1] = 0;
-        }
-    }
-    
-    // 将内存转成image
-    CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
-    
-    CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,
-                                        kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,
-                                        NULL, true,kCGRenderingIntentDefault);
-    CGDataProviderRelease(dataProvider);
-    
-    UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
-    
-    // 释放
-    CGImageRelease(imageRef);
-    CGContextRelease(context);
-    CGColorSpaceRelease(colorSpace);
-    
-    return resultUIImage;
-}
-
-void ProviderReleaseData (void *info, const void *data, size_t size)
-{
-    free((void*)data);
-}
-
-@end

+ 7 - 4
BFCommonKit/Classes/BFConfig/PQBFConfig.swift

@@ -1,14 +1,14 @@
 //
-//  PQBFConfig.swift
-//  BFFramework
+//  BFConfig.swift
+//  BFCommonKit
 //
 //  Created by SanW on 2021/6/4.
 //  111
 
 import UIKit
 
-public class PQBFConfig: NSObject {
-    public static let shared = PQBFConfig()
+public class BFConfig: NSObject {
+    public static let shared = BFConfig()
     /**
      // 主题适配方案一
      styleColor = nomal
@@ -64,6 +64,9 @@ public class PQBFConfig: NSObject {
     public var speedStuckBtnImage_N = "speedstuck_n"
     public var speedStuckBtnImage_H = "speedstuck_h"
     
+    //add by ak 保存到的系统相册是否带水印+片尾,要求票圈视频要带水印, 乐活圈不带水印
+    public var enableWatermarkMovie:Bool = false
+    
     //闪音卡点发布分享朋友圈使用图片名
     public var shareFriendBtnImage = "reCreate_opration_friend"
     //从系统相册选择图片名

+ 155 - 170
BFCommonKit/Classes/BFEnums/Enums.swift

@@ -43,88 +43,88 @@ public  enum  PQVIDEO_PLAY_STATUS {
 /// 页面场景
 public  enum  PAGESOURCE: String {
     /*************** 视频相关pageSource ***************/
-    case sp_category = "shanyinApp-category" //   首页-单列
-    case sp_category_recommend = "shanyinApp-category_recommend" // 由首页单列右划
-    case sp_categoryDouble = "shanyinApp-categoryDouble" // 首页-双列
-    case sp_videoDetail = "shanyinApp-videoDetail" // 视频详情页
-    case sp_videoDetail_search = "shanyinApp-videoDetail_search" //    由搜索结果列表进入
-    case sp_videoDetail_search_recommend = "shanyinApp-videoDetail_search_recommend" // 由搜索结果列表进入
-    case sp_videoDetail_upload = "shanyinApp-videoDetail_upload" //     由我的tab中“作品”列表进入
-    case sp_videoDetail_upload_recommend = "shanyinApp-videoDetail_upload_recommend" // 、由我的tab中“作品”列表进入
-    case sp_videoDetail_favorite = "shanyinApp-videoDetail_favorite" // 由我的喜欢列表进入
-    case sp_videoDetail_share = "shanyinApp-videoDetail_share" // 由我的分享列表进入
-    case sp_videoDetail_favorite_recommend = "shanyinApp-videoDetail_favorite_recommend" // 由我的喜欢列表推荐
-    case sp_userHomePage = "shanyinApp-userHomePage" // 用户个人主页
-    case sp_videoDetail_userHomePage = "shanyinApp-videoDetail_userHomePage" // 由用户个人主页进入
-    case sp_videoDetail_userHomePage_recommend = "shanyinApp-videoDetail_userHomePage_recommend" // 由用户个人主页进入
-    case sp_recommendBottom = "shanyinApp-recommendBottom" //    底部展示的3个相关推荐视频
-    case sp_follow = "shanyinApp-follow" // 关注tab
-    case sp_follow_recommend = "shanyinApp-follow_recommend" // 由关注列表右划
-    case sp_followSingle = "shanyinApp-followSingle" // 关注tab点击顶部个人头像进入某个人的关注
-    case sp_followSingle_recommend = "shanyinApp-followSingle_recommend" // 关注tab点击顶部个人头像进入某个人的关注
+    case sp_category = "speedApp-category" //   首页-单列
+    case sp_category_recommend = "speedApp-category_recommend" // 由首页单列右划
+    case sp_categoryDouble = "speedApp-categoryDouble" // 首页-双列
+    case sp_videoDetail = "speedApp-videoDetail" // 视频详情页
+    case sp_videoDetail_search = "speedApp-videoDetail_search" //    由搜索结果列表进入
+    case sp_videoDetail_search_recommend = "speedApp-videoDetail_search_recommend" // 由搜索结果列表进入
+    case sp_videoDetail_upload = "speedApp-videoDetail_upload" //     由我的tab中“作品”列表进入
+    case sp_videoDetail_upload_recommend = "speedApp-videoDetail_upload_recommend" // 、由我的tab中“作品”列表进入
+    case sp_videoDetail_favorite = "speedApp-videoDetail_favorite" // 由我的喜欢列表进入
+    case sp_videoDetail_share = "speedApp-videoDetail_share" // 由我的分享列表进入
+    case sp_videoDetail_favorite_recommend = "speedApp-videoDetail_favorite_recommend" // 由我的喜欢列表推荐
+    case sp_userHomePage = "speedApp-userHomePage" // 用户个人主页
+    case sp_videoDetail_userHomePage = "speedApp-videoDetail_userHomePage" // 由用户个人主页进入
+    case sp_videoDetail_userHomePage_recommend = "speedApp-videoDetail_userHomePage_recommend" // 由用户个人主页进入
+    case sp_recommendBottom = "speedApp-recommendBottom" //    底部展示的3个相关推荐视频
+    case sp_follow = "speedApp-follow" // 关注tab
+    case sp_follow_recommend = "speedApp-follow_recommend" // 由关注列表右划
+    case sp_followSingle = "speedApp-followSingle" // 关注tab点击顶部个人头像进入某个人的关注
+    case sp_followSingle_recommend = "speedApp-followSingle_recommend" // 关注tab点击顶部个人头像进入某个人的关注
     case sp_mine = "speedApp-mine" // 我的tab
-    case sp_search = "shanyinApp-search" // 搜索页
-    case sp_uploadVideo = "shanyinApp-uploadVideo" // 视频制作入口
+    case sp_search = "speedApp-search" // 搜索页
+    case sp_uploadVideo = "speedApp-uploadVideo" // 视频制作入口
 
     /*************** 活动相关pageSource ***************/
-    case sp_activity_entranceButton = "shanyinApp_playActivity_entranceButton" // 活动活动入口按键
-    case sp_activity_invite = "shanyinApp_playActivity_invite" // H5页面内邀请好友按键
-    case sp_activity_threeDot = "shanyinApp_playActivity_threeDot" // APP右上角…按键
-    case sp_activity_shareFriend = "shanyinApp_playActivity_shareFriend" // 进一步点击分享好友
-    case sp_activity_shareMoment = "shanyinApp_playActivity_shareMoment" // 进一步点击分享朋友圈
-    case sp_activity_openH5 = "shanyinApp_playActivity_completeOpenH5" // 当天完成活动的弹窗->去查看
-    case sp_activity_openH5AndPayment = "shanyinApp_playActivity_completeOpenH5AndPayment" // 当天完成活动的弹窗->报名明日
-    case sp_activity_failOpenH5 = "shanyinApp_playActivity_missionFailWindowOpenH5" // 未成功弹窗->继续活动
-    case sp_activity_success_share = "shanyinApp_playActivity_missionSuccessWindow_share" // 成功弹窗->分享给好友炫耀下
-    case sp_activity_entrance_close = "shanyinApp_playActivity_entrance_close" // 活动入口弹窗->关闭按钮
-    case sp_activity_entranceWindow = "shanyinApp_playActivity_entranceWindow" // 活动入口弹窗
-    case sp_activity_successWindow = "shanyinApp_playActivity_missionSuccessWindow" // 成功弹窗
-    case sp_activity_failWindow = "shanyinApp_playActivity_missionFailWindow" // 未成功弹窗
-    case sp_activity_completeWindow = "shanyinApp_playActivity_missionCompleteWindow" //  当天完成活动的弹窗
+    case sp_activity_entranceButton = "speedApp_playActivity_entranceButton" // 活动活动入口按键
+    case sp_activity_invite = "speedApp_playActivity_invite" // H5页面内邀请好友按键
+    case sp_activity_threeDot = "speedApp_playActivity_threeDot" // APP右上角…按键
+    case sp_activity_shareFriend = "speedApp_playActivity_shareFriend" // 进一步点击分享好友
+    case sp_activity_shareMoment = "speedApp_playActivity_shareMoment" // 进一步点击分享朋友圈
+    case sp_activity_openH5 = "speedApp_playActivity_completeOpenH5" // 当天完成活动的弹窗->去查看
+    case sp_activity_openH5AndPayment = "speedApp_playActivity_completeOpenH5AndPayment" // 当天完成活动的弹窗->报名明日
+    case sp_activity_failOpenH5 = "speedApp_playActivity_missionFailWindowOpenH5" // 未成功弹窗->继续活动
+    case sp_activity_success_share = "speedApp_playActivity_missionSuccessWindow_share" // 成功弹窗->分享给好友炫耀下
+    case sp_activity_entrance_close = "speedApp_playActivity_entrance_close" // 活动入口弹窗->关闭按钮
+    case sp_activity_entranceWindow = "speedApp_playActivity_entranceWindow" // 活动入口弹窗
+    case sp_activity_successWindow = "speedApp_playActivity_missionSuccessWindow" // 成功弹窗
+    case sp_activity_failWindow = "speedApp_playActivity_missionFailWindow" // 未成功弹窗
+    case sp_activity_completeWindow = "speedApp_playActivity_missionCompleteWindow" //  当天完成活动的弹窗
 
     /*************** 上传相关pageSource ***************/
-    case sp_upload_videoSelect = "shanyinApp-upload_videoSelect" //  选视频-进入页面事件
-    case sp_upload_coverSelect = "shanyinApp-upload_coverSelect" //  选封面-进入页面事件
-    case sp_upload_videoPublish = "shanyinApp-upload_videoPublish" //  发布-进入页面事件
+    case sp_upload_videoSelect = "speedApp-upload_videoSelect" //  选视频-进入页面事件
+    case sp_upload_coverSelect = "speedApp-upload_coverSelect" //  选封面-进入页面事件
+    case sp_upload_videoPublish = "speedApp-upload_videoPublish" //  发布-进入页面事件
 
     /*************** tab点击相关pageSource ***************/
-    case sp_categoryTabButton = "shanyinApp-categoryTabButton" //  首页tab
-    case sp_followTabButton = "shanyinApp-followTabButton" //  关注tab
-    case sp_uploadTabButton = "shanyinApp-uploadTabButton" //  上传tab
-    case sp_mineTabButton = "shanyinApp-mineTabButton" //  我的tab
-    case sp_msg_tabBtn = "shanyinApp_msgTabButton" //  消息tab
+    case sp_categoryTabButton = "speedApp-categoryTabButton" //  首页tab
+    case sp_followTabButton = "speedApp-followTabButton" //  关注tab
+    case sp_uploadTabButton = "speedApp-uploadTabButton" //  上传tab
+    case sp_mineTabButton = "speedApp-mineTabButton" //  我的tab
+    case sp_msg_tabBtn = "speedApp_msgTabButton" //  消息tab
 
     /*************** 发布pageSource ***************/
-    case sp_videoMaking = "shanyinApp-videoMaking" // 视频创作
-    case sp_videoCompose_guid = "shanyinApp-videoCompose_guid" // 预览页面
-    case sp_videoCompose_edit = "shanyinApp-videoCompose_edit" // 编辑页面
-    case sp_videoCompose_overview = "shanyinApp-videoCompose_overview" // 总览页面
-    case sp_videoCompose_composition = "shanyinApp-videoCompose_composition" // 合成页面
+    case sp_videoMaking = "speedApp-videoMaking" // 视频创作
+    case sp_videoCompose_guid = "speedApp-videoCompose_guid" // 预览页面
+    case sp_videoCompose_edit = "speedApp-videoCompose_edit" // 编辑页面
+    case sp_videoCompose_overview = "speedApp-videoCompose_overview" // 总览页面
+    case sp_videoCompose_composition = "speedApp-videoCompose_composition" // 合成页面
     case sp_material_search = "vlog-pages/user-videos-share" // 素材搜索上报
 
     /*************** 消息pageSource ***************/
-    case sp_msg_shareSpace = "shanyinApp-message" // 分享空间
-    case sp_msg_shareSpace_detail = "shanyinApp-message_shareSpace" // 分享空间详情
-    case sp_msg_share = "shanyinApp-message_share" // 分享
-    case sp_msg_like = "shanyinApp-message_like" // 喜欢
-    case sp_msg_fans = "shanyinApp-message_fans" // 粉丝
-    case sp_msg_push = "shanyinApp-message_push" // 通知
+    case sp_msg_shareSpace = "speedApp-message" // 分享空间
+    case sp_msg_shareSpace_detail = "speedApp-message_shareSpace" // 分享空间详情
+    case sp_msg_share = "speedApp-message_share" // 分享
+    case sp_msg_like = "speedApp-message_like" // 喜欢
+    case sp_msg_fans = "speedApp-message_fans" // 粉丝
+    case sp_msg_push = "speedApp-message_push" // 通知
 
     /*************** 草稿箱相关pageSource ***************/
-    case sp_draft_projectList = "shanyinApp-projectList" // 草稿箱列表
-    case sp_reproduce_childList = "shanyinApp-reproduceCollection_child" // 再制作子列表页面
-    case sp_reproduce_fatherList = "shanyinApp-reproduceCollection_father" // 再制作父列表页面
-    case sp_reproduce_chilDetailList = "shanyinApp-videoDetail_reproduceCollection_child" // 再制作子列表页面
-    case sp_reproduce_fatherDetailList = "shanyinApp-videoDetail_reproduceCollection_father" // 再制作父列表页面
+    case sp_draft_projectList = "speedApp-projectList" // 草稿箱列表
+    case sp_reproduce_childList = "speedApp-reproduceCollection_child" // 再制作子列表页面
+    case sp_reproduce_fatherList = "speedApp-reproduceCollection_father" // 再制作父列表页面
+    case sp_reproduce_chilDetailList = "speedApp-videoDetail_reproduceCollection_child" // 再制作子列表页面
+    case sp_reproduce_fatherDetailList = "speedApp-videoDetail_reproduceCollection_father" // 再制作父列表页面
     // add by ak
-    case sp_shanyinApp_upload2Compose = "shanyinApp-upload2Compose" // 上传转创作
+    case sp_shanyinApp_upload2Compose = "speedApp-upload2Compose" // 上传转创作
 
     /*************** 卡点视频相关pageSource ***************/
-    case sp_stuck_selectMaterial = "shanyinApp-selectSyncedUpMaterial" // 卡点视频素材选择页
-    case sp_stuck_selectSynceedUpMusic = "shanyinApp-selectSynceedUpMusic" // 卡点视频音乐选择页
-    case sp_stuck_previewSyncedUp = "shanyinApp_previewSyncedUp" // 预览页面曝光上报
-    case sp_stuck_searchSyncedUpMusic = "shanyinApp_searchSyncedUpMusic" // 音乐素材搜索页
-    case sp_stuck_publishSyncedUp = "shanyinApp_publishSyncedUp" // 合成发布页
+    case sp_stuck_selectMaterial = "speedApp-selectSyncedUpMaterial" // 卡点视频素材选择页
+    case sp_stuck_selectSynceedUpMusic = "speedApp-selectSynceedUpMusic" // 卡点视频音乐选择页
+    case sp_stuck_previewSyncedUp = "speedApp_previewSyncedUp" // 预览页面曝光上报
+    case sp_stuck_searchSyncedUpMusic = "speedApp_searchSyncedUpMusic" // 音乐素材搜索页
+    case sp_stuck_publishSyncedUp = "speedApp_publishSyncedUp" // 合成发布页
     
     /*************** 话题相关pageSource ***************/
     case sp_cmunit_collect = "collectAgeGenderPage" // 年龄 / 话题收集页
@@ -147,7 +147,7 @@ public  enum  PAGESOURCE: String {
     case sp_cmunit_mePage = "mePage" // 我的页
     case sp_cmunit_userPage = "homePage" // 个人主页
     //点击上报:首页点击底部“我的”页面入口
-    case sp_shanyinApp_main = "shanyinApp-main"
+    case sp_shanyinApp_main = "speedApp-main"
     //页面曝光上报:“我的”页面曝光
     case sp_shanyinApp_mine = "shanyinApp-mine"
     
@@ -163,80 +163,80 @@ public  enum  PAGESOURCE: String {
 public  enum  objectType: String {
     /*************** tab点击相关pageSource ***************/
 
-    case ot_home_tabBtn = "shanyinApp-categoryTabButton" //  首页tab
-    case ot_follow_tabBtn = "shanyinApp-followTabButton" //  关注tab
-    case ot_up_tabBtn = "shanyinApp-uploadTabButton" //  上传tab
-    case ot_mine_tabBtn = "shanyinApp-mineTabButton" //  我的tab
-    case ot_public_tabBtn = "shanyinApp-publicTabButton" //  发布tab
-    case ot_msg_tabBtn = "shanyinApp_msgTabButton" //  消息tab
+    case ot_home_tabBtn = "speedApp-categoryTabButton" //  首页tab
+    case ot_follow_tabBtn = "speedApp-followTabButton" //  关注tab
+    case ot_up_tabBtn = "speedApp-uploadTabButton" //  上传tab
+    case ot_mine_tabBtn = "speedApp-mineTabButton" //  我的tab
+    case ot_public_tabBtn = "speedApp-publicTabButton" //  发布tab
+    case ot_msg_tabBtn = "speedApp_msgTabButton" //  消息tab
 
     /*************** 上传相关objectType ***************/
-    case ot_up_backBtn = "shanyinApp-uploadBackButton" // 点击左下角叉子
-    case ot_up_nextBtn = "shanyinApp-uploadNextButton" // 点击右下角下一步
-    case ot_up_coverBtn = "shanyinApp-uploadCoverButton" // 点击上传封面
-    case ot_up_pickCoverBtn = "shanyinApp-pickCoverButton" // 点击截取封面
-    case ot_up_publishBtn = "shanyinApp-videoPublishButton" // 点击发布
-    case ot_up_changeCoverBtn = "shanyinApp-changeCoverButton" // 点击选封面返回
-    case ot_up_start = "shanyinApp-uploadStart" // 上传开始事件
-    case ot_up_fail = "shanyinApp-uploadFail" // 上传中断/失败事件
-    case ot_up_restart = "shanyinApp-uploadRestart" // 上传重试事件
-    case ot_up_success = "shanyinApp-uploadSuccess" // 上传完成
-    case ot_up_publishSuccess = "shanyinApp-videoPublishSuccess" // 发布完成
-    case ot_up_viewPopup_guideUsersToShare = "shanyinApp_viewPopup_guideUsersToShare_pubishVideo" // 发布成功弹出分享界面
-    case ot_up_clickWechatMoments_guideUsersToShare = "shanyinApp_clickWechatMoments_guideUsersToShare_pubishVideo" // 分享介面点击微信朋友圈
-    case ot_up_clickWechat_guideUsersToShare = "shanyinApp_clickWechat_guideUsersToShare_pubishVideo"
-    case ot_selectVideoProductionMode = "shanyinApp_viewWindow_selectVideoProductionMode"
+    case ot_up_backBtn = "speedApp-uploadBackButton" // 点击左下角叉子
+    case ot_up_nextBtn = "speedApp-uploadNextButton" // 点击右下角下一步
+    case ot_up_coverBtn = "speedApp-uploadCoverButton" // 点击上传封面
+    case ot_up_pickCoverBtn = "speedApp-pickCoverButton" // 点击截取封面
+    case ot_up_publishBtn = "speedApp-videoPublishButton" // 点击发布
+    case ot_up_changeCoverBtn = "speedApp-changeCoverButton" // 点击选封面返回
+    case ot_up_start = "speedApp-uploadStart" // 上传开始事件
+    case ot_up_fail = "speedApp-uploadFail" // 上传中断/失败事件
+    case ot_up_restart = "speedApp-uploadRestart" // 上传重试事件
+    case ot_up_success = "speedApp-uploadSuccess" // 上传完成
+    case ot_up_publishSuccess = "speedApp-videoPublishSuccess" // 发布完成
+    case ot_up_viewPopup_guideUsersToShare = "speedApp_viewPopup_guideUsersToShare_pubishVideo" // 发布成功弹出分享界面
+    case ot_up_clickWechatMoments_guideUsersToShare = "speedApp_clickWechatMoments_guideUsersToShare_pubishVideo" // 分享介面点击微信朋友圈
+    case ot_up_clickWechat_guideUsersToShare = "speedApp_clickWechat_guideUsersToShare_pubishVideo"
+    case ot_selectVideoProductionMode = "speedApp_viewWindow_selectVideoProductionMode"
     // 分享界面点击微信好友
     /*************** 创作工具相关objectType ***************/
     case ot_makevideo_video = "video" // 视频
     case ot_makevideo_gif = "gif" // 动态图
     case ot_makevideo_jpg = "jpg" // 图片
-    case ot_enterComposeToolButton = "shanyinApp_enterComposeToolButton" // 点击上传tab后-点击发布视频 add by ak & 视频合成入口
-    case ot_enterVideoUploadButton = "shanyinApp_enterVideoUploadButton" // 点击上传tab后-点击上传视频
-    case ot_videoCompose_overviewButton = "shanyinApp_videoCompose_overviewButton" // 点击总览
-    case ot_videoCompose_videoCompositeButton = "shanyinApp_videoCompose_videoCompositeButton" // 点击去发布
-    case ot_videoCompose_videoPublish = "shanyinApp_videoPublishButton" // 发布视频
-    case ot_shanyinApp_searchButton = "shanyinApp_searchButton" // 发布视频
+    case ot_enterComposeToolButton = "speedApp_enterComposeToolButton" // 点击上传tab后-点击发布视频 add by ak & 视频合成入口
+    case ot_enterVideoUploadButton = "speedApp_enterVideoUploadButton" // 点击上传tab后-点击上传视频
+    case ot_videoCompose_overviewButton = "speedApp_videoCompose_overviewButton" // 点击总览
+    case ot_videoCompose_videoCompositeButton = "speedApp_videoCompose_videoCompositeButton" // 点击去发布
+    case ot_videoCompose_videoPublish = "speedApp_videoPublishButton" // 发布视频
+    case ot_shanyinApp_searchButton = "speedApp_searchButton" // 发布视频
     case ot_pageView = "pageView" // 页面访问
     //
     // 图文入口
-    case ot_shanyinApp_clickButton_imageAndTextGenerateVideo = "shanyinApp_clickButton_imageAndTextGenerateVideo"
+    case ot_shanyinApp_clickButton_imageAndTextGenerateVideo = "speedApp_clickButton_imageAndTextGenerateVideo"
     // 电子相册
-    case ot_shanyinApp_clickButton_electronicAlbum = "shanyinApp_clickButton_electronicAlbum"
+    case ot_shanyinApp_clickButton_electronicAlbum = "speedApp_clickButton_electronicAlbum"
     /*************** 消息相关objectType ***************/
-    case ot_msg_fansMsgButton = "shanyinApp_msgTab_fansMsgButton" //  粉丝消息入口
-    case ot_msg_likeMsgButton = "shanyinApp_msgTab_likeMsgButton" //  喜欢消息入口
-    case ot_msg_shareMsgButton = "shanyinApp_msgTab_shareMsgButton" //  分享消息入口
-    case ot_msg_commentMsgButton = "shanyinApp_msgTab_commentMsgButton" //  评论消息入口
-    case ot_msg_systemMsgButton = "shanyinApp_msgTab_systemMsgButton" //  通知消息入口
+    case ot_msg_fansMsgButton = "speedApp_msgTab_fansMsgButton" //  粉丝消息入口
+    case ot_msg_likeMsgButton = "speedApp_msgTab_likeMsgButton" //  喜欢消息入口
+    case ot_msg_shareMsgButton = "speedApp_msgTab_shareMsgButton" //  分享消息入口
+    case ot_msg_commentMsgButton = "speedApp_msgTab_commentMsgButton" //  评论消息入口
+    case ot_msg_systemMsgButton = "speedApp_msgTab_systemMsgButton" //  通知消息入口
 
     /*************** 消息详情相关objectType ***************/
-    case ot_msg_shareSpaceViewTab = "shanyinApp_message_shareSpace_viewTab" // 分享空间详情页观看
-    case ot_msg_shareSpaceLikeTab = "shanyinApp_message_shareSpace_likeTab" // 分享空间详情页喜欢
-    case ot_msg_shareSpaceCommentTab = "shanyinApp_message_shareSpace_commentTab" // 分享空间详情页评论
-    case ot_msg_shareSpaceShareTab = "shanyinApp_message_shareSpace_shareTab" // 分享空间详情页分享
+    case ot_msg_shareSpaceViewTab = "speedApp_message_shareSpace_viewTab" // 分享空间详情页观看
+    case ot_msg_shareSpaceLikeTab = "speedApp_message_shareSpace_likeTab" // 分享空间详情页喜欢
+    case ot_msg_shareSpaceCommentTab = "speedApp_message_shareSpace_commentTab" // 分享空间详情页评论
+    case ot_msg_shareSpaceShareTab = "speedApp_message_shareSpace_shareTab" // 分享空间详情页分享
 
     /*************** 草稿箱相关objectType ***************/
-    case ot_draft_clicktButton = "shanyinApp_clickOpenProjectListButton" // 草稿箱点击入口
-    case ot_draft_editProject = "shanyinApp_editProject" // - 点击 Project Item(草稿箱中的每个项目)
-    case ot_draft_viewProject = "shanyinApp_viewProject" // - 看到 Project Item(草稿箱中的每个项目)
-    case ot_draft_clickEditProject = "shanyinApp_clickEditProject" // - 点击 Project Item 弹出菜单的「编辑」按钮
-    case ot_draft_clickPublishProject = "shanyinApp_clickPublishProject" // - 点击 Project Item 弹出菜单的「去发布」按钮
-    case ot_draft_clickRenameProject = "shanyinApp_clickRenameProject" // - 点击 Project Item 弹出菜单的「重命名」按钮
-    case ot_draft_clickCopyProject = "shanyinApp_clickCopyProject" // - 点击 Project Item 弹出菜单的「复制」按钮
-    case ot_draft_clickDeleteProject = "shanyinApp_clickDeleteProject" // - 点击 Project Item 弹出菜单的「删除」按钮
-    case ot_draft_uploadMaterial = "shanyinApp_uploadMaterial" // - 素材开始上传事件
-    case ot_draft_uploadMatrialSuccess = "shanyinApp_uploadMatrialSuccess" // - 素材上传成功事件
-    case ot_draft_downloadMaterial = "shanyinApp_downloadMaterial" // - 素材开始下载事件
-    case ot_draft_downloadMaterialSuccess = "shanyinApp_downloadMaterialSuccess" // - 素材下载成功事件
-    case ot_videoCompose_mux_complete = "shanyinApp_videoCompose_mux_complete" // 创作工具「合成成功」添加上报参数
-
-    case ot_reproduce_collectionClicButton = "shanyinApp_clickReproduceButton_collection" // - 再创作集合页的「再创作按钮」
-    case ot_reproduce_clickButton = "shanyinApp_clickReProduceButton" // 再创作按钮(右上角)点击上报
-    case ot_reproduce_collectionBar = "shanyinApp_clickReproduceCollectionBar" // 再创作按钮(左下角)点击上报
-    case ot_reproduce_collectionVideo = "shanyinApp_clickReproduceCollectionVideo" // 再创作集合页的「视频」点击上报
-    case ot_reproduce_sameSourceButton = "shanyinApp_viewSameSourceButton" // 再创作查看同款来源按钮
-    case ot_reproduce_saveProjectToDraftBox = "shanyinApp-saveProjectToDraftBox" // 创作工具「保存项目成功」添加上报参数
+    case ot_draft_clicktButton = "speedApp_clickOpenProjectListButton" // 草稿箱点击入口
+    case ot_draft_editProject = "speedApp_editProject" // - 点击 Project Item(草稿箱中的每个项目)
+    case ot_draft_viewProject = "speedApp_viewProject" // - 看到 Project Item(草稿箱中的每个项目)
+    case ot_draft_clickEditProject = "speedApp_clickEditProject" // - 点击 Project Item 弹出菜单的「编辑」按钮
+    case ot_draft_clickPublishProject = "speedApp_clickPublishProject" // - 点击 Project Item 弹出菜单的「去发布」按钮
+    case ot_draft_clickRenameProject = "speedApp_clickRenameProject" // - 点击 Project Item 弹出菜单的「重命名」按钮
+    case ot_draft_clickCopyProject = "speedApp_clickCopyProject" // - 点击 Project Item 弹出菜单的「复制」按钮
+    case ot_draft_clickDeleteProject = "speedApp_clickDeleteProject" // - 点击 Project Item 弹出菜单的「删除」按钮
+    case ot_draft_uploadMaterial = "speedApp_uploadMaterial" // - 素材开始上传事件
+    case ot_draft_uploadMatrialSuccess = "speedApp_uploadMatrialSuccess" // - 素材上传成功事件
+    case ot_draft_downloadMaterial = "speedApp_downloadMaterial" // - 素材开始下载事件
+    case ot_draft_downloadMaterialSuccess = "speedApp_downloadMaterialSuccess" // - 素材下载成功事件
+    case ot_videoCompose_mux_complete = "speedApp_videoCompose_mux_complete" // 创作工具「合成成功」添加上报参数
+
+    case ot_reproduce_collectionClicButton = "speedApp_clickReproduceButton_collection" // - 再创作集合页的「再创作按钮」
+    case ot_reproduce_clickButton = "speedApp_clickReProduceButton" // 再创作按钮(右上角)点击上报
+    case ot_reproduce_collectionBar = "speedApp_clickReproduceCollectionBar" // 再创作按钮(左下角)点击上报
+    case ot_reproduce_collectionVideo = "speedApp_clickReproduceCollectionVideo" // 再创作集合页的「视频」点击上报
+    case ot_reproduce_sameSourceButton = "speedApp_viewSameSourceButton" // 再创作查看同款来源按钮
+    case ot_reproduce_saveProjectToDraftBox = "speedApp-saveProjectToDraftBox" // 创作工具「保存项目成功」添加上报参数
     // add by ak
     case speedApp_viewWindow_upload2Compose // 「上传转创作」:窗口曝光
     case speedApp_clickButton_upload2Compose_addMusic // 「上传转创作」:加音乐 - 按钮点击
@@ -288,69 +288,69 @@ public  enum  objectType: String {
     case ot_shanyinApp_clickButton_syncedUpMusic = "shanyinApp_clickButton_syncedUpMusic"
 
     // 视频播放点击
-    case ot_shanyinApp_clickButton_syncedUpMusicRecreate = "shanyinApp_clickButton_syncedUpMusicRecreate"
-    case ot_shanyinApp_viewButton_syncedUpMusicRecreate = "shanyinApp_viewButton_syncedUpMusicRecreate"
+    case ot_shanyinApp_clickButton_syncedUpMusicRecreate = "speedApp_clickButton_syncedUpMusicRecreate"
+    case ot_shanyinApp_viewButton_syncedUpMusicRecreate = "speedApp_viewButton_syncedUpMusicRecreate"
     // 点击上报:首页点击底部“我的”页面入口
-    case ot_shanyinApp_clickButton_mineTab = "shanyinApp_clickButton_mineTab"
+    case ot_shanyinApp_clickButton_mineTab = "speedApp_clickButton_mineTab"
     // 页面曝光上报:“我的”页面曝光
-    case ot_shanyinApp_viewPage_mineTab = "shanyinApp_viewPage_mineTab"
+    case ot_shanyinApp_viewPage_mineTab = "speedApp_viewPage_mineTab"
     // 编辑标题和封面
-    case ot_shanyinApp_clickButton_changeTitle = "shanyinApp_clickButton_changeTitle"
-    case ot_shanyinApp_clickButton_changeCover = "shanyinApp_clickButton_changeCover"
+    case ot_shanyinApp_clickButton_changeTitle = "speedApp_clickButton_changeTitle"
+    case ot_shanyinApp_clickButton_changeCover = "speedApp_clickButton_changeCover"
     
     //1.2.0版本快慢速
     //点击快慢速
-    case ot_shanyinApp_musicVideoPreview_selectPatternSpeed = "shanyinApp_musicVideoPreview_selectPatternSpeed"
+    case ot_shanyinApp_musicVideoPreview_selectPatternSpeed = "speedApp_musicVideoPreview_selectPatternSpeed"
     //点击跳跃卡点
-    case ot_shanyinApp_musicVideoPreview_selectPatternMusicVideo = "shanyinApp_musicVideoPreview_selectPatternMusicVideo"
+    case ot_shanyinApp_musicVideoPreview_selectPatternMusicVideo = "speedApp_musicVideoPreview_selectPatternMusicVideo"
     //点击仅音乐
-    case ot_shanyinApp_musicVideoPreview_selectPatternBgm = "shanyinApp_musicVideoPreview_selectPatternBgm"
+    case ot_shanyinApp_musicVideoPreview_selectPatternBgm = "speedApp_musicVideoPreview_selectPatternBgm"
     
     //音乐库相统计
     //- 音乐tab点击数
-    case ot_shanyinApp_musicVideoPreview_musicTab = "shanyinApp_musicVideoPreview_musicTab"
+    case ot_shanyinApp_musicVideoPreview_musicTab = "speedApp_musicVideoPreview_musicTab"
     //- 剪辑tab点击
-    case ot_shanyinApp_musicVideoPreview_videoTab = "shanyinApp_musicVideoPreview_videoTab"
+    case ot_shanyinApp_musicVideoPreview_videoTab = "speedApp_musicVideoPreview_videoTab"
     //- 音乐素材曝光数
-    case ot_shanyinApp_musicVideoPreview_musicView = "shanyinApp_musicVideoPreview_musicView"
+    case ot_shanyinApp_musicVideoPreview_musicView = "speedApp_musicVideoPreview_musicView"
     //- 音乐试听数
-    case ot_shanyinApp_musicVideoPreview_musicCategorySelect = "shanyinApp_musicVideoPreview_musicCategorySelect"
+    case ot_shanyinApp_musicVideoPreview_musicCategorySelect = "speedApp_musicVideoPreview_musicCategorySelect"
     //- 音乐使用数
-    case ot_shanyinApp_musicVideoPreview_musicSelect = "shanyinApp_musicVideoPreview_musicSelect"
+    case ot_shanyinApp_musicVideoPreview_musicSelect = "speedApp_musicVideoPreview_musicSelect"
     //- 音乐选框移动数(与原推荐位置不一致)
-    case ot_shanyinApp_musicVideoPreview_musicPeriodSelect = "shanyinApp_musicVideoPreview_musicPeriodSelect"
+    case ot_shanyinApp_musicVideoPreview_musicPeriodSelect = "speedApp_musicVideoPreview_musicPeriodSelect"
     //- 搜索页面曝光
-    case ot_shanyinApp_musicVideoPreview_musicSearch = "shanyinApp_musicVideoPreview_musicSearch"
+    case ot_shanyinApp_musicVideoPreview_musicSearch = "speedApp_musicVideoPreview_musicSearch"
     
     //- 音乐试听数
-    case ot_shanyinApp_musicVideoPreview_musicSearchAudition = "shanyinApp_musicVideoPreview_musicSearchAudition"
+    case ot_shanyinApp_musicVideoPreview_musicSearchAudition = "speedApp_musicVideoPreview_musicSearchAudition"
     //- 音乐使用数
-    case ot_shanyinApp_musicVideoPreview_musicSearchSelect = "shanyinApp_musicVideoPreview_musicSearchSelect"
+    case ot_shanyinApp_musicVideoPreview_musicSearchSelect = "speedApp_musicVideoPreview_musicSearchSelect"
     
     //快慢速模式
     //  - 抛留比例按钮切换点击数
-    case ot_shanyinApp_musicVideoPreview_selectSpeed = "shanyinApp_musicVideoPreview_selectSpeed"
+    case ot_shanyinApp_musicVideoPreview_selectSpeed = "speedApp_musicVideoPreview_selectSpeed"
     //  - 自定义抛留比按钮点击数
-    case ot_shanyinApp_musicVideoPreview_customizeSpeed = "shanyinApp_musicVideoPreview_customizeSpeed"
+    case ot_shanyinApp_musicVideoPreview_customizeSpeed = "speedApp_musicVideoPreview_customizeSpeed"
     //  - 选择节奏
-    case ot_shanyinApp_musicVideoPreview_selectSpeedRhythm = "shanyinApp_musicVideoPreview_selectSpeedRhythm"
+    case ot_shanyinApp_musicVideoPreview_selectSpeedRhythm = "speedApp_musicVideoPreview_selectSpeedRhythm"
     
     // 跳跃卡点模式
     //  - 抛留比例按钮切换点击数
-    case ot_shanyinApp_musicVideoPreview_selectRatio = "shanyinApp_musicVideoPreview_selectRatio"
+    case ot_shanyinApp_musicVideoPreview_selectRatio = "speedApp_musicVideoPreview_selectRatio"
     //  - 自定义抛留比按钮点击数
-    case ot_shanyinApp_musicVideoPreview_customizeRatio = "shanyinApp_musicVideoPreview_customizeRatio"
+    case ot_shanyinApp_musicVideoPreview_customizeRatio = "speedApp_musicVideoPreview_customizeRatio"
     //  - 选择节奏
-    case ot_shanyinApp_musicVideoPreview_selectMusicVideoRhythm = "shanyinApp_musicVideoPreview_selectMusicVideoRhythm"
+    case ot_shanyinApp_musicVideoPreview_selectMusicVideoRhythm = "speedApp_musicVideoPreview_selectMusicVideoRhythm"
    
  
     // 仅配乐模式
     // 循环比例按钮切换点击数
-    case ot_shanyinApp_musicVideoPreview_selectRepeatTimes = "shanyinApp_musicVideoPreview_selectRepeatTimes"
+    case ot_shanyinApp_musicVideoPreview_selectRepeatTimes = "speedApp_musicVideoPreview_selectRepeatTimes"
     //  - 自定义抛留比按钮点击数
-    case ot_shanyinApp_musicVideoPreview_customizeRepeatTimes = "shanyinApp_musicVideoPreview_customizeRepeatTimes"
+    case ot_shanyinApp_musicVideoPreview_customizeRepeatTimes = "speedApp_musicVideoPreview_customizeRepeatTimes"
     //  - 选择节奏
-    case ot_shanyinApp_musicVideoPreview_selectMusicVideoRepeatRhythm = "shanyinApp_musicVideoPreview_selectMusicVideoRepeatRhythm"
+    case ot_shanyinApp_musicVideoPreview_selectMusicVideoRepeatRhythm = "speedApp_musicVideoPreview_selectMusicVideoRepeatRhythm"
         
     /*************** 话题相关objectType ***************/
     case ot_cmunit_syncedBtn = "syncedUpMusicButton" // 音乐视频
@@ -375,6 +375,10 @@ public  enum  objectType: String {
     case ot_cmunit_skipBtn = "skipButton" // 点击「跳过」按钮
     case ot_cmunit_loginButton = "loginButton" // 点击「登录」按钮
     case ot_cmunit_cmtMsgItem = "commentMessageItem" // 评论消息item
+    
+    /*************** 活动相关businessType ***************/
+    case ot_actity_incentive = "weapp_sharer_incentivePlanWindow" // 分享者激励计划活动弹窗的曝光
+    case ot_actity_share = "weapp_share_plan" // 分享者激励计划活动弹窗按钮的点击
 }
 
 // MARK: - 视频上报类型
@@ -618,25 +622,6 @@ public  enum  TAB_PAGETYPE: String {
     case TAB_PAGETYPE_MINE = "mineTab" // 我的
 }
 
-// MARK: - 刷新控件类型
-
-/// 刷新控件类型
-public  enum  REFRESH_TYPE {
-    case REFRESH_TYPE_ALL // 推荐
-    case REFRESH_TYPE_HEADER // 头部
-    case REFRESH_TYPE_FOOTER // 尾部
-    case REFRESH_TYPE_AUTOFOOTER // 尾部
-}
-
-/// 滑动方向
-public  enum  moveDirection {
-    case moveDirectionNormal
-    case moveDirectionUp
-    case moveDirectionDown
-    case moveDirectionRight
-    case moveDirectionLeft
-}
-
 // MARK: - 关注跟粉丝cell类型
 
 /// 关注跟粉丝cell类型

+ 11 - 37
BFCommonKit/Classes/BFUtility/PQCommonMethodUtil.swift

@@ -85,14 +85,6 @@ public func createFilePath(url: String) -> Bool {
     return true
 }
 
-public func cIPHONE_X() -> Bool {
-    guard #available(iOS 11.0, *) else {
-        return false
-    }
-    let isX = (UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0) > 0
-    return isX
-}
-
 public func bf_getRootViewController() -> UIViewController? {
     guard let window = UIApplication.shared.delegate?.window else {
         return nil
@@ -166,8 +158,8 @@ public func commonParams() -> [String: Any] {
         "versionCode": versionCode,
         "system": systemName + " " + systemVersion,
         "systemVersion": systemName + " " + systemVersion,
-        "appType": PQBFConfig.shared.appType,
-        "appId": PQBFConfig.shared.appId,
+        "appType": BFConfig.shared.appType,
+        "appId": BFConfig.shared.appId,
         "machineCode": getMachineCode(),
         "networkType": networkStatus(),
         "ipAddress": ipAddress(),
@@ -179,18 +171,18 @@ public func commonParams() -> [String: Any] {
         "requestId": getUniqueId(desc: "requestId"),
         "idfa": ASIdentifierManager.shared().advertisingIdentifier.uuidString,
         "idfv": UIDevice.current.identifierForVendor?.uuidString ?? "",
-        "sessionId": PQBFConfig.shared.sessionId,
-        "subSessionId": PQBFConfig.shared.subSessionId ?? PQBFConfig.shared.sessionId,
+        "sessionId": BFConfig.shared.sessionId,
+        "subSessionId": BFConfig.shared.subSessionId ?? BFConfig.shared.sessionId,
     ]
-    if PQBFConfig.shared.token != nil, (PQBFConfig.shared.token?.count ?? 0) > 0 {
-        commParams["token"] = PQBFConfig.shared.token ?? ""
+    if BFConfig.shared.token != nil, (BFConfig.shared.token?.count ?? 0) > 0 {
+        commParams["token"] = BFConfig.shared.token ?? ""
     }
-    if PQBFConfig.shared.loginUid != nil, (PQBFConfig.shared.loginUid?.count ?? 0) > 0 {
-        commParams["loginUid"] = PQBFConfig.shared.loginUid ?? ""
-        commParams["uid"] = PQBFConfig.shared.loginUid ?? ""
+    if BFConfig.shared.loginUid != nil, (BFConfig.shared.loginUid?.count ?? 0) > 0 {
+        commParams["loginUid"] = BFConfig.shared.loginUid ?? ""
+        commParams["uid"] = BFConfig.shared.loginUid ?? ""
     }
-    if PQBFConfig.shared.deviceToken != nil, (PQBFConfig.shared.deviceToken?.count ?? 0) > 0 {
-        commParams["deviceToken"] = PQBFConfig.shared.deviceToken ?? ""
+    if BFConfig.shared.deviceToken != nil, (BFConfig.shared.deviceToken?.count ?? 0) > 0 {
+        commParams["deviceToken"] = BFConfig.shared.deviceToken ?? ""
     }
     return commParams
 }
@@ -783,24 +775,6 @@ public func contentMD5(path: String? = nil, data _: Data? = nil) -> String? {
     return hash
 }
 
-/// 自适应宽
-/// - Parameters:
-///   - width: <#width description#>
-///   - baseWidth: <#baseWidth description#>
-/// - Returns: <#description#>
-public func adapterWidth(width: CGFloat, baseWidth: CGFloat = 375) -> CGFloat {
-    return width / baseWidth * cScreenWidth
-}
-
-/// 自适应高
-/// - Parameters:
-///   - height: <#height description#>
-///   - baseHeight: <#baseHeight description#>
-/// - Returns: <#description#>
-public func adapterHeight(height: CGFloat, baseHeight: CGFloat = 812) -> CGFloat {
-    return height / baseHeight * cScreenHeigth
-}
-
 /// 检测URL
 /// - Parameter url: <#url description#>
 /// - Returns: <#description#>

+ 54 - 87
BFCommonKit/Classes/BFUtility/PQConstant.swift

@@ -10,55 +10,55 @@ import Foundation
 import Kingfisher
 import UIKit
 
-public let cScreenWidth: CGFloat = UIScreen.main.bounds.width
-public let cScreenHeigth: CGFloat = UIScreen.main.bounds.height
-
-//获取状态栏的高度,全面屏手机的状态栏高度为44pt,非全面屏手机的状态栏高度为20pt
-//状态栏高度
-public let statusBarHeight = UIApplication.shared.statusBarFrame.height;
-//导航栏高度
-public let navigationHeight = CGFloat(statusBarHeight + 44.0)
-//tabbar高度
-public let tabBarHeight = CGFloat(statusBarHeight > 20.0 ? 83.0 : 49.0)
-//顶部的安全距离
-public let topSafeAreaHeight = CGFloat(statusBarHeight - 20.0)
-//底部的安全距离,全面屏手机为34pt,非全面屏手机为0pt
-public let bottomSafeAreaHeight = CGFloat(tabBarHeight - 49.0)
-
-
-// 屏幕适配系数  iponneX?
-public let cAdaptatWidth = cScreenWidth / 375
-public let cAdaptatHeigth = cScreenHeigth / 667
-/// 图库大小
-public let photoItemSize = CGSize(width: (cScreenWidth - cDefaultMargin) / 3, height: (cScreenWidth - cDefaultMargin) / 3) // cell 大小
-// add by ak 视频制作工具视频画布大小
-// 1:1
-public let cVideoCannvasSizeOneToOne = CGSize(width: 1080.0, height: 1080.0)
-// 16:9
-public let cVideoCannvasSizeSixteenToNine = CGSize(width: 1920.0, height: 1080.0)
-// 9:16
-public let cVideoCannvasSizeNineToSixteen = CGSize(width: 1080.0, height: 1920.0)
-
-// add by ak 声频 hz
-public let cEditAudioSampleRate = 44100
-
-// 获取安全区域大小
-public let cSafeAreaHeight: CGFloat = cIPHONE_X() == true ? 34.0 : 0.0
-
-// 获取安全区域大小
-public let cAKSafeAreaHeight: CGFloat = cIPHONE_X() == true ? 25.0 : 0.0
-
-public let cDevice_iPhoneStatusBarHei: CGFloat = cIPHONE_X() == true ? 44.0 : 20.0
-public let cDevice_iPhoneNavBarHei: CGFloat = 44.0
-public let cDevice_iPhoneNavBarAndStatusBarHei: CGFloat = cDevice_iPhoneStatusBarHei + cDevice_iPhoneNavBarHei
-public let cDevice_iPhoneTabBarHei: CGFloat = cSafeAreaHeight + 49.0
-// 遮罩颜色
-public let cShadowColor: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
+//public let cScreenWidth: CGFloat = UIScreen.main.bounds.width
+//public let cScreenHeigth: CGFloat = UIScreen.main.bounds.height
+//
+////获取状态栏的高度,全面屏手机的状态栏高度为44pt,非全面屏手机的状态栏高度为20pt
+////状态栏高度
+//public let statusBarHeight = UIApplication.shared.statusBarFrame.height;
+////导航栏高度
+//public let navigationHeight = CGFloat(statusBarHeight + 44.0)
+////tabbar高度
+//public let tabBarHeight = CGFloat(statusBarHeight > 20.0 ? 83.0 : 49.0)
+////顶部的安全距离
+//public let topSafeAreaHeight = CGFloat(statusBarHeight - 20.0)
+////底部的安全距离,全面屏手机为34pt,非全面屏手机为0pt
+//public let bottomSafeAreaHeight = CGFloat(tabBarHeight - 49.0)
+//
+//
+//// 屏幕适配系数  iponneX?
+//public let cAdaptatWidth = cScreenWidth / 375
+//public let cAdaptatHeigth = cScreenHeigth / 667
+///// 图库大小
+//public let photoItemSize = CGSize(width: (cScreenWidth - cDefaultMargin) / 3, height: (cScreenWidth - cDefaultMargin) / 3) // cell 大小
+//// add by ak 视频制作工具视频画布大小
+//// 1:1
+//public let cVideoCannvasSizeOneToOne = CGSize(width: 1080.0, height: 1080.0)
+//// 16:9
+//public let cVideoCannvasSizeSixteenToNine = CGSize(width: 1920.0, height: 1080.0)
+//// 9:16
+//public let cVideoCannvasSizeNineToSixteen = CGSize(width: 1080.0, height: 1920.0)
+//
+//// add by ak 声频 hz
+//public let cEditAudioSampleRate = 44100
+//
+//// 获取安全区域大小
+//public let cSafeAreaHeight: CGFloat = cIPHONE_X() == true ? 34.0 : 0.0
+//
+//// 获取安全区域大小
+//public let cAKSafeAreaHeight: CGFloat = cIPHONE_X() == true ? 25.0 : 0.0
+//
+//public let cDevice_iPhoneStatusBarHei: CGFloat = cIPHONE_X() == true ? 44.0 : 20.0
+//public let cDevice_iPhoneNavBarHei: CGFloat = 44.0
+//public let cDevice_iPhoneNavBarAndStatusBarHei: CGFloat = cDevice_iPhoneStatusBarHei + cDevice_iPhoneNavBarHei
+//public let cDevice_iPhoneTabBarHei: CGFloat = cSafeAreaHeight + 49.0
+//// 遮罩颜色
+//public let cShadowColor: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
 /// 通知
 public let PQNotification: NotificationCenter = NotificationCenter.default
 
-/** 默认间隔 */
-public let cDefaultMargin: CGFloat = 10
+///** 默认间隔 */
+//public let cDefaultMargin: CGFloat = 10
 // 时间精度
 public let playerTimescale: Float64 = 1000.0
 // 时间精度Ints
@@ -69,47 +69,7 @@ public let maxUploadSize: Float64 = 10.0 * 1024.0 * 1024.0 * 1024.0
 public let maxMartialSize: Float64 = 500.0 * 1024.0 * 1024.0
 /// 音频频率范围值
 public let cFrequency: [CGFloat] = [9.0, 12.0, 16.5, 18, 24, 21, 18, 16.5, 12, 16.5, 18, 16.5, 12]
-/**************** tag *******************/
 
-public let cCellTag: Int = 100_001
-/** 引导 tag */
-public let cGuideTag: Int = 100_002
-/** 视频封面tag */
-public let cCoverInfoTag: Int = 100_003
-/** 协议tag */
-public let cProtocalViewTag: Int = 100_004
-/** 心形tag */
-public let cHeartTag: Int = 100_005
-/** 订阅提示tag */
-public let cSubcribeRemindTag: Int = 100_006
-/** 订阅提示tag */
-public let cPushRemindTag: Int = 100_007
-/** 活动提示tag */
-public let cActivityRemindTag: Int = 100_008
-/** pay提示tag */
-public let cPayInfoTag: Int = 100_009
-/** 绑定手机号提示tag */
-public let cBandinPhoneTag: Int = 100_010
-/// 上传最大viewTag
-public let cUploadMaxCountRemindTag: Int = 100_011
-/// 上传提示tag
-public let cUploadViewRemindTag: Int = 100_012
-/// 视频制作播放背景音乐的tag
-public let cVideoMKBGMPlayTag: Int = 100_013
-/// 上滑提示tag
-public let cUpSlideViewRemindTag: Int = 100_014
-/// 创作视频引导提示tag
-public let cVideoMakeRemindTag: Int = 100_015
-/// 操作弹出tag
-public let cOprationRemindTag: Int = 100_016
-/// 气泡提示视图tag
-public let cBubbleRemindViewTag: Int = 100_017
-/// 素材推荐提示tag
-public let cRecommendMaterialViewTag: Int = 100_018
-/// 气泡提示视图tag
-public let cPageMaterialGuidTag: Int = 100_019
-/// 信息流视频广告tag
-public let cAdDrawVideoViewTag: Int = 100_020
 /****************** 私有key ***************/
 
 // 创作工具-项目id前缀
@@ -127,6 +87,8 @@ public let cTasStorageKey: String = "tas\(cPrimarykey)"
 public let cGameStorageKey: String = "game\(cPrimarykey)"
 public let cSepraStorageKey: String = "sepra\(cPrimarykey)"
 public let cFreeStorageKey: String = "free\(cPrimarykey)"
+public let cShouyyyStorageKey: String = "shouyyy\(cPrimarykey)"
+public let cZhenmonennStorageKey: String = "zhenmonenn\(cPrimarykey)"
 public let cRedImageStorageKey: String = "ic_hbs_enter\(cPrimarykey)"
 public let cNewImageStorageKey: String = "icon_hbs_free\(cPrimarykey)"
 // 当前Tab
@@ -201,7 +163,12 @@ public let cIsShoWedAddBGMPreRemindView: String = "isShoWedAddBGMPreRemindView\(
 public let cShoWedAddBGMRemindView: String = "shoWedAddBGMRemindView\(cPrimarykey)"
 // 刷新已读数
 public let cUpdateMsgNoReadCount: String = "updateMsgNoReadCount\(cPrimarykey)"
-
+// 今日已完成分享次数
+public let cIsTodayFHShareActivity: String = "isTodayFHShareActivity\(cPrimarykey)"
+// 今日是否显示过加入提示
+public let cIsShowTodayJoinActivity: String = "isShowTodayJoinActivity\(cPrimarykey)"
+// 是否取消显示限制
+public let cIsNoForbiddenShareView: String = "isNoForbiddenShareView\(cPrimarykey)"
 // add by ak 是否显示过裁剪引导
 public let cIsShowImageCropGuid: String = "isShowImageCropGuid\(cPrimarykey)"
 // 编辑界面引导是否显示过 add by ak

+ 33 - 0
BFFloat+Ext.swift

@@ -0,0 +1,33 @@
+//
+//  BFFloat+Ext.swift
+//  BFFramework
+//
+//  Created by ak on 2021/10/11.
+//
+
+import Foundation
+
+extension Float {
+    /// 准确的小数尾截取 - 没有进位
+    /*
+     // 11.999003  -> 12.0
+     var pp = 11.999003
+     String(format: "%.1f", pp)  这个方法会进行四舍五入
+     */
+    func decimalString(_ base: Self = 1) -> String {
+       return "\(self.decimalNumber(base))"
+    }
+    func decimalNumber(_ base: Self = 1) -> Float {
+        let tempCount: Self = pow(10, base)
+        let temp = self*tempCount
+        
+        let target = Self(Int(temp))
+        let stepone = target/tempCount
+        if stepone.truncatingRemainder(dividingBy: 1) == 0 {
+            return Float(String(format: "%.0f", stepone)) ?? 0.0
+        }else{
+            return stepone
+        }
+    }
+}
+ 

+ 2 - 2
Example/BFCommonKit.xcodeproj/project.pbxproj

@@ -440,7 +440,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = iphoneos;
@@ -486,7 +486,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";

+ 90 - 0
Example/Podfile.lock

@@ -0,0 +1,90 @@
+PODS:
+  - Alamofire (5.4.4)
+  - BFCommonKit (1.4.9):
+    - BFCommonKit/BFBase (= 1.4.9)
+    - BFCommonKit/BFCategorys (= 1.4.9)
+    - BFCommonKit/BFConfig (= 1.4.9)
+    - BFCommonKit/BFDebug (= 1.4.9)
+    - BFCommonKit/BFEnums (= 1.4.9)
+    - BFCommonKit/BFUtility (= 1.4.9)
+  - BFCommonKit/BFBase (1.4.9):
+    - Alamofire (= 5.4.4)
+    - BFCommonKit/BFCategorys
+    - BFCommonKit/BFConfig
+    - BFCommonKit/BFUtility
+    - FDFullscreenPopGesture (= 1.1)
+    - RealmSwift (= 10.7.6)
+    - SnapKit (= 5.0.1)
+  - BFCommonKit/BFCategorys (1.4.9):
+    - KingfisherWebP
+  - BFCommonKit/BFConfig (1.4.9)
+  - BFCommonKit/BFDebug (1.4.9):
+    - BFCommonKit/BFCategorys
+  - BFCommonKit/BFEnums (1.4.9)
+  - BFCommonKit/BFUtility (1.4.9):
+    - Alamofire (= 5.4.4)
+    - BFCommonKit/BFCategorys
+    - BFCommonKit/BFConfig
+    - KeychainAccess (= 4.2.2)
+    - Kingfisher
+    - KingfisherWebP
+    - Toast-Swift (= 5.0.1)
+  - FDFullscreenPopGesture (1.1)
+  - KeychainAccess (4.2.2)
+  - Kingfisher (6.3.1)
+  - KingfisherWebP (1.3.0):
+    - Kingfisher (~> 6.2)
+    - libwebp (>= 1.1.0)
+  - libwebp (1.2.1):
+    - libwebp/demux (= 1.2.1)
+    - libwebp/mux (= 1.2.1)
+    - libwebp/webp (= 1.2.1)
+  - libwebp/demux (1.2.1):
+    - libwebp/webp
+  - libwebp/mux (1.2.1):
+    - libwebp/demux
+  - libwebp/webp (1.2.1)
+  - Realm (10.7.6):
+    - Realm/Headers (= 10.7.6)
+  - Realm/Headers (10.7.6)
+  - RealmSwift (10.7.6):
+    - Realm (= 10.7.6)
+  - SnapKit (5.0.1)
+  - Toast-Swift (5.0.1)
+
+DEPENDENCIES:
+  - BFCommonKit (from `../`)
+
+SPEC REPOS:
+  trunk:
+    - Alamofire
+    - FDFullscreenPopGesture
+    - KeychainAccess
+    - Kingfisher
+    - KingfisherWebP
+    - libwebp
+    - Realm
+    - RealmSwift
+    - SnapKit
+    - Toast-Swift
+
+EXTERNAL SOURCES:
+  BFCommonKit:
+    :path: "../"
+
+SPEC CHECKSUMS:
+  Alamofire: f3b09a368f1582ab751b3fff5460276e0d2cf5c9
+  BFCommonKit: af7ab17be94765ab4162fb43971167da4f41e0a0
+  FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
+  KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
+  Kingfisher: 016c8b653a35add51dd34a3aba36b580041acc74
+  KingfisherWebP: dec17a5eb1af2658791bde1f93ae9a853678f826
+  libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
+  Realm: ed860452717c8db8f4bf832b6807f7f2ce708839
+  RealmSwift: e31c4ddbcc42ac879313d656b86f9ca539f6f4f4
+  SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb
+  Toast-Swift: 9b6a70f28b3bf0b96c40d46c0c4b9d6639846711
+
+PODFILE CHECKSUM: 5c138dc5d174c9336dd4473cb26265c7619334aa
+
+COCOAPODS: 1.11.2

+ 70 - 0
UICollectionView+Ext.swift

@@ -0,0 +1,70 @@
+//
+//  UICollectionView+Ext.swift
+//  PQCreativeCommunity
+//
+//  Created by SanW on 2021/8/4.
+//  Copyright © 2021 BytesFlow. All rights reserved.
+//
+
+import Foundation
+import MJRefresh
+
+extension UICollectionView{
+    /// 获取当前cell
+    /// - Returns: <#description#>
+    func visibleCell() -> UICollectionViewCell? {
+        let visibleRect = CGRect(origin: contentOffset, size: bounds.size)
+        let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
+        guard let visibleIndexPath = indexPathForItem(at: visiblePoint) else { return nil }
+        return cellForItem(at: visibleIndexPath)
+    }
+
+    /// 添加刷新组件
+    /// - Parameters:
+    ///   - scroller: <#scroller description#>
+    ///   - type: 1-头部跟尾部 2-头部 3-尾部
+    public func addRefreshView(type: REFRESH_TYPE = .REFRESH_TYPE_ALL, refreshHandle: ((_ isHeader: Bool) -> Void)?) {
+        if type == .REFRESH_TYPE_ALL || type == .REFRESH_TYPE_HEADER {
+            let header = MJRefreshNormalHeader.init {
+                if refreshHandle != nil {
+                    refreshHandle!(true)
+                }
+            }
+            header.setTitle("下拉刷新", for: .willRefresh)
+            header.setTitle("正在刷新...", for: .refreshing)
+            header.setTitle("松开刷新", for: .pulling)
+            header.setTitle("下拉刷新", for: .idle)
+            header.lastUpdatedTimeLabel?.isHidden = true
+            mj_header = header
+        }
+        if type == .REFRESH_TYPE_ALL || type == .REFRESH_TYPE_FOOTER {
+            // MJRefreshBackNormalFooter 不会附在上面
+            // MJRefreshAutoFooter 不会便宜
+            let footer = MJRefreshBackNormalFooter.init {
+                if refreshHandle != nil {
+                    refreshHandle!(false)
+                }
+            }
+            footer.setTitle("暂时没有更多了", for: .noMoreData)
+            footer.setTitle("精彩内容正在加载中...", for: .refreshing)
+            mj_footer = footer
+        }
+        
+        if type == .REFRESH_TYPE_AUTOFOOTER {
+            let footer = MJRefreshAutoNormalFooter.init {
+                if refreshHandle != nil {
+                    refreshHandle!(false)
+                }
+            }
+            footer.triggerAutomaticallyRefreshPercent = -70
+            footer.setTitle("暂时没有更多了", for: .noMoreData)
+            footer.setTitle("精彩内容正在加载中...", for: .refreshing)
+            mj_footer = footer
+        }
+    }
+
+    func indexPathsForElements(in rect: CGRect) -> [IndexPath] {
+        let allLayoutAttributes = collectionViewLayout.layoutAttributesForElements(in: rect)!
+        return allLayoutAttributes.map { $0.indexPath }
+    }
+}