常规圆角设置方式就不说了
这里采用的是对 UIImage 进行处理,得到一个圆角的 UIImage。


关键代码

//对应于 ContentMode UIViewContentModeScaleAspectFit
- (CGSize)CGSizeAspectFit:(CGSize)aspectRatio bounding:(CGSize) boundingSize
{float mW = boundingSize.width / aspectRatio.width;float mH = boundingSize.height / aspectRatio.height;if( mH < mW )boundingSize.width = mH * aspectRatio.width;else if( mW < mH )boundingSize.height = mW * aspectRatio.height;return boundingSize;
}//对应于 ContentMode UIViewContentModeScaleAspectFill
- (CGSize)CGSizeAspectFill:(CGSize)aspectRatio minSize:(CGSize)minimumSize
{float mW = minimumSize.width / aspectRatio.width;float mH = minimumSize.height / aspectRatio.height;if( mH > mW )minimumSize.width = mH * aspectRatio.width;else if( mW > mH )minimumSize.height = mW * aspectRatio.height;return minimumSize;
}- (UIImage *)imageScaledToSize:(CGSize)size boundingSize:(CGSize)boundingSize cornerRadius:(CGFloat)cornerRadius borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor
{//create drawing contextUIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);//需要将可视区域画到图片的中心CGFloat originX = (size.width-boundingSize.width)/2;originX = originX < 0 ? 0 : originX;CGFloat originY = (size.height-boundingSize.height)/2;originY = originY < 0 ? 0 : originY;[borderColor setStroke];UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(originX, originY, boundingSize.width, boundingSize.height) cornerRadius:cornerRadius];[bezierPath setLineWidth:borderWidth];[bezierPath stroke];[bezierPath addClip];//draw[self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];//capture resultant imageUIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image;
}

参数说明

调用示例

CGSize scaleToSize = [image CGSizeAspectFill:image.size minSize:CGSizeMake(50.f, 50.f)];
image = [image imageScaledToSize:scaleToSizeboundingSize:CGSizeMake(50.f, 50.f)cornerRadius:5.fborderWidth:0.fborderColor:[UIColor colorWithWhite:0 alpha:0.2]];                

高级进阶–画出聊天气泡样式的图片,避免使用大量使用 mask 而导致卡顿

效果图

构建气泡外形的 UIBezierPath

  1. 原料:PaintCode
  2. 示例文档:link PaintCode示例文档
    说明:利用PaintCode得到的 UIBezierPath 的坐标都是绝对值,需要自己把所有的坐标点都改成相对边框的值(修改每个 x、y,工作量有点大)
  3. 要画什么样子的 UIBezierPath 取决于你的气泡设计(最好要熟练使用PaintCode)

关键代码

//将绝对值改成相对值后
- (UIBezierPath *)trangleRightPathInRect:(CGRect)rect {//画 UIBezierPath 的时候,出现了偏差,懒得重画,在这里手动修正CGFloat offset = 0.7f;CGFloat offset_y = 0.5f;CGPoint disPoint = CGPointMake(rect.size.width, rect.size.height);UIBezierPath* bezierPath = UIBezierPath.bezierPath;[bezierPath moveToPoint: CGPointMake(disPoint.x-2.38, 0.61+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-1.02, 1.94+offset_y) controlPoint1: CGPointMake(disPoint.x-1.56, 0.82+offset_y) controlPoint2: CGPointMake(disPoint.x-1.02, 1.35+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-1.08, 2.6+offset_y) controlPoint1: CGPointMake(disPoint.x - 1.02, 2.18+offset_y) controlPoint2: CGPointMake(disPoint.x-1.06, 2.51+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x - 1.95,  3.86+offset_y) controlPoint1: CGPointMake(disPoint.x-1.2, 2.97+offset_y) controlPoint2: CGPointMake(disPoint.x - 1.44, 3.26+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x - 8.5, 11.68+offset_y) controlPoint1: CGPointMake(disPoint.x - 1.95, 3.86+offset_y) controlPoint2: CGPointMake(disPoint.x-5.24, 7.79+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x - 8.5, disPoint.y-6.61) controlPoint1: CGPointMake(disPoint.x - 8.5, 43.68) controlPoint2: CGPointMake(disPoint.x - 8.5, disPoint.y-6.61)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-8.8, disPoint.y-3.03) controlPoint1: CGPointMake(disPoint.x - 8.5, disPoint.y-4.85) controlPoint2: CGPointMake(disPoint.x-8.8, disPoint.y-3.03)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-11.03, disPoint.y-0.8) controlPoint1: CGPointMake(disPoint.x -9.18, disPoint.y-1.99) controlPoint2: CGPointMake(disPoint.x-9.99, disPoint.y-1.18)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-14.61, disPoint.y-0.5) controlPoint1: CGPointMake(disPoint.x-11.97, disPoint.y-0.5) controlPoint2: CGPointMake(disPoint.x-12.85, disPoint.y-0.5)];[bezierPath addLineToPoint: CGPointMake( 6.61+offset, disPoint.y-0.5)];[bezierPath addCurveToPoint: CGPointMake(3.03+offset, disPoint.y-0.8) controlPoint1: CGPointMake(4.85+offset, disPoint.y-0.5) controlPoint2: CGPointMake(3.03+offset, disPoint.y-0.8)];[bezierPath addCurveToPoint: CGPointMake(0.8+offset, disPoint.y-3.03) controlPoint1: CGPointMake(1.99+offset, disPoint.y-1.18) controlPoint2: CGPointMake(1.18+offset, disPoint.y-1.99)];[bezierPath addCurveToPoint: CGPointMake(0.5+offset, disPoint.y-6.61) controlPoint1: CGPointMake(0.5+offset, disPoint.y-3.97) controlPoint2: CGPointMake(0.5+offset, disPoint.y-4.85)];[bezierPath addLineToPoint: CGPointMake(0.5+offset, 6.61+offset_y)];[bezierPath addCurveToPoint: CGPointMake(0.8+offset, 3.03+offset_y) controlPoint1: CGPointMake(0.5+offset, 4.85+offset_y) controlPoint2: CGPointMake(0.8+offset, 3.03+offset_y)];[bezierPath addCurveToPoint: CGPointMake(3.03+offset, 0.8+offset_y) controlPoint1: CGPointMake(1.18+offset, 1.99+offset_y) controlPoint2: CGPointMake(1.99+offset, 1.18+offset_y)];[bezierPath addCurveToPoint: CGPointMake(6.61+offset, 0.5+offset_y) controlPoint1: CGPointMake(3.97+offset, 0.5+offset_y) controlPoint2: CGPointMake(4.85+offset, 0.5+offset_y)];[bezierPath addLineToPoint: CGPointMake(disPoint.x-4.36+offset, 0.5+offset_y)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-2.38, 0.61+offset_y) controlPoint1: CGPointMake(disPoint.x-3.39, 0.5+offset_y) controlPoint2: CGPointMake(disPoint.x-2.9, 0.5+offset_y)];[bezierPath setLineWidth:1.f];[bezierPath closePath];return bezierPath;
}- (UIBezierPath *)trangleLeftPathInRect:(CGRect)rect {CGPoint disPoint = CGPointMake(rect.size.width, rect.size.height);UIBezierPath* bezierPath = UIBezierPath.bezierPath;[bezierPath moveToPoint: CGPointMake(2.38, 0.61)];[bezierPath addCurveToPoint: CGPointMake(1.02, 1.94) controlPoint1: CGPointMake(1.56, 0.82) controlPoint2: CGPointMake(1.02, 1.35)];[bezierPath addCurveToPoint: CGPointMake(1.08, 2.6) controlPoint1: CGPointMake(1.02, 2.18) controlPoint2: CGPointMake(1.06, 2.51)];[bezierPath addCurveToPoint: CGPointMake(1.95, 3.86) controlPoint1: CGPointMake(1.2, 2.97) controlPoint2: CGPointMake(1.44, 3.26)];[bezierPath addCurveToPoint: CGPointMake(8.5, 11.68) controlPoint1: CGPointMake(1.95, 3.86) controlPoint2: CGPointMake(5.24, 7.79)];[bezierPath addCurveToPoint: CGPointMake(8.5, disPoint.y-6.61) controlPoint1: CGPointMake(8.5, 43.68) controlPoint2: CGPointMake(8.5, disPoint.y-6.61)];[bezierPath addCurveToPoint: CGPointMake(8.8, disPoint.y-3.03) controlPoint1: CGPointMake(8.5, disPoint.y-4.85) controlPoint2: CGPointMake(8.8, disPoint.y-3.03)];[bezierPath addCurveToPoint: CGPointMake(11.03, disPoint.y-0.8) controlPoint1: CGPointMake(9.18, disPoint.y-1.99) controlPoint2: CGPointMake(9.99, disPoint.y-1.18)];[bezierPath addCurveToPoint: CGPointMake(14.61, disPoint.y-0.5) controlPoint1: CGPointMake(11.97, disPoint.y-0.5) controlPoint2: CGPointMake(12.85, disPoint.y-0.5)];[bezierPath addLineToPoint: CGPointMake(disPoint.x-6.61, disPoint.y-0.5)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-3.03, disPoint.y-0.8) controlPoint1: CGPointMake(disPoint.x-4.85, disPoint.y-0.5) controlPoint2: CGPointMake(disPoint.x-3.03, disPoint.y-0.8)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-0.8, disPoint.y-3.03) controlPoint1: CGPointMake(disPoint.x-1.99, disPoint.y-1.18) controlPoint2: CGPointMake(disPoint.x-1.18, disPoint.y-1.99)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-0.5, disPoint.y-6.61) controlPoint1: CGPointMake(disPoint.x-0.5, disPoint.y-3.97) controlPoint2: CGPointMake(disPoint.x-0.5, disPoint.y-4.85)];[bezierPath addLineToPoint: CGPointMake(disPoint.x-0.5, 6.61)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-0.8, 3.03) controlPoint1: CGPointMake(disPoint.x-0.5, 4.85) controlPoint2: CGPointMake(disPoint.x-0.8, 3.03)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-3.03, 0.8) controlPoint1: CGPointMake(disPoint.x-1.18, 1.99) controlPoint2: CGPointMake(disPoint.x-1.99, 1.18)];[bezierPath addCurveToPoint: CGPointMake(disPoint.x-6.61, 0.5) controlPoint1: CGPointMake(disPoint.x-3.97, 0.5) controlPoint2: CGPointMake(disPoint.x-4.85, 0.5)];[bezierPath addLineToPoint: CGPointMake(4.36, 0.5)];[bezierPath addCurveToPoint: CGPointMake(2.38, 0.61) controlPoint1: CGPointMake(3.39, 0.5) controlPoint2: CGPointMake(2.9, 0.5)];[bezierPath setLineWidth:1.f];[bezierPath closePath];return bezierPath;
}- (UIImage *)trangleImage:(UIImage *)image inRect:(CGRect)rect bezierPath:(UIBezierPath *)bezierPath {// Begin a new image that will be the new image with the rounded corners// (here with the size of an UIImageView)UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);// Add a clip before drawing anything, in the shape of an rounded rect[[UIColor colorWithWhite:0 alpha:0.12] setStroke];[bezierPath stroke];[bezierPath addClip];// Draw your image[image drawInRect:rect];// Get the image, here setting the UIImageView imageUIImage *trangleImage = UIGraphicsGetImageFromCurrentImageContext();// Lets forget about that we were drawingUIGraphicsEndImageContext();return trangleImage;
}

总结

iOS的圆角开销还是比较大的,一旦滥用,必定会引起卡顿,合理的避免使用 mask layer 和 CornerRadius 属性,可以有效的提高性能。

如果可以,记得要缓存处理成圆角的image,不然频繁的绘制也会造成卡顿。

iOS 高性能图片圆角相关推荐

  1. veImageX 演进之路:iOS 高性能图片加载 SDK

    动手点关注 干货不迷路 1.  SDK简介 图片在业务应用场景是一个常见的元素,veImageX(简称ImageX)为业务提供了灵活.高效的一站式图片处理解决方案,包括了服务端 SDK.上传 SDK ...

  2. 从iOS的图片圆角想到渲染

    原文地址:http://chars.tech/2017/07/03/... 圆角是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受.设置圆角会带来一定的性能损耗,如何提高性能是一个需要重点讨 ...

  3. Fast Image Cache – iOS 应用程序高性能图片缓存

    Fast Image Cache 是一种在 iOS 应用程序中高效.持续.超快速的存储和检索图像的解决方案.任何良好的 iOS 应用程序的用户体验都应该是快速,平滑滚动的,Fast Image Cac ...

  4. RN系列之五十三解决Android上图片圆角的终级解决方案

    RN上Android画图角有问题,主要存在几种情况 1.随机性,在页面有多图的情况下,偶现有的图需要画圆角的没有画圆角,有的不需要画圆角的确画了圆角 2.画圆角的不规则性,有时候想画10px的圆角,结 ...

  5. iOS UIButton 图片文字上下垂直布局 解决方案

    iOS UIButton 图片文字上下垂直布局 解决方案 参考文章: (1)iOS UIButton 图片文字上下垂直布局 解决方案 (2)https://www.cnblogs.com/yajunL ...

  6. 使用Picasso实现图片圆角和图片圆形

    作者很好的文章访问量缺很少也很难搜到(我这里插个眼以后用的到) 作者:先知丨先觉 来源:CSDN 原文:https://blog.csdn.net/github_33304260/article/de ...

  7. Android轮播图实现图片圆角,Android开发实现图片圆角的方法

    本文讲述了Android开发实现图片圆角的方法.分享给大家供大家参考,具体如下: Bitmap myCoolBitmap = ... ; // int w = myCoolBitmap.getWidt ...

  8. ios 按钮图片充满按钮_iOS有一些非常危险的按钮-UX评论

    ios 按钮图片充满按钮 I recently bought a cool thing off Amazon. It's an adapter for iPhone, making it easy t ...

  9. Bootstrap中实现图片圆角效果

    Bootstrap 对图片的支持.Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图片圆角. .img-c ...

最新文章

  1. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元
  2. 【Python学习系列二十二】pandas数据筛选和排序
  3. 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应
  4. C#生成二维码(含解码)
  5. 安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程
  6. 前端学习(707):循环小结
  7. 三星+android+7.0+自动纠正单词,升级党必看!三星S/Note系列更新Android 7.0指南
  8. 一站式云原生智能告警运维平台——SLS新版告警发布!
  9. 彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系
  10. python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...
  11. vuecli+axios的post请求传递参数异常
  12. 03JavaScript程序设计修炼之道_2019-06-18_21-41-56_事件onfocus
  13. 第二百二十一节,jQuery EasyUI,Form(表单)组件
  14. 点击触发ajax重复提交表单,屡次连续点击致使Ajax重复提交
  15. 前端如何播放m3u8格式的视频
  16. 《少有人走的路:心智成熟的旅程》读书摘要
  17. tensorflow代码翻译成pytorch代码 -详细教程+案例
  18. VMware View for iPad,上座率最高的iPad免费软件
  19. 一次Python爬虫实战,解决反爬问题!
  20. 什么牌子的护眼灯最好推荐?盘点口碑好的护眼灯品牌

热门文章

  1. android 9.0定时开机的实现
  2. 计算机基础知识 竞赛题库,详细计算机基础知识资料竞赛题目答案.doc
  3. Linux 启动smb服务器,windows连接smb 服务器
  4. 写csv解决Excel打开乱码问题
  5. 关于本次生产认知实习的收获
  6. 阅码场独家在线课程:《深度学习实战大数据》早鸟报名
  7. stm32+ESP8266AT指令详细说明
  8. 【Linux学习】远程连接linux
  9. 级差公排php如何_“专业级差”这么解读,一下就懂了!
  10. kurento 日志配置