// // LaunchADView.swift // TianFeng // // Created by Apple on 2022/5/5. // import Foundation import UIKit public class LaunchADView: UIView { let screenW = UIScreen.main.bounds.width let screenH = UIScreen.main.bounds.height var adImgView = UIImageView() var countBtn = UIButton() var webURL: String? var countTimer: Timer? var count: NSInteger? { didSet { RunLoop.main.add(countTimer!, forMode: RunLoop.Mode.common) } } var touchBlock: ((String?) -> ())? public static func show(touchBlock: @escaping ((String?) -> ())) { let view = LaunchADView() view.touchBlock = touchBlock view.countTimer = Timer.scheduledTimer(timeInterval: 1.0, target: view, selector: #selector(countDown), userInfo: nil, repeats: true) if let model = LaunchADModel.getLocalModel() { if let localPath = model.localPath { do { let data = try Data.init(contentsOf: localPath) view.adImgView.image = UIImage.init(data: data) view.countBtn.setTitle("跳过\(model.showTime)", for: .normal) view.webURL = model.webURL view.count = model.showTime let win = UIApplication.shared.keyWindow! win.addSubview(view) }catch { self.downloadImage(model: model) } }else { self.downloadImage(model: model) } } } public static func setValue(imgURL: String!, webURL: String, showTime: NSInteger) { if let model = LaunchADModel.getLocalModel() { if model.imgURL == imgURL && model.localPath != nil { return } } let model = LaunchADModel() model.imgURL = imgURL model.webURL = webURL model.showTime = showTime self.downloadImage(model: model) } @objc func countDown() { guard var count = self.count else { return } count -= 1 self.count = count countBtn.setTitle("跳过\(count)", for: .normal) if count == 0 { dismissAction() } } init() { super.init(frame: CGRect(x: 0, y: 0, screenW, height: screenH)) self.backgroundColor = UIColor.white adImgView.frame = self.bounds adImgView.isUserInteractionEnabled = true adImgView.contentMode = .scaleAspectFill adImgView.clipsToBounds = true let tap = UITapGestureRecognizer.init(target: self, action: #selector(tapAction)) adImgView.addGestureRecognizer(tap) self.addSubview(adImgView) let btnW: CGFloat = 60 let btnH: CGFloat = 30 countBtn.frame = CGRect(x: screenW - btnW - 24, y: btnH, btnW, height: btnH) countBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15) countBtn.setTitleColor(.white, for: .normal) countBtn.backgroundColor = UIColor.init(white: 0.2, alpha: 0.6) countBtn.layer.cornerRadius = 4 countBtn.addTarget(self, action: #selector(dismissAction), for: .touchUpInside) self.addSubview(countBtn) } @objc func tapAction() { if let block = touchBlock { block(webURL) dismissAction() } } @objc func dismissAction() { countTimer!.invalidate() UIView.animate(withDuration: 0.3, animations: { self.alpha = 0 }, completion: { (_) in self.removeFromSuperview() }) } required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } static func deleteOldImg(localPath: URL?) { if let path = localPath { do { try FileManager.default.removeItem(at: path) }catch { print(error) } } } static func downloadImage(model: LaunchADModel) { DispatchQueue.global().async { do { guard let url = URL.init(string: model.imgURL) else { return } let data = try Data.init(contentsOf: url) if let image = UIImage.init(data: data) { do { guard let localPath = model.localPath else { return } try image.pngData()?.write(to: localPath) print("保存成功") model.save() }catch { print(error) } } }catch { } } } } class LaunchADModel: NSObject { var imgURL: String! var webURL: String? var showTime = 3 var localPath: URL? { get { if let url = URL.init(string: imgURL) { let imgName = url.lastPathComponent return LaunchADModel.filePath(imgName: imgName) } return nil } } static func getLocalModel() -> LaunchADModel? { if let dic = UserDefaults.standard.value(forKey: "LaunchADModel") as? [String : String] { let model = LaunchADModel() model.imgURL = dic["imgURL"] model.webURL = dic["webURL"] guard let timeString = dic["showTime"], let showTime = NSInteger(timeString) else { return nil } model.showTime = showTime return model } return nil } func save() { let dic = ["imgURL" : imgURL, "webURL" : webURL!, "showTime" : "\(showTime)"] as [String : String] UserDefaults.standard.set(dic, forKey: "LaunchADModel") } static func filePath(imgName: String) -> URL { let cachesPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first! let imgPath = URL.init(fileURLWithPath: cachesPath).appendingPathComponent(imgName) return imgPath } func deleteOldImage() { if let localPath = self.localPath { do { try FileManager.default.removeItem(at: localPath) }catch { } } } }
使用代码:
func showAdView() { LaunchADView.setValue(imgURL: "https://img1.baidu.com/it/u=1606318557,2820010278&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=889", webURL: "https://www.baidu.com", showTime: 10) // 用于显示启动页。若启动数据更新,则将在下次启动后展示新的启动页 LaunchADView.show { (url) in let vc = WebView() vc.url = url self.navigationController?.pushViewController(vc, animated: true) } }
效果截图: