zoukankan      html  css  js  c++  java
  • 处理圆形图片

    做项目的时候经常遇到过自定义cell,就拿朋友圈来说,用户的头像也是要切圆形的,通常都是在cell里将imageView的layer做处理,像这样

    UIImageView *imageView = [[UIImageView alloc] init];

    imageView.layer.cornerRadius = 10;//这里如果是圆形效果就用imageView的宽高除以2(宽高都相等的情况下)

    imageView.layer.masksToBounds = YES;

     

    一开始做这个功能时候都是用官方提供的方法,后来在网上看MJ的教程视频他有提到过这个layer,具体我忘记了,主要是提到这个layer是系统封装好的消耗的内存会相对比较大,只以一两个imageView是很难测出来,在多个需要处理的imageView时候MJ也推荐用图形上下文去处理,我自己去测试过,写一个自定义TableViewCell,添加子类控件UIImageView,用两种方法对比,layer和图形上下文切的圆形图,开始是加载20个tableVIewCell,内存消耗没有多在区别,后来加到50,100,200的时候内存消耗就有点明显了。

    这里我自己也尝试封装了图形上下文,可能不完美,希望各位大神给点建议,还有感谢MJ

     

    注:UIImage+YMExtension是对image做处理,因为当时主要是处理本地的图片

    //UIImage+YMExtension.h

     

    #import <UIKit/UIKit.h>

     

    @interface UIImage (YMExtension)

     

    /**

     * 返回圆形图片

     */

    - (instancetype)ym_circleImage;

     

    /**

     * 通过图片名,返回圆形图片

     */

    + (instancetype)ym_circleImageWith:(NSString *)name;

     

    @end

     

    //UIImage+YMExtension.m

     

    #import "UIImage+YMExtension.h"

     

    @implementation UIImage (YMExtension)

     

    - (instancetype)ym_circleImage

    {

        //开启图形上下文

        UIGraphicsBeginImageContext(self.size);

        

        //上下文

        CGContextRef ctx = UIGraphicsGetCurrentContext();

        

        //添加一个圆

        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);

        CGContextAddEllipseInRect(ctx, rect);

        

        //裁剪

        CGContextClip(ctx);

        

        //绘制图片

        [self drawInRect:rect];

        

        //获得图片

        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

        

        //关闭图形上下文

        UIGraphicsEndImageContext();

        

        

        return image;

    }

     

    + (instancetype)ym_circleImageWith:(NSString *)name

    {

        return [[self imageNamed:name] ym_circleImage];

    }

     

     

    @end

     

     

    注:下面这个类主要是处理网络加载后的图片,需要上面的类辅助,网络加载图片用的是第三方SDWebImageManager

     

    //UIImageView+YMExtension.h

     

    #import <UIKit/UIKit.h>

     

    @interface UIImageView (YMExtension)

     

    /**

     * 返回圆形图片

     */

    - (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder;

     

    /**

     * 返回方形图片

     */

    - (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder;

     

    @end

     

     

    //UIImageView+YMExtension.m

    #import "UIImageView+YMExtension.h"

    #import <UIImageView+WebCache.h>

     

    @implementation UIImageView (YMExtension)

     

    /**

     返回圆形图片

     

     @param url 图片url

     @param placeholder 占位图

     */

    - (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder

    {

        //设置占位图片(如果不设置这个方法,那么图片如果加载失败,图片是方形而不是圆形)

        UIImage *placeHolder = [UIImage ym_circleImageWith:placeholder];

        [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHolder completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {

            

            //如果图片加载失败则返回(如果空占位图片有效)

            if (image == nil) {

                return ;

            }

            //返回圆形图片

            self.image = [image ym_circleImage];

        }];

    }

     

     

    /**

     返回方形图片

     

     @param url 图片url

     @param placeholder 占位图

     */

    - (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder

    {

        UIImage *placeHoder = [UIImage imageNamed:placeholder];

        [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHoder];

    }

     

     

    @end

  • 相关阅读:
    linux源码阅读笔记 asm函数
    linux源码阅读笔记 #define 语句的妙用
    对于python的内存管理的好文章
    #define x do{......} while(0)的用处
    reverse list
    判断数组是否存在重复元素
    找出数组中出现奇数次的元素
    找出数组中唯一的重复元素
    两个有序数组中的交集
    Java Socket(3): NIO
  • 原文地址:https://www.cnblogs.com/ljj-Andrew-519/p/7139588.html
Copyright © 2011-2022 走看看