Selaa lähdekoodia

1.新增枚举值

wenweiwei 3 vuotta sitten
vanhempi
commit
7fda5ab22d

+ 192 - 0
BFCommonKit/Classes/BFCategorys/UIControl+NXCategory.h

@@ -30,3 +30,195 @@
 @property(nonatomic) BOOL ignoreEvent;
 
 @end
+
+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

+ 634 - 0
BFCommonKit/Classes/BFCategorys/UIControl+NXCategory.m

@@ -66,3 +66,637 @@ static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";
 }
 
 @end
+
+#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

+ 5 - 0
BFCommonKit/Classes/BFEnums/Enums.swift

@@ -130,7 +130,9 @@ public  enum  PAGESOURCE: String {
     case sp_cmunit_collect = "collectAgeGenderPage" // 年龄 / 话题收集页
     case sp_cmunit_recommend = "recommendPage" // 推荐页(P0)
     case sp_cmunit_follow = "followPage" // 关注页
+    case sp_cmunit_moreFollow = "moreFollowPage" // 我关注的人(查看更多页)
     case sp_cmunit_joinTopic = "joinedTopicPage" // 加入的话题页
+    case sp_cmunit_moreJoinTopic = "moreJoinedTopicPage" // 我加入的话题(查看更多页)
     case sp_cmunit_hotTopic = "hotTopicPage" // 热门话题页
     case sp_cmunit_videoDetail = "videoDetailPage" // 内容详情页
     case sp_cmunit_topicDetail = "topicDetailPage" // 话题详情页
@@ -142,6 +144,8 @@ public  enum  PAGESOURCE: String {
     case sp_cmunit_loginPage = "loginPage" // 登陆页
     case sp_cmunit_interestedTopic = "hotTopicRecommendWindow" // 热门话题推荐页
     case sp_cmunit_cmtMsgPage = "commentMessagePage" // 评论消息页
+    case sp_cmunit_mePage = "mePage" // 我的页
+    case sp_cmunit_userPage = "homePage" // 个人主页
 }
 
 // MARK: - objectType
@@ -338,6 +342,7 @@ public  enum  businessType: String {
     case bt_videoRealPlay = "videoRealPlay" // 视频播放到20s或播放到总时长30%,哪个先到为准
     case bt_videoPlaySuccess = "videoPlaySuccess" // 视频缓冲完成开始播放
     case bt_videoPlayEnd = "videoPlayEnd" // 视频播放到总时长100%
+    case bt_videoPlayDuration = "playDuration" // 视频播放时长ms - 有暂停动作时上报并重新计算
     case bt_videoPlayCancel = "videoPlayCancel" // 视频播放取消
     case bt_videoPlayDecoder = "videoPlayDecoder" // 视频解码器启动
     case bt_videoPlayDecoderError = "videoPlayDecoderError" // 视频解码失败

+ 2 - 0
BFCommonKit/Classes/BFUtility/PQConstant.swift

@@ -256,6 +256,8 @@ public let cDownloadMatrialSuccessKey: String = "downloadMatrialSuccess\(cPrimar
 public let cVideoDealWithSuccessKey: String = "videoDealWithSuccess\(cPrimarykey)"
 /// 话题订阅状态改变时通知
 public let cTopicSubscribeStatusChangedKey: String = "topicSubscribeStatusChanged\(cPrimarykey)"
+/// 发布页最近加入的话题
+public let cPublicLastJoinTopicInfoKey: String = "publicLastJoinTopicInfoKey\(cPrimarykey)"
 
 /// 批量下载资源成功/失败的key
 public let cBatchDownloadMatrialSuccessKey: String = "batchDownloadMatrialSuccess\(cPrimarykey)"

+ 14 - 14
Example/Podfile.lock

@@ -1,13 +1,13 @@
 PODS:
   - Alamofire (5.4.3)
-  - BFCommonKit (1.4.0):
-    - BFCommonKit/BFBase (= 1.4.0)
-    - BFCommonKit/BFCategorys (= 1.4.0)
-    - BFCommonKit/BFConfig (= 1.4.0)
-    - BFCommonKit/BFDebug (= 1.4.0)
-    - BFCommonKit/BFEnums (= 1.4.0)
-    - BFCommonKit/BFUtility (= 1.4.0)
-  - BFCommonKit/BFBase (1.4.0):
+  - BFCommonKit (1.4.4):
+    - BFCommonKit/BFBase (= 1.4.4)
+    - BFCommonKit/BFCategorys (= 1.4.4)
+    - BFCommonKit/BFConfig (= 1.4.4)
+    - BFCommonKit/BFDebug (= 1.4.4)
+    - BFCommonKit/BFEnums (= 1.4.4)
+    - BFCommonKit/BFUtility (= 1.4.4)
+  - BFCommonKit/BFBase (1.4.4):
     - Alamofire (= 5.4.3)
     - BFCommonKit/BFCategorys
     - BFCommonKit/BFConfig
@@ -15,13 +15,13 @@ PODS:
     - FDFullscreenPopGesture (= 1.1)
     - RealmSwift (= 10.7.6)
     - SnapKit (= 5.0.1)
-  - BFCommonKit/BFCategorys (1.4.0):
+  - BFCommonKit/BFCategorys (1.4.4):
     - KingfisherWebP (= 1.3.0)
-  - BFCommonKit/BFConfig (1.4.0)
-  - BFCommonKit/BFDebug (1.4.0):
+  - BFCommonKit/BFConfig (1.4.4)
+  - BFCommonKit/BFDebug (1.4.4):
     - BFCommonKit/BFCategorys
-  - BFCommonKit/BFEnums (1.4.0)
-  - BFCommonKit/BFUtility (1.4.0):
+  - BFCommonKit/BFEnums (1.4.4)
+  - BFCommonKit/BFUtility (1.4.4):
     - Alamofire (= 5.4.3)
     - BFCommonKit/BFCategorys
     - BFCommonKit/BFConfig
@@ -74,7 +74,7 @@ EXTERNAL SOURCES:
 
 SPEC CHECKSUMS:
   Alamofire: e447a2774a40c996748296fa2c55112fdbbc42f9
-  BFCommonKit: 64ca73f4c9241b9bd954e2aa4e5880b7f43e1a74
+  BFCommonKit: 9fd8de73084c196dbd61397ada86c4545fa2c184
   FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
   KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
   Kingfisher: 6c3df386db71d82c0817a429d2c9421a77396529