iOS开发使用iconfont,封装返回UILabel、UIImage、UIImageView

为啥使用iconfont 理由一堆,反正现在就让我用了。 纯色ICon,都用iconfont。
用的多,所以要封装一下。 iconfont可以用于UILabel显示,也可以是UIImage。 我这里封装了一个返回UILabel和UIImageView的,连同带点击事件。
刚开始网上找找有没有封装好的方法,一直都不太好用,干脆自己搞一个吧。
直接上代码
  1. 先获取所有iconfont名称,后面方便直接用
ini 复制代码
public enum IconFontName: String {
    case downLoad = "\u{e60f}"
    case selectRight = "\u{e611}"
    case rightArrow = "\u{e612}"
    case closeIcon = "\u{e614}"
    case listIcon = "\u{e616}" 
    case avater = "\u{e617}"
    case backIcon = "\u{e618}"
    case feedback = "\u{e619}"
    case wrongIcon = "\u{e61b}" 
    case editIcon = "\u{e61c}"
    case warning = "\u{e610}"  
    case score = "\u{e60e}"
    case time = "\u{e60c}"
    case imageIcon = "\u{e60d}"
}

2.返回UILabel,带点击事件

ini 复制代码
class ExIconFont {

    class func iconFontToLabel(frame: CGRect = .zero, fontSize: CGFloat, fontName: String, iconName: String = "", action:(()->Void)?) -> UILabel 
        let lab = UILabel(frame: frame)
        lab.font = R.font.iconfont(size: fontSize)
        lab.text = fontName
        lab.isUserInteractionEnabled = true
        let tap = ClosureTapGestureRecognizer()
        lab.addGestureRecognizer(tap)
        tap.addAction { tap in
            guard let action = action else {
                return
            }
            action()
        }
        return lab
    }

3.返回UILabel有时候不行,那就在加封装返回一个UIImage 或者 UIImageView。 我这里直接返回了UIImageView, 方便使用。

swift 复制代码
class func iconfontToImage(iconText: String, fontSize: CGFloat, fontColor: UIColor, action:(()->Void)?) -> UIImageView {
        // 这里我使用的R.Swift资源管理, 你可以直接用:UIFont(name: "你的iconfont名称", size: fontSize)
        let font = R.font.iconfont(size: fontSize)
        let attributes = [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: fontColor]
        let attributedString = NSAttributedString(string: iconText, attributes: attributes as [NSAttributedString.Key : Any])

        UIGraphicsBeginImageContextWithOptions(CGSize(width: fontSize, height: fontSize), false, 0)
        attributedString.draw(at: CGPoint(x: 0, y: 0))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        // 如果不想用UIIimageView , 这里直接返回image即可。 return image
        
        let imageV = UIImageView(image: image)
        imageV.isUserInteractionEnabled = true
        let tap = ClosureTapGestureRecognizer()
        imageV.addGestureRecognizer(tap)
        tap.addAction { tap in
            guard let action = action else {
                return
            }
            action()
        }
        return imageV
    }

3.自定义一个点击事件封装

swift 复制代码
/// 自定义tapgesture 闭包方式回调
class ClosureTapGestureRecognizer: UITapGestureRecognizer {
    private var action: ((UITapGestureRecognizer) -> Void)?

    func addAction(_ action: @escaping ((UITapGestureRecognizer) -> Void)) {
        self.action = action
    }

    @objc func handleAction(sender: UITapGestureRecognizer) {
        guard let action = action else { return }

        action(sender)
    }

   
    override init(target: Any?, action: Selector?) {
        super.init(target: target, action: action)

        self.addTarget(self, action: #selector(handleAction(sender:)))
    }
}

4.使用方法

php 复制代码
        // 返回label
        let iconLabel = ExIconFont.iconFontLabel(fontSize: 24, fontName: IconFontName.avater.rawValue) {
           self.navigationController?.pushViewController(PersonViewController(), animated: true)
        }
        // 返回UIImageView
        let iconFontImageV = ExIconFont.iconfontToImage(iconText: IconFontName.avater.rawValue, fontSize: 24, fontColor: .black) {
        // 点击事件
           self.navigationController?.pushViewController(PersonViewController(), animated: true)
        }

        // 直接赋值
        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: iconFontImageV)

完活~

相关推荐
Digitally1 小时前
3种简单方法备份 iPhone 短信
ios·iphone
2501_915921431 小时前
Flutter App 到底该怎么测试?如何在 iOS 上进行测试
android·flutter·ios·小程序·uni-app·cocoa·iphone
二流小码农1 小时前
鸿蒙开发:一个底部的曲线导航
android·ios·harmonyos
2501_915909061 小时前
如何在 Windows 上上架 iOS App,分析上架流程哪些是不用mac的
android·macos·ios·小程序·uni-app·iphone·webview
TheNextByte12 小时前
如何用 5 种简单方法抹掉 iPhone 上的密码?
ios·iphone
2501_915921432 小时前
分析 iOS 描述文件创建与管理中常见的问题
android·ios·小程序·https·uni-app·iphone·webview
东坡肘子2 小时前
Swift、SwiftUI 与 SwiftData:走向成熟的 2025 -- 肘子的 Swift 周报 #116
人工智能·swiftui·swift
大熊猫侯佩14 小时前
Swift 6.2 列传(第十三篇):香香公主的“倾城之恋”与优先级飞升
swift·编程语言·apple
专业开发者19 小时前
调试 iOS 蓝牙应用的新方法
物联网·macos·ios·cocoa
1024小神1 天前
Swift配置WKwebview加载网站或静态资源后,开启调试在电脑上debug
swift