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)

完活~

相关推荐
鹏多多14 小时前
Flutter下拉刷新上拉加载侧拉刷新插件:easy_refresh全面使用指南
android·前端·ios
驱动探索者15 小时前
[缩略语大全]之[IOS]篇
ios
kkk_皮蛋1 天前
在移动端使用 WebRTC (Android/iOS)
android·ios·webrtc
Swift社区2 天前
如何在 SwiftUI 中对 CoreImage 滤镜做实时预览
ios·swiftui·cocoa
ipad协议开发2 天前
企业微信iPad协议的开发进程
ios·企业微信·ipad
七月巫山晴2 天前
【iOS】OC中的一些宏
前端·ios·objective-c
初级代码游戏2 天前
iOS开发 SwiftUI Text的基本用法
ios·swiftui·swift
TheNextByte12 天前
如何安全有效地清除iPad数据以便出售?
安全·ios·ipad
十二测试录2 天前
Android和iOS测试区别
android·经验分享·ios·职场发展·ab测试