• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

iOS Swift处理点9图片

武飞扬头像
不凡的凡
帮助1

一、什么是点9图?

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

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

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

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

学新通

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

学新通

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

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

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

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

四 iOS中如何处理点9图片

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

  1.  
    func ninePatchImage(_ scale: Int = 3) -> UIImage{
  2.  
    guard let imageRef = self.cgImage else{
  3.  
    return self
  4.  
    }
  5.  
     
  6.  
    guard let rgbaImage :[[CGFloat]] = getRGBA() else{
  7.  
    return self
  8.  
    }
  9.  
    let scale:CGFloat = CGFloat(scale)
  10.  
     
  11.  
    //最上边一行的各像素点数组
  12.  
    var topBarRgba:[[CGFloat]] = []
  13.  
    for i in 1..<imageRef.width - 1 {
  14.  
    topBarRgba.append(rgbaImage[i])
  15.  
    }
  16.  
     
  17.  
     
  18.  
     
  19.  
    //最左边一排像素点数组
  20.  
    var leftBarRgba = [[CGFloat]]()
  21.  
    for i in 0..<rgbaImage.count {
  22.  
    if i % imageRef.width == 0{
  23.  
    leftBarRgba.append(rgbaImage[i])
  24.  
    }
  25.  
    }
  26.  
    leftBarRgba.removeFirst()
  27.  
    leftBarRgba.removeLast()
  28.  
     
  29.  
     
  30.  
    guard let edge = stretchEdge(topBarRgba: topBarRgba, leftBarRgba: leftBarRgba) else {
  31.  
    return self
  32.  
    }
  33.  
     
  34.  
    if let cgImage = self.cgImage?.cropping(to: CGRect(x: 1, y: 1, width: self.size.width - 2, height: self.size.height - 2)){
  35.  
     
  36.  
    var cropImage = UIImage.init(cgImage: cgImage, scale: CGFloat(scale), orientation: .up)
  37.  
    cropImage = cropImage.resizableImage(withCapInsets: UIEdgeInsets(top: edge.top/scale, left: edge.left/scale, bottom: edge.bottom/scale, right: edge.right/scale),resizingMode: .stretch)
  38.  
    return cropImage
  39.  
     
  40.  
    }
  41.  
     
  42.  
     
  43.  
    return self
  44.  
    }

学新通

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

  1.  
    private func stretchEdge(topBarRgba:[[CGFloat]],leftBarRgba:[[CGFloat]]) -> UIEdgeInsets?{
  2.  
    var left = -1
  3.  
    for i in 0..<topBarRgba.count {
  4.  
    if topBarRgba[i][3] == 1 {
  5.  
    left = i
  6.  
    break
  7.  
    }
  8.  
    }
  9.  
    if left == -1{
  10.  
    return nil
  11.  
    }
  12.  
    var right = -1
  13.  
    for i in (0..<topBarRgba.count).reversed() {
  14.  
    if topBarRgba[i][3] == 1 {
  15.  
    right = i
  16.  
    break
  17.  
    }
  18.  
    }
  19.  
    if right == -1{
  20.  
    return nil
  21.  
    }
  22.  
     
  23.  
    var top = -1
  24.  
    for i in (0..<leftBarRgba.count) {
  25.  
    if leftBarRgba[i][3] == 1 {
  26.  
    top = i
  27.  
    break
  28.  
    }
  29.  
    }
  30.  
    if top == -1{
  31.  
    return nil
  32.  
    }
  33.  
     
  34.  
     
  35.  
    var bottom = -1
  36.  
    for i in (0..<leftBarRgba.count).reversed() {
  37.  
    if leftBarRgba[i][3] == 1 {
  38.  
    bottom = i
  39.  
    break
  40.  
    }
  41.  
    }
  42.  
    if bottom == -1{
  43.  
    return nil
  44.  
    }
  45.  
    bottom = leftBarRgba.count - 1 - bottom
  46.  
    right = topBarRgba.count - 1 - right
  47.  
     
  48.  
    return UIEdgeInsets(top: CGFloat(top), left: CGFloat(left), bottom: CGFloat(bottom), right: CGFloat(right))
  49.  
    }

学新通

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgichib
系列文章
更多 icon
同类精品
更多 icon
继续加载