一、什么是点9图?

点9图是Android开发中用到的一种特殊格式的图片,后缀名是“.9.png”的图片。左上两条线控制可拉伸区域(未画线表示不可拉伸),右下两条线控制内容显示区(无文字内容不画)。

二、点9图的作用是什么?

简单来说,点9图的作用就是可以保证图片在不模糊变形的前提下做到自适应。

什么意思呢?我们来举个简单的例子说明吧。下图是我们常见的按钮背景,切图的时候如果没有用点9切图,开发想改变按钮的高度的时候,会直接整体拉伸,得到的结果就是圆角就变形了,如下图:

那么用点9图之后,会通过左、上两条横线定义图片可以拉伸的部分,问题就得到了解决啦,如下图:

三 iOS中如何处理图片局部拉伸

iOS中处理进行图片局部拉伸,相关API如下:

@available(iOS 5.0, *)
open func resizableImage(withCapInsets capInsets: UIEdgeInsets) -> UIImage@available(iOS 6.0, *)
open func resizableImage(withCapInsets capInsets: UIEdgeInsets, resizingMode: UIImage.ResizingMode) -> UIImage

capInsets定义图片的不拉伸范围(这个范围是相对于源图片大小而言),resizingMode定义了图片以拉伸/平铺的方式变换。

四 iOS中如何处理点9图片

iOS和安卓为了可以统一用一套UI,iOS需要显示点九图片,具体思路是获取到图片中上、左两条直线的像素颜色值,取得黑线距离两边的距离即为不可拉伸区域,得到上下左右不可拉伸区域之后,用iOS局部拉伸API处理

 func  ninePatchImage(_ scale: Int = 3) -> UIImage{guard let imageRef = self.cgImage else{return self}guard let rgbaImage :[[CGFloat]] = getRGBA() else{return self}let scale:CGFloat = CGFloat(scale)//最上边一行的各像素点数组var topBarRgba:[[CGFloat]] = []for i in 1..<imageRef.width - 1 {topBarRgba.append(rgbaImage[i])}//最左边一排像素点数组var leftBarRgba = [[CGFloat]]()for i in 0..<rgbaImage.count {if i % imageRef.width == 0{leftBarRgba.append(rgbaImage[i])}}leftBarRgba.removeFirst()leftBarRgba.removeLast()guard let edge = stretchEdge(topBarRgba: topBarRgba, leftBarRgba: leftBarRgba) else {return self}if let  cgImage = self.cgImage?.cropping(to: CGRect(x: 1, y: 1, width: self.size.width - 2, height: self.size.height - 2)){var cropImage = UIImage.init(cgImage: cgImage, scale: CGFloat(scale), orientation: .up)cropImage = cropImage.resizableImage(withCapInsets: UIEdgeInsets(top: edge.top/scale, left: edge.left/scale, bottom: edge.bottom/scale, right: edge.right/scale),resizingMode: .stretch)return cropImage}return self}

获取黑线距离各边的具体长度

private func stretchEdge(topBarRgba:[[CGFloat]],leftBarRgba:[[CGFloat]]) -> UIEdgeInsets?{var left = -1for i in 0..<topBarRgba.count {if topBarRgba[i][3] == 1 {left = ibreak}}if left == -1{return nil}var right = -1for i in (0..<topBarRgba.count).reversed() {if topBarRgba[i][3] == 1 {right = ibreak}}if right == -1{return nil}var top = -1for i in (0..<leftBarRgba.count) {if leftBarRgba[i][3] == 1 {top = ibreak}}if top == -1{return nil}var bottom = -1for i in (0..<leftBarRgba.count).reversed() {if leftBarRgba[i][3] == 1 {bottom = ibreak}}if bottom == -1{return nil}bottom = leftBarRgba.count - 1 - bottomright = topBarRgba.count - 1 - rightreturn UIEdgeInsets(top: CGFloat(top), left: CGFloat(left), bottom: CGFloat(bottom), right: CGFloat(right))}

地址: https://github.com/duzhaoquan/DQTool

iOS Swift处理点9图片相关推荐

  1. IOS Swift 5.0 获取图片-相册、拍照

    一.创建项目 这个很简单,创建好了看下面的就行了 二.添加权限 拍照和获取相册都需要先设置权限 三.布局 实现一个简单的布局,同一个界面,一个按钮 Button,一张图片 ImageView 四.实现 ...

  2. iOS Swift 高仿微信

    LXFWeChat Swift 3.0 高仿微信 两个测试账号: lxf lqr  密码都是123456 源码地址 码云 http://git.oschina.net/LinXunFeng/LXFWe ...

  3. iOS - Swift 高仿微信

    LXFWeChat Swift 3.0 高仿微信 源码地址 码云 https://git.oschina.net/coderlxf/LXFWeChat GitHub https://github.co ...

  4. iOS 实现启动屏动画(Swift实现,包含图片适配)

    代码地址如下: http://www.demodashi.com/demo/12090.html 准备工作 首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的.一般启动屏展示会有上下两 ...

  5. PodfileKit将github上常见的iOS(Swift)第三方框架进行了汇总,并且将框架进行了分类,为用户管理第三方框架提供了方便。

    PodfileKit ======================== Easy Podfile ! PodfileKit将github上常见的iOS(Swift)第三方框架进行了汇总,并且将框架进行 ...

  6. IOS Swift 入门学习汇总 (更新中..)

    IOS Swift 学习入门 配置区 info 配置 本地化中文 文件导入Xcode CocoaPads 依赖管理工具 UI区 + 代码 通用 打开新页面方式 设置新开页面全屏展示 跳转页面 正向传值 ...

  7. iOS Swift 5中的键盘处理

    This article was originally published at CometChat. 本文最初在CometChat上发布. "Handling Keyboard in iO ...

  8. Facebook iOS 应用是如何加速图片显示的?

    本文讲的是Facebook iOS 应用是如何加速图片显示的?, 你的Facebook的动态消息中充满着一些关于你朋友.家人以及你所爱的人的照片,也许你会想要在手机上也能重温那些场景.我们一直在寻找提 ...

  9. IOS swift项目的单例模式.swift5以后的单例模式

    IOS swift项目的单例模式.swift5以后的单例模式 不能继承NSObject 第一种写法,最简单 class SoundTools{static let sharedInstance = S ...

最新文章

  1. 中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.3 人工智能在各医学亚专科的发展态势...
  2. 利用XML实现通用WEB报表打印(转载)
  3. Web数据库:信息化持续改善的最佳工具
  4. unique_ptr使用介绍
  5. 利用IDA6.6进行apk dex代码动态调试
  6. aaynctask控制多个下载进度_C# 多线程方法 控制两个进度条
  7. c语言编写程序计算行列式值,新手作品:行列式计算C语言版
  8. Java购物车swing_JAVA课程设计--购物车
  9. C++/Java线程之分
  10. phpmyadmin误删表后如何恢复
  11. vim编辑器使用教程
  12. html5回到顶部代码,JS返回顶部实例代码
  13. 欧姆龙rxd指令讲解_欧姆龙PLC指令的列表
  14. vss跟tfs_从VSS 2005迁移到TFS 2010后,VS 2008出现“差异”错误
  15. electron图标
  16. 性能测试---影响性能的因素
  17. 对模型进行DP处理(DP-SGD+DP-Logits)
  18. Fiddler手机APP抓包及无法连接网络问题处理
  19. Python爬虫—爬取网易云音乐【热歌榜】歌曲的精彩评论(写入txt文本文件或者MySQL数据库)
  20. 防雷接地系统中的浪涌保护器分类选型

热门文章

  1. 实验吧CTF逆向题目Just Click题解
  2. [基于树莓派]深入剖析Kubernetes - 1
  3. Secure Code Warrior - got Java Yellow/White Belt
  4. Windows Server群集感知更新(CAU)-上
  5. 【性能测试】Jmeter工具使用3-练习题详细答案
  6. 使用oracle的一点心得(不错)
  7. Digital.Canal.JobTracker.v4.10.227.4 1CD
  8. mysql 加写锁_MySQL中的读锁和写锁
  9. 织梦dede建站仿站入门到精通
  10. WdatePicker 时间插件