//
//  IconFont.swift
//  LearnSwift
//
//  Created by 张琳 on 2018/8/7.
//  Copyright © 2018年 张琳. All rights reserved.
//

import UIKit
import CoreText


/// 字体图标工具类
public class IconFont: NSObject {
    
    public var code:String       //标准解析格式 比如："\u{a62b}"
    public var name:String       //字体图标库名字
    public var labelText:String //可以直接赋值给UILabel,以系统字体大小为基准
    public var iconImage:UIImage! //生成一个一般的iconImge  如果需要其他大小的可以自己调整， 使用第二个初始化中代码段。
    
    ///初始化图标
    /// - important : fontsize可通过外部font的size调整,而且必须设置UILabel的font,否则无法正常显示。比如：
    /// - label.font = UIFont.init(name: "IconFont", size: UIFont.systemFontSize)
    /// - parameter code: 标准解析格式，比如："\u{a62b}"
    /// - parameter name:图标的中文名
    public init(code:String, name:String) {
        self.code = code
        self.name = name
        //为UILabel使用的做准备
        let label = UILabel()
        label.text = code
        self.labelText = label.text!
    }
    
    
    ///初始化图标 ,图片可用
    /// - important :图片大小由iconFont的fontSize自动计算决定。建议UIImageView大小参考打印值,这样的图片显示效果是最好的。
    /// - parameter code: 标准解析格式，比如："\u{a62b}"
    /// - parameter name:图标的中文名
    /// - parameter fontSize:图标（字体大小）
    /// - parameter color:图标的颜色
    public convenience init(code:String, name:String, fontSize:CGFloat, color:UIColor){
        self.init(code: code, name: name)
        //计算文本rect
        let nscode = code as NSString
        let rect = nscode.boundingRect(with:CGSize(width: 0.0, height: 0.0) , options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font :  UIFont(name: name, size: fontSize)!], context: nil)
        let size = rect.size
        print("建议图片大小：\(size)") //建议UIImageView大小参考打印值
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        label.font = UIFont(name: name, size: fontSize)
        label.textAlignment = .center
        label.textColor = color
        label.text = code
        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        self.iconImage = image!
    }
    
    ///直接生成该图标的UIImage 对象
    /// - important :图片大小由iconFont的fontSize自动计算决定。建议UIImageView大小参考打印值,这样的图片显示效果是最好的。
    /// - parameter fontSize:图标（字体大小）
    /// - parameter color:图标的颜色
    public func iconFontImage(fontSize:CGFloat, color:UIColor) -> UIImage {
        //计算iconFont的宽高
        let nscode = code as NSString
        let rect = nscode.boundingRect(with:CGSize(width: 0.0, height: 0.0) , options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: fontSize)], context: nil)
        let size = rect.size
        print("建议图片大小：\(size)") //建议UIImageView大小参考打印值
        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        label.font = UIFont(name: name, size: fontSize) //??为什么用IconFont和字体文件名一致（首字母大小写无所谓）,但是不能换为其他的，哪怕你的iconFont的名字为其他的。
        label.textAlignment = .center
        label.text = code
        label.textColor = color
        label.layer.render(in: UIGraphicsGetCurrentContext()!)   //??深入了解layer
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image!
        
    }


}


//MARK: - 扩展UILable
public extension UILabel{
    
    ///直接通过UILabel加载iconfont
    /// - parameter iconfont: 图标的编码标准格式如："\u{a626}"
    public convenience init(iconfont code:String, name:String, frame: CGRect ,fontSize:CGFloat) {
        self.init(frame: frame)
        self.text = code
        self.font = UIFont(name: name, size: fontSize)
        self.textAlignment = .center
    }
}

