ios 在SwiftUI iMessage扩展中,是否有一种方法可以嵌入照片选择器而不是模态?

drkbr07n  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(99)

我正在构建一个快速的iMessage扩展,用户可以从他们的相机胶卷中挑选图像。我想在折叠的消息视图中显示他们的相机胶卷,这样用户就可以选择他们的照片,而无需将iMessage扩展到全屏。
通常我会使用PhotosPickerPhotosUI,但这会打开一个bottomsheet模式,在小空间中看起来很糟糕。


的数据
如何在没有模态演示的情况下直接嵌入相机胶卷?是否有第三方库在swiftUI视图中具有照片选取器?

fkaflof6

fkaflof61#

根据latest WWDC for the PhotoPicker,你可以read the transcript here,iOS 17即将推出自定义和嵌入内联照片选择器的功能。不幸的是,对我和我的问题来说,这要到2023年9月才能公开。所以现在,你可以这样做,将选择器直接嵌入到视图控制器中:

// Create a PHPickerConfiguration
    var configuration = PHPickerConfiguration(photoLibrary: .shared())
    configuration.selectionLimit = 4 // Set the selection limit to 4 images
    configuration.filter = .images // Set the filter to images only
    
    // Create a PHPickerViewController with the configuration
    let picker = PHPickerViewController(configuration: configuration)
    picker.delegate = self // Set the delegate to self
    
    // Add the picker as a child view controller
    addChild(picker)
    
    // Set the frame of the picker, or use Auto Layout constraints
    picker.view.frame = view.bounds
    
    // Add the picker’s view as a subview
    view.addSubview(picker.view)
    
    // Notify the picker that it has been added
    picker.didMove(toParent: self)

字符串
然而,这在iMessage扩展中看起来仍然很糟糕,因为你不能关闭额外的UI,所以它在半张表中非常拥挤。
另一种选择是要求相机滚动权限并制作自己的选择器。这里的缺点是,如果用户不允许权限,或者选择了某些照片,你就不走运了,而且很难让他们找到在哪里重新打开权限。此外,您现在还需要进行所有的图像管理。下面是我写的一个片段,用于从相机胶卷中获取前20张图像:

func loadImages() {
    PHPhotoLibrary.requestAuthorization({ (status) -> Void in
      switch status {
      case .authorized:
        break
      default:
        // We didn't get access
        return
      }
    })
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchOptions.fetchLimit = 20
    
    let result = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    result.enumerateObjects { (asset, _, _) in
      let manager = PHImageManager.default()
      let option = PHImageRequestOptions()
      option.isSynchronous = true
      manager.requestImage(for: asset,
                           targetSize: CGSize(width: 300, height: 300),
                           contentMode: .aspectFit,
                           options: option,
                           resultHandler: { (image, _) in
        if let image = image {
          self.images.append(image)
        }
      })
    }
  }


最后,我想到的解决方案是削减范围,只需一个按钮将iMessage扩展到整个工作表,然后用户可以使用系统选择器全屏选择图像。这是一个令人沮丧的,但我可以重新审视这个答案一旦iOS 17下降。

相关问题