改变APP的图标

下面介绍的应用图标切换的方法只是其中的一个思路.并不是说要切换应用图标只有这一种方法.如果有其他更好的方法可以私信交流一下.

1.首先,这个方法需要设置Info.plist文件.

改变APP的图标_第1张图片

字段名1:CFBundleAlternateIcons
字段名2:CFBundleIconFiles

///这是Source Code版的
CFBundleIcons
	
		CFBundleAlternateIcons
		
			AppIconBlue
			
				CFBundleIconFiles
				
					appIconBlueiPhoneApp_60pt
				
			
			AppIconRed
			
				CFBundleIconFiles
				
					appIconRediPhoneApp_60pt
				
			
		
		CFBundlePrimaryIcon
		
			CFBundleIconFiles
			
				
			
			UIPrerenderedIcon
			
		
	

item0是String类型的,item0的内容就是图片的名字.可以不带图片的拓展名.

	///切换应用图标
    @IBAction func whiteAppIconBtnClick(_ sender: UIButton) {
        if supportAlternateIcons() == true {
            UIApplication.shared.setAlternateIconName(nil, completionHandler:nil)
        }
    }

    @IBAction func redAppIconBtnClick(_ sender: UIButton) {
        if supportAlternateIcons() == true {
            UIApplication.shared.setAlternateIconName("AppIconRed", completionHandler:nil)
        }
    }

    @IBAction func blueAppIconBtnClick(_ sender: UIButton) {
        if supportAlternateIcons() == true {
            UIApplication.shared.setAlternateIconName("AppIconBlue", completionHandler:nil)
        }
    }

    func supportAlternateIcons() -> Bool {///判断是否支持切换应用的APPIcon
        return UIApplication.shared.supportsAlternateIcons
    }

####Swift中的方法交换
我们看到.每次切换应用图片的时候都会有一个弹窗,我们现在想要把这个弹窗给去掉.那么怎么去掉呢.
按照OC的Runtime.那么就是MethodSwizzing.也就是方法交换啦.

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        ///交换方法去使系统的APP图标已经改变不弹出
        let firstMethod = class_getInstanceMethod(self.classForCoder,#selector(dy_present(_:animated:completion:)))
        let secondMethod = class_getInstanceMethod(self.classForCoder,#selector(present(_:animated:completion:)))
        method_exchangeImplementations(firstMethod!, secondMethod!)
    }

	func dy_present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
        if viewControllerToPresent.isKind(of: UIAlertController.classForCoder()) {
            print("yes")
        }
    }

但是按照OC的这个来写的话.方法并不会交换.
原因,OC是消息机制的一门语言.调用什么方法是在程序运行的时候才决定的.就相当于.方法A,B,C,D都在一个小黑屋里面.对象AA往小黑屋里面喊话.我要调用A方法啦.一般情况下,A方法就被调用了.方法交换是个什么意思呢.就相当于喊A的时候,这时候小黑屋的管理员说.A你不用出去执行方法.你和C交换一下.差不多是这个意思.

解决:在要交换的方法处插入@objc dynamic

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        ///交换方法去使系统的APP图标已经改变不弹出
        let firstMethod = class_getInstanceMethod(self.classForCoder,#selector(dy_present(_:animated:completion:)))
        let secondMethod = class_getInstanceMethod(self.classForCoder,#selector(present(_:animated:completion:)))
        method_exchangeImplementations(firstMethod!, secondMethod!)
    }

    @objc dynamic func dy_present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
        if viewControllerToPresent.isKind(of: UIAlertController.classForCoder()) {
            print("yes")
        }
    }

运行结果:

github地址

你可能感兴趣的:(UIKit,UIKit笔记)