150 lines
5.6 KiB
Swift
150 lines
5.6 KiB
Swift
//
|
||
// CloudDriveDetailSheetViewController.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import SnapKit
|
||
import UIKit
|
||
|
||
/// 云盘文件详情底部表单,用于查看文件信息并修改名称。
|
||
final class CloudDriveDetailSheetViewController: UIViewController {
|
||
private let file: CloudFile
|
||
private let onSave: (String) -> Void
|
||
private let dimView = UIView()
|
||
private let panelView = UIView()
|
||
private let titleLabel = UILabel()
|
||
private let nameTitleLabel = UILabel()
|
||
private let nameField = UITextField()
|
||
private let infoLabel = UILabel()
|
||
private let cancelButton = UIButton(type: .system)
|
||
private let saveButton = UIButton(type: .system)
|
||
|
||
/// 初始化云盘文件详情表单。
|
||
init(file: CloudFile, onSave: @escaping (String) -> Void) {
|
||
self.file = file
|
||
self.onSave = onSave
|
||
super.init(nibName: nil, bundle: nil)
|
||
modalPresentationStyle = .overFullScreen
|
||
modalTransitionStyle = .crossDissolve
|
||
}
|
||
|
||
@available(*, unavailable)
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
setupUI()
|
||
setupConstraints()
|
||
}
|
||
|
||
private func setupUI() {
|
||
view.backgroundColor = .clear
|
||
dimView.backgroundColor = UIColor.black.withAlphaComponent(0.35)
|
||
dimView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(cancelTapped)))
|
||
|
||
panelView.backgroundColor = .white
|
||
panelView.layer.cornerRadius = 18
|
||
panelView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
|
||
panelView.clipsToBounds = true
|
||
|
||
titleLabel.text = "详情"
|
||
titleLabel.font = .app(.bodyMedium)
|
||
titleLabel.textColor = AppColor.textPrimary
|
||
titleLabel.textAlignment = .center
|
||
|
||
nameTitleLabel.text = "文件名称"
|
||
nameTitleLabel.font = .app(.caption)
|
||
nameTitleLabel.textColor = AppColor.textSecondary
|
||
|
||
nameField.text = file.name
|
||
nameField.font = .app(.body)
|
||
nameField.textColor = AppColor.textPrimary
|
||
nameField.clearButtonMode = .whileEditing
|
||
nameField.returnKeyType = .done
|
||
nameField.delegate = self
|
||
nameField.backgroundColor = AppColor.inputBackground
|
||
nameField.layer.cornerRadius = AppRadius.xs
|
||
nameField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: AppSpacing.sm, height: 1))
|
||
nameField.leftViewMode = .always
|
||
|
||
infoLabel.text = "\(file.createdAt) | \(CloudDriveFormatter.fileSize(file.fileSize))\n类型:\(CloudDriveFormatter.typeName(file.type))"
|
||
infoLabel.font = .app(.caption)
|
||
infoLabel.textColor = AppColor.textTertiary
|
||
infoLabel.numberOfLines = 0
|
||
|
||
cancelButton.setTitle("取消", for: .normal)
|
||
cancelButton.setTitleColor(AppColor.textSecondary, for: .normal)
|
||
cancelButton.titleLabel?.font = .app(.body)
|
||
cancelButton.addTarget(self, action: #selector(cancelTapped), for: .touchUpInside)
|
||
|
||
saveButton.setTitle("保存", for: .normal)
|
||
saveButton.setTitleColor(.white, for: .normal)
|
||
saveButton.titleLabel?.font = .app(.bodyMedium)
|
||
saveButton.backgroundColor = AppColor.primary
|
||
saveButton.layer.cornerRadius = AppRadius.xs
|
||
saveButton.addTarget(self, action: #selector(saveTapped), for: .touchUpInside)
|
||
|
||
view.addSubview(dimView)
|
||
view.addSubview(panelView)
|
||
[titleLabel, nameTitleLabel, nameField, infoLabel, cancelButton, saveButton].forEach(panelView.addSubview)
|
||
}
|
||
|
||
private func setupConstraints() {
|
||
dimView.snp.makeConstraints { make in
|
||
make.edges.equalToSuperview()
|
||
}
|
||
panelView.snp.makeConstraints { make in
|
||
make.leading.trailing.bottom.equalToSuperview()
|
||
}
|
||
titleLabel.snp.makeConstraints { make in
|
||
make.top.leading.trailing.equalToSuperview()
|
||
make.height.equalTo(54)
|
||
}
|
||
nameTitleLabel.snp.makeConstraints { make in
|
||
make.top.equalTo(titleLabel.snp.bottom).offset(AppSpacing.sm)
|
||
make.leading.trailing.equalToSuperview().inset(AppSpacing.md)
|
||
}
|
||
nameField.snp.makeConstraints { make in
|
||
make.top.equalTo(nameTitleLabel.snp.bottom).offset(AppSpacing.xs)
|
||
make.leading.trailing.equalTo(nameTitleLabel)
|
||
make.height.equalTo(42)
|
||
}
|
||
infoLabel.snp.makeConstraints { make in
|
||
make.top.equalTo(nameField.snp.bottom).offset(AppSpacing.md)
|
||
make.leading.trailing.equalTo(nameTitleLabel)
|
||
}
|
||
cancelButton.snp.makeConstraints { make in
|
||
make.top.equalTo(infoLabel.snp.bottom).offset(AppSpacing.lg)
|
||
make.leading.equalToSuperview().offset(AppSpacing.md)
|
||
make.height.equalTo(44)
|
||
make.width.equalTo(saveButton)
|
||
make.bottom.equalTo(view.safeAreaLayoutGuide).inset(AppSpacing.md)
|
||
}
|
||
saveButton.snp.makeConstraints { make in
|
||
make.top.bottom.width.equalTo(cancelButton)
|
||
make.leading.equalTo(cancelButton.snp.trailing).offset(AppSpacing.md)
|
||
make.trailing.equalToSuperview().inset(AppSpacing.md)
|
||
}
|
||
}
|
||
|
||
@objc private func cancelTapped() {
|
||
dismiss(animated: true)
|
||
}
|
||
|
||
@objc private func saveTapped() {
|
||
let name = nameField.text ?? ""
|
||
dismiss(animated: true) { [onSave] in
|
||
onSave(name)
|
||
}
|
||
}
|
||
}
|
||
|
||
extension CloudDriveDetailSheetViewController: UITextFieldDelegate {
|
||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||
textField.resignFirstResponder()
|
||
return true
|
||
}
|
||
}
|