最近在用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()
}
}
}

6086

被折叠的 条评论
为什么被折叠?



