当用户从照片库中选择图像时如何显示另一个视图
Posted
技术标签:
【中文标题】当用户从照片库中选择图像时如何显示另一个视图【英文标题】:How to show another view when user selects image from the photo library 【发布时间】:2021-01-09 15:03:18 【问题描述】:我的问题是我无法在另一个视图中显示所选图像,因为我无法将变量 selected
设置为 true。
我的变量:
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
第 1 步 - 我为用户展示 ImagePicker(工作正常):
.sheet(isPresented: self.$isImagePickerDisplay)
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
第 2 步 - 我找不到知道用户何时实际选择图像的正确方法。我试着这样做:
if selectedImage != nil
selected = true
但我得到错误:
类型'()'不能符合'View';只有结构/枚举/类类型可以符合协议
第 3 步 - 如果用户实际从照片库中选择图像,我的计划是显示另一个视图:
.fullScreenCover(isPresented: $selected)
EditView(selectedImage: $selectedImage)
请记住,我是 SwiftUI 的新手。我刚刚完成教程,现在我正在尝试自己开发一个项目。
编辑(添加了我的整个 ContentView()):
struct ContentView: View
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
var body: some View
Button(action:
self.isImagePickerDisplay.toggle()
)
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
.sheet(isPresented: self.$isImagePickerDisplay)
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
if selectedImage != nil
selected = true
.fullScreenCover(isPresented: $selected)
EditView(selectedImage: $selectedImage)
【问题讨论】:
不清楚在哪里叫什么,请提供完整的正文,或者更好的整体视图。 @Asperi 哦,对不起。为问题添加了整个视图。 在此之前从未听说过ImagePickerView
。一年半前我包装了一个UIImagePickerController
,虽然它起作用了,但我当时决定不使用SwiftUI
(现在仍然不会)。在网上搜索后,我看到这个图像选择器是第三方的。有没有可能是问题所在?
@did 你好! @Asperi 解决了这个问题。实际上,这个第 3 方 ImagePickerView 非常适合我。
【参考方案1】:
也许你想要这个
struct DFContentView: View
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
var body: some View
VStack
Button(action:
self.isImagePickerDisplay.toggle()
)
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
.sheet(isPresented: self.$isImagePickerDisplay, onDismiss: // << here !!
self.selected = selectedImage != nil
)
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
EmptyView()
.fullScreenCover(isPresented: $selected)
EditView(selectedImage: $selectedImage)
更新:感谢@RajaKishan,关于 ios 14.2 - 更新了分开的 .sheet
和 .fullScreenCover
到不同的视图。经过测试和工作。
【讨论】:
fullScreenCover 和 sheet 不能与 XCode 12.2、iOS14.1 一起使用 两种解决方案——你的和@RajaKishan 都适合我,但我更喜欢这个解决方案,因为它更容易理解。所以我会接受这个答案。但我有一个问题 - 你认为使用 EmptyView() 是一种好习惯吗?【参考方案2】:可能的解决方案
struct ContentView: View
private enum SheetType
case pickImage, showImage
@State private var selectedImage: UIImage?
@State private var selected: Bool = false
@State private var currentSheetType: SheetType = .pickImage
var body: some View
Button(action:
self.selected.toggle()
self.currentSheetType = .pickImage
)
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
.sheet(isPresented: self.$selected)
if currentSheetType == .pickImage
if selectedImage != nil
self.selected.toggle()
self.currentSheetType = .showImage
content:
if currentSheetType == .pickImage
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
else if currentSheetType == .showImage
EditView(selectedImage: $selectedImage)
【讨论】:
以上是关于当用户从照片库中选择图像时如何显示另一个视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CollectionView 中显示从照片库或相机中选择的图像?画廊视图
如何在用户配置文件视图控制器上显示从火存储到 UIImageView 的图像?