// // KMCompressSettingViewController.swift // PDF Reader Pro // // Created by lizhe on 2024/11/15. // import Cocoa typealias KMCompressSettingViewControllerCancelAction = (_ controller: KMCompressSettingViewController ) -> Void typealias KMCompressSettingViewControllerDoneAction = (_ controller: KMCompressSettingViewController ) -> Void class KMCompressSettingViewController: KMBaseViewController { @IBOutlet weak var doneButton: KMButton! @IBOutlet weak var cancelButton: KMButton! @IBOutlet weak var settingView: KMCompressSettingTableView! private var toastViews: [NSView] = [] // 用于管理多个 alertView var cancelAction: KMCompressSettingViewControllerCancelAction? var doneAction: KMCompressSettingViewControllerDoneAction? var model: KMCompressSettingModel = KMCompressSettingModel(modelsType: .standard) { didSet { self.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. // 将按钮设置为第一响应者 // if let window = view.window { // // window.makeFirstResponder(doneButton.nextResponder) // window.defaultButtonCell = doneButton.cell as? NSButtonCell // // window.contentMinSize = CGSizeMake(624, 513) // window.contentMaxSize = CGSizeMake(624, 513) // } // self.showAlert("Unembed any font may result in incomplete display of text") // // // 自动移除视图 // DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // self.showAlert("Less than 7 items selected; compression quality may be affected") // } } func reloadData() { self.settingView.model = model } func showAlert(_ string: String) { // 创建 alertView let alertView = KMBatchOperateCompressSettingAlertView() alertView.titleString = string alertView.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(alertView) // 添加到管理数组 toastViews.append(alertView) // 设置约束 let centerYOffset = CGFloat((46 + 12) * (toastViews.count - 1) + 68) // 每个 Toast 间隔 30px NSLayoutConstraint.activate([ alertView.widthAnchor.constraint(lessThanOrEqualTo: self.view.widthAnchor, multiplier: 0.8), alertView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), alertView.centerYAnchor.constraint(equalTo: self.view.topAnchor, constant: centerYOffset), ]) // 自动移除视图 DispatchQueue.main.asyncAfter(deadline: .now() + 3) { self.removeAlert(alertView) } } private func removeAlert(_ alertView: NSView) { // 淡出动画 NSAnimationContext.runAnimationGroup({ context in context.duration = 0.3 alertView.animator().alphaValue = 0 }, completionHandler: { // 从视图和数组中移除 alertView.removeFromSuperview() if let index = self.toastViews.firstIndex(of: alertView) { self.toastViews.remove(at: index) } // 重新布局其他 Toast self.rearrangeToasts() }) } private func rearrangeToasts() { for (index, toastView) in toastViews.enumerated() { let newYOffset = CGFloat(-46 * index) if let constraint = toastView.constraints.first(where: { $0.firstAttribute == .centerY }) { constraint.constant = newYOffset } } } } extension KMCompressSettingViewController { @IBAction func cancelButtonAction(_ sender: Any) { guard let callBack = cancelAction else { return } callBack(self) } @IBAction func doneButtonAction(_ sender: Any) { guard let callBack = doneAction else { return } callBack(self) } }