// // KMBatchOperateCompressSettingViewController.swift // PDF Reader Pro // // Created by lizhe on 2024/11/15. // import Cocoa typealias KMBatchOperateCompressSettingViewCancelAction = (_ controller: KMBatchOperateCompressSettingViewController ) -> Void typealias KMBatchOperateCompressSettingViewDoneAction = (_ controller: KMBatchOperateCompressSettingViewController ) -> Void class KMBatchOperateCompressSettingViewController: KMBaseViewController { @IBOutlet weak var doneButton: KMButton! @IBOutlet weak var cancelButton: KMButton! @IBOutlet weak var settingView: KMCompressSettingTableView! private var toastViews: [NSView] = [] // 用于管理多个 alertView var cancelAction: KMBatchOperateCompressSettingViewCancelAction? var doneAction: KMBatchOperateCompressSettingViewDoneAction? 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 KMBatchOperateCompressSettingViewController { @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) } }