jsdw_ios/QuickLocation/Section/Mine/MyProfile/AvatarIconListVC.swift

117 lines
3.3 KiB
Swift

//
// AvatarIconListVC.swift
// QuickLocation
//
// Created by on 2026/6/11.
//
import UIKit
import RxSwift
import RxCocoa
class AvatarIconListVC: BaseViewController {
fileprivate var rootView: AvatarIconListView!
override func loadView() {
rootView = AvatarIconListView(frame: UIScreen.main.bounds)
view = rootView
}
private var iconIndex: String
var onSelectIcon: ((String) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
rootView.configure(headPic: iconIndex)
rootView.saveBtn.isHidden = true
rootView.saveBtn.rx.tap.subscribe(onNext: { [weak self] _ in
guard let self else { return }
let selected = self.rootView.selectedHeadPic
guard !selected.isEmpty else { return }
self.onSelectIcon?(selected)
}).disposed(by: disposeBag)
rootView.onBadgeTap = { [weak self] in
self?.showUploadPicker()
}
rootView.onIconSelected = { [weak self] in
self?.rootView.saveBtn.isHidden = false
}
}
private func showUploadPicker() {
PigeonUploadPopView.show(
onAlbum: { [weak self] in
self?.openAlbumPicker()
},
onCamera: { [weak self] in
self?.openCamera()
}
)
}
private func openAlbumPicker() {
let picker = PhotoPickerVC(maxCount: 1)
picker.onConfirm = { [weak self] images in
guard let image = images.first else { return }
self?.presentCrop(for: image)
}
present(picker, animated: true)
}
private func openCamera() {
guard UIImagePickerController.isSourceTypeAvailable(.camera) else {
DLToast.showError(text: "当前设备不支持拍照")
return
}
let vc = CameraCaptureVC(mode: .photo)
vc.onPhoto = { [weak self] image in
self?.dismiss(animated: true) {
self?.presentCrop(for: image)
}
}
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)
}
private func presentCrop(for image: UIImage) {
let crop = ImageCropVC(image: image)
crop.onConfirm = { [weak self] cropped in
self?.uploadAndChangeAvatar(cropped)
}
present(crop, animated: true)
}
private func uploadAndChangeAvatar(_ image: UIImage) {
guard let jpeg = image.jpegData(compressionQuality: 0.8) else {
DLToast.show(text: "图片处理失败")
return
}
DLToast.showLoading()
UploadService.uploadURL(jpeg, kind: .jpeg, scene: "avatar")
.subscribe(onNext: { [weak self] url in
guard let self else { return }
self.rootView.setPreviewImage(image)
self.rootView.saveBtn.isHidden = true
self.onSelectIcon?(url)
}, onError: { error in
DLToast.show(error, fallbackText: "更换失败")
})
.disposed(by: disposeBag)
}
// MARK: - Init
init(iconIndex: String) {
self.iconIndex = iconIndex
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}