对齐 Android 无权限强制弹窗、角色下拉与申请页交互,补充 UIButton configuration 适配,并增强景区排队 TTS 与相关单元测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
119 lines
4.0 KiB
Swift
119 lines
4.0 KiB
Swift
//
|
|
// PermissionRequiredDialogViewController.swift
|
|
// suixinkan
|
|
//
|
|
|
|
import SnapKit
|
|
import UIKit
|
|
|
|
/// 首页无业务权限时展示的 Android 风格强制提示弹窗。
|
|
@MainActor
|
|
final class PermissionRequiredDialogViewController: UIViewController {
|
|
|
|
private let onExitApp: () -> Void
|
|
private let onGoToApply: () -> Void
|
|
private let dimView = UIView()
|
|
private let cardView = UIView()
|
|
|
|
/// 创建不可点击遮罩关闭的权限提示弹窗。
|
|
init(onExitApp: @escaping () -> Void, onGoToApply: @escaping () -> Void) {
|
|
self.onExitApp = onExitApp
|
|
self.onGoToApply = onGoToApply
|
|
super.init(nibName: nil, bundle: nil)
|
|
modalPresentationStyle = .overFullScreen
|
|
modalTransitionStyle = .crossDissolve
|
|
isModalInPresentation = true
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
view.backgroundColor = .clear
|
|
dimView.backgroundColor = UIColor.black.withAlphaComponent(0.32)
|
|
cardView.backgroundColor = .white
|
|
cardView.layer.cornerRadius = 16
|
|
|
|
let titleLabel = UILabel()
|
|
titleLabel.text = "提示"
|
|
titleLabel.font = .systemFont(ofSize: 18, weight: .bold)
|
|
titleLabel.textColor = UIColor(hex: 0x333333)
|
|
titleLabel.textAlignment = .center
|
|
|
|
let messageLabel = UILabel()
|
|
messageLabel.text = "您还没有权限,请先申请权限"
|
|
messageLabel.font = .systemFont(ofSize: 16)
|
|
messageLabel.textColor = UIColor(hex: 0x4B5563)
|
|
messageLabel.textAlignment = .center
|
|
messageLabel.numberOfLines = 0
|
|
|
|
let exitButton = makeButton(
|
|
title: "退出app",
|
|
titleColor: UIColor(hex: 0x333333),
|
|
backgroundColor: .white,
|
|
borderColor: UIColor(hex: 0xE5E5E5)
|
|
)
|
|
exitButton.addTarget(self, action: #selector(exitTapped), for: .touchUpInside)
|
|
|
|
let applyButton = makeButton(
|
|
title: "去申请",
|
|
titleColor: .white,
|
|
backgroundColor: AppColor.primary,
|
|
borderColor: nil
|
|
)
|
|
applyButton.addTarget(self, action: #selector(applyTapped), for: .touchUpInside)
|
|
|
|
let buttons = UIStackView(arrangedSubviews: [exitButton, applyButton])
|
|
buttons.axis = .horizontal
|
|
buttons.spacing = 12
|
|
buttons.distribution = .fillEqually
|
|
|
|
let stack = UIStackView(arrangedSubviews: [titleLabel, messageLabel, buttons])
|
|
stack.axis = .vertical
|
|
stack.alignment = .fill
|
|
stack.spacing = 16
|
|
stack.setCustomSpacing(24, after: messageLabel)
|
|
|
|
view.addSubview(dimView)
|
|
view.addSubview(cardView)
|
|
cardView.addSubview(stack)
|
|
|
|
dimView.snp.makeConstraints { make in make.edges.equalToSuperview() }
|
|
cardView.snp.makeConstraints { make in
|
|
make.center.equalToSuperview()
|
|
make.leading.trailing.equalToSuperview().inset(32)
|
|
}
|
|
stack.snp.makeConstraints { make in make.edges.equalToSuperview().inset(24) }
|
|
buttons.snp.makeConstraints { make in make.height.equalTo(44) }
|
|
}
|
|
|
|
private func makeButton(
|
|
title: String,
|
|
titleColor: UIColor,
|
|
backgroundColor: UIColor,
|
|
borderColor: UIColor?
|
|
) -> UIButton {
|
|
let button = UIButton(type: .system)
|
|
button.setTitle(title, for: .normal)
|
|
button.setTitleColor(titleColor, for: .normal)
|
|
button.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium)
|
|
button.backgroundColor = backgroundColor
|
|
button.layer.cornerRadius = 8
|
|
button.layer.borderWidth = borderColor == nil ? 0 : 1
|
|
button.layer.borderColor = borderColor?.cgColor
|
|
button.accessibilityLabel = title
|
|
return button
|
|
}
|
|
|
|
@objc private func exitTapped() {
|
|
onExitApp()
|
|
}
|
|
|
|
@objc private func applyTapped() {
|
|
dismiss(animated: true) { [onGoToApply] in onGoToApply() }
|
|
}
|
|
}
|