如何高性能的给 UIImageView 加个圆角?

  • 不好的解决方案

    • 使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现

      self.view.layer.cornerRadius = 5;
      self.view.layer.masksToBounds = YES;
      
  • 正确的解决方案:使用绘图技术
- (UIImage *)circleImage
{
    // NO代表透明
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);

    // 获得上下文
    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;
}
  • 还有一种方案:使用了贝塞尔曲线"切割"个这个图片, 给UIImageView 添加了的圆角,其实也是通过绘图技术来实现的
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
imageView.center = CGPointMake(200, 300);
UIImage *anotherImage = [UIImage imageNamed:@"image"];
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);
[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                       cornerRadius:50] addClip];
[anotherImage drawInRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.view addSubview:imageView];

下面这篇博客写的非常不错,推荐看看:对于图片的处理http://www.jianshu.com/p/4e22c6ac114d
时间: 2024-12-06 06:31:10

如何高性能的给 UIImageView 加个圆角?的相关文章

如何高性能的给UIImageView加个圆角?

https://www.jianshu.com/p/44bbff4274f3 由于这样处理的渲染机制是GPU在当前屏幕缓冲区外新开辟一个渲染缓冲区进行工作,也就是离屏渲染,这会给我们带来额外的性能损耗,如果这样的圆角操作达到一定数量,会触发缓冲区的频繁合并和上下文的的频繁切换,性能的代价会宏观地表现在用户体验上----掉帧. 会引发离屏渲染的操作: The following will trigger offscreen rendering: Any layer with a mask (lay

如何高性能的给UIImageView加个圆角

文/natewang(简书作者)原文链接:http://www.jianshu.com/p/268f3839d2e6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 其实你只需要的是圆角图片..... UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); [[UIBezierPath bezierPathWithRoundedRect:RECT cornerRadius:RADIUS] addCli

UIImageView加抖动效果

CGAffineTransform moveRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 20, 0); CGAffineTransform moveLeft = CGAffineTransformTranslate(CGAffineTransformIdentity, -20, 0); CGAffineTransform resetTransform = CGAffineTransformTranslate(CGAf

Bootstrap3基础 img-thumbnail 给图片加一个圆角的边框

礼悟:    公恒学思合行悟,尊师重道存感恩.叶见寻根三返一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼养身心,诚劝且行且珍惜.              ide:visual studio 2017             browser:Firefox / Chrome   bootstrap:3.3.7 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu

IOS 多个UIImageView 加载高清大图时内存管理

当我们在某一个View  多个UIImageView,且UIImageView都显示的是高清大图,就有可能出现内存警告的问题.如果第一次进入这个view,没有发生内存警告,当再次进入这个view,如果上一次的内存没有及时释放,这一次次的累加,便可导致内存崩溃. 1,UIImage 加载图片的方式.      如果是本地图片,尽量不要使用 [UIImage  imageNamed:nil]; 这种方式,如果使用这种方式加载,只要程序不退出,它便一直会在内存中.     我们可以使用 :      

glide 加载圆角图片

效果如上, 这是ListView的一个item 左边是一个圆角矩形的背景. 使用glide加载图片 自定义一个FilletImageView, 代码如下: import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android

高性能JS笔记1——加载执行

一.脚本位置 1.Script标签尽可能放到Body底部,以减少脚本文件下载对整个页面UI渲染的影响. 2.Script标签永远不要紧跟Link标签后面. 二.组织脚本 1.合并多个文件在一个Script中加载: <script type="text/javascript" src="/scripts/jquery.min.js&/scripts/jquery.validation.js"></script> 三.无阻塞的脚本 1.无

将UIImageView改成圆角和圆形

1.绘制圆角 cornerView.layer.cornerRadius = 20; cornerView.layer.masksToBounds = YES; masksToBounds防止子元素溢出父视图. 如果一个正方形要设置成圆形,代码为: cornerView.layer.cornerRadius = cornerView.frame.size.height/2; cornerView.layer.masksToBounds = YES; 2.绘制边框 borderView.layer

UIImageView加载网络图片,NSOperationQueue来异步加载图片

#import "newDetailViewController.h" #import "Common.h" #import "newObject.h" #import "NetRequest.h" #import <UIKit/UIKitDefines.h> @interface newDetailViewController ()<UIWebViewDelegate> { UILabel *GWDe