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