iOS Swift处理点9图片
一、什么是点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 = -1
-
for i in 0..<topBarRgba.count {
-
if topBarRgba[i][3] == 1 {
-
left = i
-
break
-
}
-
}
-
if left == -1{
-
return nil
-
}
-
var right = -1
-
for i in (0..<topBarRgba.count).reversed() {
-
if topBarRgba[i][3] == 1 {
-
right = i
-
break
-
}
-
}
-
if right == -1{
-
return nil
-
}
-
-
var top = -1
-
for i in (0..<leftBarRgba.count) {
-
if leftBarRgba[i][3] == 1 {
-
top = i
-
break
-
}
-
}
-
if top == -1{
-
return nil
-
}
-
-
-
var bottom = -1
-
for i in (0..<leftBarRgba.count).reversed() {
-
if leftBarRgba[i][3] == 1 {
-
bottom = i
-
break
-
}
-
}
-
if bottom == -1{
-
return nil
-
}
-
bottom = leftBarRgba.count - 1 - bottom
-
right = topBarRgba.count - 1 - right
-
-
return UIEdgeInsets(top: CGFloat(top), left: CGFloat(left), bottom: CGFloat(bottom), right: CGFloat(right))
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgichib
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13