IOS-swift5-自己设计的一个类似安卓Android的TOAST的信息显示提示功能

自己设计的苹果ios的一个类似安卓的TOAST的信息显示提示功能,基于swift5开发。可以指定 显示时长。单位 秒,可以是小数,比如2.5秒。

//
//  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: