swift纯代码提示框,AlertText(msg: “ 请输入手机号 “)即可使用

最近在用swift写新项目,学习记录一下。

可设置消失间隔时间           AlertText(msg:  " 请输入手机号 ", after: 5)

默认两秒后消失                   AlertText(msg: " 请输入手机号 ")

下面是所有代码,使用SnapKit布局,多行文本自动换行,粘贴即可使用
 

import UIKit

import SnapKit

class AlertText: UIView {

    // UI 元素: 提示信息的标签

    private var messageLabel: UILabel!

    // 用于遮罩的背景视图,点击事件不会透过遮罩背景

    private var overlayView: UIView!

    

    // 自动消失的任务

    private var autoDismissWorkItem: DispatchWorkItem?

    // 静态变量用于控制是否已有弹框在显示

    static var isShowing = false

    // 初始化方法,传入提示信息并立即显示

    @discardableResult

    init(msg: String, after seconds: TimeInterval = 2.0) {

        super.init(frame: .zero)

        

        // 切换到主线程确保UI操作安全

        DispatchQueue.main.async {

            self.setupUI(msg: msg)

            

            // 限制最大显示时间为 10 秒,避免过长显示

            let limitedSeconds = min(seconds, 10.0)

            

            // 确保只显示一个弹框

            if AlertText.isShowing {

                return

            }

            AlertText.isShowing = true

            

            // 获取主窗口并显示弹框

            if let windowScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene,

               let window = windowScene.windows.first(where: { $0.isKeyWindow }) {

                self.show(over: window, after: limitedSeconds)

            }

        }

    }

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    // 设置UI界面

    private func setupUI(msg: String) {

        // 修正背景颜色设置

        backgroundColor = UIColor.black.withAlphaComponent(0.7) // alpha值需介于 0 到 1 之间

        layer.cornerRadius = 10

        // 创建并添加消息Label

        messageLabel = UILabel()

        messageLabel.text = msg

        messageLabel.textColor = UIColor.white  // 确保颜色值在正确范围内

        messageLabel.textAlignment = .center

        messageLabel.numberOfLines = 0 // 允许多行显示

        addSubview(messageLabel)

        // 使用SnapKit布局消息Label

        messageLabel.snp.makeConstraints { make in

            make.edges.equalToSuperview().inset(16)

        }

        

        // 设置提示框最大宽度,防止超出屏幕

        self.snp.makeConstraints { make in

            make.width.lessThanOrEqualTo(280) // 最大宽度为280

        }

    }

    // 显示提示框,传入 window 来展示在当前窗口

    func show(over window: UIWindow, after seconds: TimeInterval) {

        // 创建遮罩背景,防止事件透过背景

        self.overlayView = UIView(frame: window.bounds)

        self.overlayView.backgroundColor = UIColor.clear

        window.addSubview(self.overlayView)

        // 将自定义提示框添加到窗口,确保其显示在最前面

        window.addSubview(self)

        // 使用SnapKit居中布局

        self.snp.makeConstraints { make in

            make.center.equalToSuperview()

        }

        // 创建自动消失的任务

        self.autoDismissWorkItem = DispatchWorkItem { [weak self] in

            self?.dismiss()

        }

        // 在指定时间后执行自动消失任务

        if let workItem = self.autoDismissWorkItem {

            DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: workItem)

        }

    }

    // 隐藏提示框并清除状态

    @objc func dismiss() {

        // 取消未完成的自动消失任务

        autoDismissWorkItem?.cancel()

        autoDismissWorkItem = nil

        

        // 恢复状态,允许再次显示弹框

        AlertText.isShowing = false

        // 移除提示框和遮罩背景

        DispatchQueue.main.async {

            self.overlayView?.removeFromSuperview()

            self.removeFromSuperview()

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值