// // Tools.swift // Mark // // Created by nelson on 2022/12/14. // import Foundation import UIKit // 自己整的一个工具类 class Tools { static func toast(msg:String,seconds:Double,vc:UIViewController){ //得到当前 UIViewController 的 安全显示区域 let insets:UIEdgeInsets = vc.view.safeAreaInsets //开始测量当前内容要显示的 大小,宽度 不超过 最大宽度 //不要紧贴着底部,留一个marging->to->bottom let marginBottom:CGFloat = 50 let width = UIScreen.getScreenWidth() - insets.left - insets.right let height = UIScreen.getScreenHeight() - insets.top - insets.bottom - marginBottom let font:UIFont = UIFont.preferredFont(forTextStyle: .body) let dict = [NSAttributedString.Key.font : font] let msgRectTemp = (msg as NSString).boundingRect(with: CGSize(width: width , height: height), options: [.usesFontLeading,.usesLineFragmentOrigin], attributes: dict as [NSAttributedString.Key : Any], context: nil) //因为有insets,所以需要人为扩大 rect let msgRect = CGRect(x: 0, y: 0, width: Int(ceil(msgRectTemp.width)) + Int(MyLabelToast.insetHor * 2), height: Int(ceil(msgRectTemp.height)) + Int(MyLabelToast.insetVer * 2)) let y = Int(UIScreen.getScreenHeight() - insets.bottom - msgRect.height - marginBottom) let x = insets.left + (CGFloat(width) - msgRect.width ) / 2 var label:UILabel? let frame = CGRect(x: Int(x), y: y, width: Int(ceil(msgRect.width)) , height: Int(msgRect.height)) label = vc.view.window?.windowScene?.windows.last?.viewWithTag(999) as? UILabel if(label == nil){ //新建立 label = MyLabelToast(frame: frame) label!.layer.masksToBounds = true // 不加这句 圆角会无效 label!.layer.cornerRadius = 5 label!.backgroundColor = UIColor.black.withAlphaComponent(0.5) label!.textColor = UIColor.white label!.font = font // label!.tag = 999 } else{ //不用新建立 //label!.frame = frame } // label!.text = msg vc.view.window?.windowScene?.windows.last?.addSubview(label!) //下边的方法不可以!在pad上 ,不是全屏的vc时,会显示不正常 //vc.view.addSubview(label!) //定时器 let timer = Timer.scheduledTimer(withTimeInterval: seconds, repeats: false) { Timer in if(label != nil){ label!.removeFromSuperview() } } return } }
extension UIScreen{ static func getScreenWidth()->CGFloat{ return UIScreen.main.bounds.size.width } static func getScreenHeight()->CGFloat{ return UIScreen.main.bounds.size.height } static func getScreenSize()->CGSize{ return UIScreen.main.bounds.size } }
用来呈现文字的label
// // MyLabelToast.swift // Mark // // Created by nelson on 2023/3/21. // /* 主要就是为了增加 toast 中 label的 padding */ import UIKit class MyLabelToast: UILabel { static let insetHor:CGFloat = 20 static let insetVer:CGFloat = 10 // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func draw(_ rect: CGRect) { // Drawing code let insets = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20) super.drawText(in: rect.inset(by: insets)) // super.draw(rect) } override init(frame: CGRect) { super.init(frame: frame) self.numberOfLines = 0 } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
用法如下:
Tools.toast(msg: "青春部落!GREAT!www.youthtribe.com!", seconds: 3, vc: self)
效果如下,类似android的toast:
]]>