feat: 优化AppSettingView和ImagePicker组件以增强图片选择体验
- 在AppSettingView中添加详细的日志记录,便于调试和用户反馈。 - 改进图片加载逻辑,确保在加载失败时提供用户友好的错误提示。 - 在ImagePickerWithPreview组件中使用主线程更新UI,提升响应速度。 - 更新错误弹窗逻辑,确保在用户确认后关闭所有相关弹窗,优化用户体验。
This commit is contained in:
@@ -53,9 +53,20 @@ struct AppSettingView: View {
|
||||
)
|
||||
.sheet(isPresented: $showCamera) {
|
||||
CameraPicker { image in
|
||||
print("[LOG] CameraPicker回调,image: \(image != nil)")
|
||||
if let image = image {
|
||||
selectedImages = [image]
|
||||
showPreview = true
|
||||
print("[LOG] CameraPicker获得图片,直接上传头像")
|
||||
if let data = image.jpegData(compressionQuality: 0.8) {
|
||||
viewStore.send(AppSettingFeature.Action.avatarSelected(data))
|
||||
}
|
||||
} else {
|
||||
errorMessage = "拍照失败,请重试"
|
||||
// 强制关闭所有弹窗
|
||||
showPreview = false
|
||||
showCamera = false
|
||||
showPhotoPicker = false
|
||||
showActionSheet = false
|
||||
print("[LOG] CameraPicker无图片,弹出错误提示")
|
||||
}
|
||||
showCamera = false
|
||||
}
|
||||
@@ -65,17 +76,20 @@ struct AppSettingView: View {
|
||||
images: selectedImages,
|
||||
currentIndex: .constant(0),
|
||||
onConfirm: {
|
||||
print("[LOG] 预览确认,准备上传头像")
|
||||
if let image = selectedImages.first, let data = image.jpegData(compressionQuality: 0.8) {
|
||||
viewStore.send(AppSettingFeature.Action.avatarSelected(data))
|
||||
}
|
||||
showPreview = false
|
||||
},
|
||||
onCancel: {
|
||||
print("[LOG] 预览取消")
|
||||
showPreview = false
|
||||
}
|
||||
)
|
||||
}
|
||||
.onChange(of: selectedPhotoItems) { items in
|
||||
print("[LOG] PhotosPicker选中items: \(items.count)")
|
||||
guard !items.isEmpty else { return }
|
||||
isLoading = true
|
||||
selectedImages = []
|
||||
@@ -86,16 +100,32 @@ struct AppSettingView: View {
|
||||
item.loadTransferable(type: Data.self) { result in
|
||||
defer { group.leave() }
|
||||
if let data = try? result.get(), let uiImage = UIImage(data: data) {
|
||||
tempImages.append(uiImage)
|
||||
DispatchQueue.main.async {
|
||||
tempImages.append(uiImage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DispatchQueue.global().async {
|
||||
group.wait()
|
||||
DispatchQueue.main.async {
|
||||
selectedImages = tempImages
|
||||
isLoading = false
|
||||
showPreview = !tempImages.isEmpty
|
||||
if tempImages.isEmpty {
|
||||
errorMessage = "图片加载失败,请重试"
|
||||
// 强制关闭所有弹窗
|
||||
showPreview = false
|
||||
showCamera = false
|
||||
showPhotoPicker = false
|
||||
showActionSheet = false
|
||||
print("[LOG] PhotosPicker图片加载失败,弹出错误提示")
|
||||
} else {
|
||||
selectedImages = tempImages
|
||||
print("[LOG] PhotosPicker获得图片,准备延迟进入预览,图片数量: \(tempImages.count)")
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
||||
showPreview = true
|
||||
print("[LOG] PhotosPicker延迟后进入预览")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,7 +133,14 @@ struct AppSettingView: View {
|
||||
get: { errorMessage != nil },
|
||||
set: { if !$0 { errorMessage = nil } }
|
||||
)) {
|
||||
Alert(title: Text("错误"), message: Text(errorMessage ?? ""), dismissButton: .default(Text("确定")))
|
||||
print("[LOG] 错误弹窗弹出: \(errorMessage ?? "")")
|
||||
return Alert(title: Text("错误"), message: Text(errorMessage ?? ""), dismissButton: .default(Text("确定"), action: {
|
||||
// 强制关闭所有弹窗,放到action中,避免在视图更新周期set状态
|
||||
showPreview = false
|
||||
showCamera = false
|
||||
showPhotoPicker = false
|
||||
showActionSheet = false
|
||||
}))
|
||||
}
|
||||
.navigationBarHidden(true)
|
||||
.alert("修改昵称", isPresented: $showNicknameAlert) {
|
||||
|
@@ -114,7 +114,9 @@ private struct PhotosPickerModifier: ViewModifier {
|
||||
item.loadTransferable(type: Data.self) { result in
|
||||
defer { group.leave() }
|
||||
if let data = try? result.get(), let uiImage = UIImage(data: data) {
|
||||
tempImages.append(uiImage)
|
||||
DispatchQueue.main.async {
|
||||
tempImages.append(uiImage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -53,4 +53,4 @@ public struct ImagePreviewView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user