Swift4.0 全局修改字體 kvocontroller監聽

參考 V2ex ->https://github.com/Finb/V2ex-Swift

在此進行了簡化,適合萌新學習,包括我自己

import UIKit
import KVOController   //oc的框架

class TTTViewController: UIViewController {
    
    @IBOutlet weak var lb: UILabel!
    @IBAction func Largeaction(_ sender: Any) {
        
        model.setFontSize(size: Model.modelLarge)
        
        
    }
    
    
    @IBAction func MAction(_ sender: Any) {
        

        model.setFontSize(size: Model.modelMiddle)

    }
    
    
    @IBAction func sAction(_ sender: Any) {
        

        model.setFontSize(size: Model.modelSmall)

    }
    
    
    let model = Model.sharedInstance;

    override func viewDidLoad() {
        super.viewDidLoad()

        ///每個要改字體的頁面要有這個block
        self.fontChangedHandler = { font in
            
            print("TTT字體大小改變:\(font)   ---------------- 5")

            self.lb.font = UIFont.systemFont(ofSize: CGFloat(font));
            
        }
        
    
    
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        self.dismiss(animated: true, completion: nil)
    }
}

import UIKit


protocol FontSizrProtocol {
    
    var sizeLarge:CGFloat {get}
    var sizeMiddle:CGFloat{get}
    var sizeSmall:CGFloat{get}
}


class Model: NSObject,FontSizrProtocol {
   
    
    static let sharedInstance = Model()
    override init() {
        
        FontSize = "Middle";
        super.init();

    }
    
    static let modelLarge = "Large"
    static let modelMiddle = "Middle"
    static let modelSmall = "Small"

    @objc dynamic var FontSize:String

   var font = 17;
    
    var sizeLarge: CGFloat{
        
        return 30;
    }
    
    var sizeMiddle: CGFloat{
        
        return 20;
    }
    
    var sizeSmall: CGFloat{
        
        return 10
    }
    

    func setFontSize(size:String) {
        
        if FontSize == size {
            
            return
        }
        
        
        if size == "Large"{
            font = 30;
        }
        
        if size == "Middle"{
            
            font = 20
        }
        
        
        if size == "Small" {
            
            font = 10
        }
        
        self.FontSize = size;
        
    }
    
}



extension NSObject {
    
    fileprivate struct AssociatedKeys {
        static var thmemChanged = "thmemChanged"
        static var fontChanged = "fontChanged"
    }
    
    
    
    public typealias FontChangedClosure = @convention(block) (_ fontSize:Float) ->Void
    
    
    var fontChangedHandler:FontChangedClosure?{
        
        get{
            print("-------------- get now  ---------- 4 ")
            
            let closureObject: AnyObject? = objc_getAssociatedObject(self, &AssociatedKeys.fontChanged) as AnyObject?
            guard closureObject != nil else{
                return nil
            }
            let closure = unsafeBitCast(closureObject, to: FontChangedClosure.self)
            return closure        }
        
        set{
            print("------------ set now -----------  2 ")
            guard let value = newValue else{
                return
            }
            
            let dealObject: AnyObject = unsafeBitCast(value, to: AnyObject.self)
            objc_setAssociatedObject(self, &AssociatedKeys.fontChanged,dealObject,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            
            
            self.kvoController.observe(Model.sharedInstance, keyPath: "FontSize", options: [.initial,.new] , block: {[weak self] (nav, color, change) -> Void in
                
                print("--------監聽到了------  3")
                
                self?.fontChangedHandler?(Float(Model.sharedInstance.font))
                
                
                }
            )
            
        }
        
    }
    
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章