为啥使用iconfont 理由一堆,反正现在就让我用了。 纯色ICon,都用iconfont。
用的多,所以要封装一下。 iconfont可以用于UILabel显示,也可以是UIImage。 我这里封装了一个返回UILabel和UIImageView的,连同带点击事件。
刚开始网上找找有没有封装好的方法,一直都不太好用,干脆自己搞一个吧。
直接上代码
- 先获取所有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)
完活~