IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> [Swift]绘制图片模拟倒角效果 -> 正文阅读

[移动开发][Swift]绘制图片模拟倒角效果

如图,需要实现这种对分组倒角的效果。因为直接倒角不好处理,这里就在header中用绘制的图片模拟了倒角效果。
也可以让UI切几张倒角的图片直接使用,这里要用绘制的图片主要是可以随时改变绘制颜色,还可以将这个倒角功能拓展到其他地方使用(比如对UITableView进行性能优化需要避免使用layer.masksToBounds时)。
在这里插入图片描述在这里插入图片描述

用绘制的圆角图片模拟倒角

import Foundation

class ClassifyHeaderReusableView: UICollectionReusableView {
    
    @IBOutlet weak var nameLab: UILabel!
    @IBOutlet weak var oneIV: UIImageView!
    @IBOutlet weak var twoIV: UIImageView!
    @IBOutlet weak var threeIV: UIImageView!
    @IBOutlet weak var fourIV: UIImageView!
    
    var data: ClassifyListModel? {
        didSet {
            nameLab.text = data?.name
        }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        oneIV.image = RoundCornerManager.shared.obtainGrayLBImage()
        twoIV.image = RoundCornerManager.shared.obtainGrayRBImage()
        threeIV.image = RoundCornerManager.shared.obtainGrayLTImage()
        fourIV.image = RoundCornerManager.shared.obtainGrayRTImage()
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
    }
    
}

缓存绘制的圆角图片

import Foundation
import SwiftyJSON

class RoundCornerManager {
    
    private init() {}
    static let shared = RoundCornerManager()
    var v_w: CGFloat = 20.0

    var grayLTImage: UIImage?
    var grayRTImage: UIImage?
    var grayLBImage: UIImage?
    var grayRBImage: UIImage?

    /// 左上
    func obtainGrayLTImage() -> UIImage? {
        if let img = grayLTImage {
            return img
        } else {
            let v = DrawRoundCornerView(frame: CGRect(x: 0, y: 0, w: v_w, h: v_w), mark: 0, color: UIColor(hexString: "#f5f5f5")!)
            if let drawImage = Tools.drawSmoothImage(v) {
                grayLTImage = drawImage
            }
            return grayLTImage
        }
    }
    
    /// 右上
    func obtainGrayRTImage() -> UIImage? {
        if let img = grayRTImage {
            return img
        } else {
            let v = DrawRoundCornerView(frame: CGRect(x: 0, y: 0, w: v_w, h: v_w), mark: 1, color: UIColor(hexString: "#f5f5f5")!)
            if let drawImage = Tools.drawSmoothImage(v) {
                grayRTImage = drawImage
            }
            return grayRTImage
        }
    }
    
    /// 左下
    func obtainGrayLBImage() -> UIImage? {
        if let img = grayLBImage {
            return img
        } else {
            let v = DrawRoundCornerView(frame: CGRect(x: 0, y: 0, w: v_w, h: v_w), mark: 2, color: UIColor(hexString: "#f5f5f5")!)
            if let drawImage = Tools.drawSmoothImage(v) {
                grayLBImage = drawImage
            }
            return grayLBImage
        }
    }
    
    /// 右下
    func obtainGrayRBImage() -> UIImage? {
        if let img = grayRBImage {
            return img
        } else {
            let v = DrawRoundCornerView(frame: CGRect(x: 0, y: 0, w: v_w, h: v_w), mark: 3, color: UIColor(hexString: "#f5f5f5")!)
            if let drawImage = Tools.drawSmoothImage(v) {
                grayRBImage = drawImage
            }
            return grayRBImage
        }
    }
    
}

绘制圆角图片

import Foundation
import UIKit

class DrawRoundCornerView: UIView {
    
    /// 标签 0:左上 1:右上 2:左下 3:右下
    private var xrMark: Int = 0
    /// 渲染颜色
    private var xrColor: UIColor = UIColor(hexString: "#f5f5f5")!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .clear
        self.isOpaque = false
        self.layer.shouldRasterize = true
        self.layer.contentsScale = UIScreen.main.scale
    }
    
    convenience init(frame: CGRect, mark: Int, color: UIColor) {
        self.init(frame: frame)
        xrMark = mark
        xrColor = color
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func draw(_ rect: CGRect) {
         super.draw(rect)
        // UIColor.green.setFill()
        // UIRectFill(rect)
        
        // 设置绘制的颜色
        let tempColor = xrColor
        tempColor.set()
        let context = UIGraphicsGetCurrentContext()
        // 设置宽度
        context?.setLineWidth(1)
        context?.setStrokeColor(tempColor.cgColor);
        /**
         绘制圆弧
         @center : 圆弧的中心点。
         @radius : 圆弧的半径。
         @startAngle : 圆弧开始的角度。
         @endAngle : 圆弧结束的角度。
         @clockwise: 绘制圆弧的方向。true为顺时针,false为逆时针。
         例子
         context?.addArc(center: CGPoint(x: rect.size.width * 0.5, y: rect.size.height * 0.5), radius: 40, startAngle: 0, endAngle: .pi * 2, clockwise: true)
         */
        let temp_w = rect.size.width
        /// 标签 0:左上 1:右上 2:左下 3:右下
        if xrMark == 0 {
            context?.addLines(between: [CGPoint(x: 0, y: temp_w), CGPoint(x: 0, y: 0), CGPoint(x: temp_w, y: 0)])
            // 移动起始点
            context?.move(to: CGPoint(x: temp_w, y: 0))
            /**
             有两个切点和半径绘制圆弧
             @tangent1End : 切点一。
             @tangent2End : 切点二。
             @radius : 圆弧的半径。
             */
            context?.addArc(tangent1End: CGPoint(x: 0, y: 0), tangent2End: CGPoint(x: 0, y: temp_w), radius: temp_w)
        } else if xrMark == 1 {
            context?.addLines(between: [CGPoint(x: temp_w, y: temp_w), CGPoint(x: temp_w, y: 0), CGPoint(x: 0, y: 0)])
            context?.move(to: CGPoint(x: 0, y: 0))
            context?.addArc(tangent1End: CGPoint(x: temp_w, y: 0), tangent2End: CGPoint(x: temp_w, y: temp_w), radius: temp_w)
        } else if xrMark == 2 {
            context?.addLines(between: [CGPoint(x: temp_w, y: temp_w), CGPoint(x: 0, y: temp_w), CGPoint(x: 0, y: 0)])
            context?.move(to: CGPoint(x: 0, y: 0))
            context?.addArc(tangent1End: CGPoint(x: 0, y: temp_w), tangent2End: CGPoint(x: temp_w, y: temp_w), radius: temp_w)
        } else if xrMark == 3 {
            context?.addLines(between: [CGPoint(x: 0, y: temp_w), CGPoint(x: temp_w, y: temp_w), CGPoint(x: temp_w, y: 0)])
            context?.move(to: CGPoint(x: temp_w, y: 0))
            context?.addArc(tangent1End: CGPoint(x: temp_w, y: temp_w), tangent2End: CGPoint(x: 0, y: temp_w), radius: temp_w)
        }
        /**
         填充路径
         CGPathFillRule 的参数有两个:
         @.evenOdd
         @.winding
         */
        context?.fillPath(using: .winding)
        // 闭合路径
        context?.strokePath()
    }
    
}

截图

extension Tools {
  
    /// 截图
    static func drawSmoothImage(_ view: UIView) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0)
        if let content = UIGraphicsGetCurrentContext() {
            view.layer.render(in: content)
            if let image = UIGraphicsGetImageFromCurrentImageContext(){
                UIGraphicsEndImageContext()
                return image
            }
            return nil
        }
        return nil
    }
  
}

上面完结,下面将倒角拓展到自定义UIView中。

拓展

现在对UITableView进行性能优化需要避免使用layer.masksToBounds
效果图
在这里插入图片描述在这里插入图片描述

class GARoundCornerView: UIView {
    
    @IBInspectable var ivWidth: CGFloat = 10
    @IBInspectable var ivIsWhite: Bool = false
    private var ltIV = UIImageView()
    private var rtIV = UIImageView()
    private var lbIV = UIImageView()
    private var rbIV = UIImageView()
    
    override func layoutSubviews() {
        super.layoutSubviews()
        ltIV.contentMode = .scaleToFill
        rtIV.contentMode = .scaleToFill
        lbIV.contentMode = .scaleToFill
        rbIV.contentMode = .scaleToFill
        if ivIsWhite {
            ltIV.image = RoundCornerManager.shared.obtainWhiteLTImage()
            rtIV.image = RoundCornerManager.shared.obtainWhiteRTImage()
            lbIV.image = RoundCornerManager.shared.obtainWhiteLBImage()
            rbIV.image = RoundCornerManager.shared.obtainWhiteRBImage()
        } else {
            ltIV.image = RoundCornerManager.shared.obtainGrayLTImage()
            rtIV.image = RoundCornerManager.shared.obtainGrayRTImage()
            lbIV.image = RoundCornerManager.shared.obtainGrayLBImage()
            rbIV.image = RoundCornerManager.shared.obtainGrayRBImage()
        }
        
        self.addSubview(ltIV)
        ltIV.snp.remakeConstraints { make in
            make.left.equalTo(0)
            make.top.equalTo(0)
            make.width.equalTo(ivWidth)
            make.height.equalTo(ivWidth)
        }
        
        self.addSubview(rtIV)
        rtIV.snp.remakeConstraints { make in
            make.right.equalTo(0)
            make.top.equalTo(0)
            make.width.equalTo(ivWidth)
            make.height.equalTo(ivWidth)
        }
        
        self.addSubview(lbIV)
        lbIV.snp.remakeConstraints { make in
            make.left.equalTo(0)
            make.bottom.equalTo(0)
            make.width.equalTo(ivWidth)
            make.height.equalTo(ivWidth)
        }
        
        self.addSubview(rbIV)
        rbIV.snp.remakeConstraints { make in
            make.right.equalTo(0)
            make.bottom.equalTo(0)
            make.width.equalTo(ivWidth)
            make.height.equalTo(ivWidth)
        }
    }
 
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:13:15  更:2022-04-01 00:14:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:03:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码