jsdw_ios/QuickLocation/Section/AppRestrict/AppRestrictShieldSettingsVC...

148 lines
5.5 KiB
Swift

//
// AppRestrictShieldSettingsVC.swift
// QuickLocation
//
import PhotosUI
import UIKit
@available(iOS 16.0, *)
final class AppRestrictShieldSettingsVC: BaseViewController {
override var isNavigationBarHidden: Bool { false }
private let titleField = UITextField()
private let subtitleField = UITextField()
private let buttonField = UITextField()
private let preview = UIImageView()
private var config = AppRestrictManager.shared.shieldConfig
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(hexStr: "#FAFAFA")
title = "锁定界面设置"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "保存", style: .done, target: self, action: #selector(save))
let stack = UIStackView()
stack.axis = .vertical
stack.spacing = 12
view.addSubview(stack)
stack.layoutChain.top(kNaviHeight + 20).left(16).right(16)
func makeField(_ placeholder: String, text: String) -> UITextField {
let f = UITextField()
f.placeholder = placeholder
f.text = text
f.borderStyle = .roundedRect
f.font = .systemFont(ofSize: 15)
f.backgroundColor = .white
return f
}
titleField.text = config.title
subtitleField.text = config.subtitle
buttonField.text = config.primaryButtonLabel
[titleField, subtitleField, buttonField].forEach {
$0.borderStyle = .roundedRect
$0.font = .systemFont(ofSize: 15)
$0.backgroundColor = .white
stack.addArrangedSubview($0)
$0.layoutChain.height(44)
}
titleField.placeholder = "标题"
subtitleField.placeholder = "副标题"
buttonField.placeholder = "按钮文案"
let presetLab = UILabel()
presetLab.text = "预设图集"
presetLab.font = .systemFont(ofSize: 14, weight: .bold)
stack.addArrangedSubview(presetLab)
let presetRow = UIStackView()
presetRow.axis = .horizontal
presetRow.spacing = 10
presetRow.distribution = .fillEqually
[("默认", AppRestrictShieldConfig.ImageSource.presetDefault),
("专注", .presetFocus),
("平静", .presetCalm)].forEach { title, source in
let btn = UIButton(type: .system)
btn.setTitle(title, for: .normal)
btn.backgroundColor = .white
btn.layer.cornerRadius = 8
btn.tag = source.hashValue
btn.addAction(UIAction { [weak self] _ in
self?.config.imageSource = source
self?.refreshPreview()
}, for: .touchUpInside)
presetRow.addArrangedSubview(btn)
btn.layoutChain.height(40)
}
stack.addArrangedSubview(presetRow)
let albumBtn = UIButton(type: .system)
albumBtn.setTitle("从相册选择", for: .normal)
albumBtn.backgroundColor = UIColor(hexStr: "#16B3FF")
albumBtn.setTitleColor(.white, for: .normal)
albumBtn.layer.cornerRadius = 10
albumBtn.addTarget(self, action: #selector(pickAlbum), for: .touchUpInside)
stack.addArrangedSubview(albumBtn)
albumBtn.layoutChain.height(44)
preview.contentMode = .scaleAspectFit
preview.backgroundColor = .white
preview.layer.cornerRadius = 12
preview.clipsToBounds = true
stack.addArrangedSubview(preview)
preview.layoutChain.height(180)
refreshPreview()
}
private func refreshPreview() {
preview.image = AppRestrictSharedStore.loadShieldImage()
}
@objc private func save() {
config.title = titleField.text?.trimmingCharacters(in: .whitespacesAndNewlines).nilIfEmpty ?? AppRestrictShieldConfig.default.title
config.subtitle = subtitleField.text?.trimmingCharacters(in: .whitespacesAndNewlines).nilIfEmpty ?? AppRestrictShieldConfig.default.subtitle
config.primaryButtonLabel = buttonField.text?.trimmingCharacters(in: .whitespacesAndNewlines).nilIfEmpty ?? AppRestrictShieldConfig.default.primaryButtonLabel
AppRestrictManager.shared.shieldConfig = config
DLToast.showSuccess(text: "已保存")
navigationController?.popViewController(animated: true)
}
@objc private func pickAlbum() {
var conf = PHPickerConfiguration(photoLibrary: .shared())
conf.filter = .images
conf.selectionLimit = 1
let picker = PHPickerViewController(configuration: conf)
picker.delegate = self
present(picker, animated: true)
}
}
@available(iOS 16.0, *)
extension AppRestrictShieldSettingsVC: PHPickerViewControllerDelegate {
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
guard let provider = results.first?.itemProvider,
provider.canLoadObject(ofClass: UIImage.self) else { return }
provider.loadObject(ofClass: UIImage.self) { [weak self] object, _ in
guard let image = object as? UIImage else { return }
DispatchQueue.main.async {
guard let self else { return }
if AppRestrictManager.shared.saveCustomShieldImage(image) {
self.config.imageSource = .album
self.refreshPreview()
} else {
DLToast.show(text: "图片保存失败")
}
}
}
}
}
private extension String {
var nilIfEmpty: String? { isEmpty ? nil : self }
}