首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从SwiftUI调用PHPhotoLibrary presentLimitedLibraryPicker?

基础概念

PHPhotoLibrary 是 iOS 平台上的一个框架,用于访问和管理用户的照片库。presentLimitedLibraryPickerPHPhotoLibrary 中的一个方法,用于以受限模式展示照片库选择器。受限模式意味着用户只能选择特定的照片或视频,而不是整个照片库。

SwiftUI 是苹果推出的一个声明式 UI 框架,用于构建 iOS、macOS、watchOS 和 tvOS 应用程序的用户界面。

相关优势

  1. 权限管理:通过 PHPhotoLibrary,开发者可以请求用户授权访问照片库,确保应用在合法范围内使用用户的照片。
  2. 用户体验presentLimitedLibraryPicker 提供了一种受限的、更友好的方式让用户选择照片,避免了用户在选择大量照片时的困扰。
  3. 集成便捷:SwiftUI 的声明式 UI 设计使得与 PHPhotoLibrary 的集成更加直观和简洁。

类型与应用场景

presentLimitedLibraryPicker 主要用于以下场景:

  • 图片和视频选择器
  • 社交分享功能
  • 相册管理应用

如何从 SwiftUI 调用 presentLimitedLibraryPicker

在 SwiftUI 中调用 presentLimitedLibraryPicker 需要通过 UIViewControllerRepresentable 协议将 UIKit 的视图控制器嵌入到 SwiftUI 视图中。以下是一个示例代码:

代码语言:txt
复制
import SwiftUI
import PhotosUI

struct PhotoPicker: UIViewControllerRepresentable {
    @Environment(\.presentationMode) var presentationMode
    @Binding var selectedAssets: [PHAsset]

    func makeUIViewController(context: Context) -> PHPickerViewController {
        var configuration = PHPickerConfiguration()
        configuration.filter = [.images, .videos]
        configuration.selectionLimit = 10 // 设置选择限制

        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {}

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: PHPickerViewControllerDelegate {
        var parent: PhotoPicker

        init(_ parent: PhotoPicker) {
            self.parent = parent
        }

        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            picker.dismiss(animated: true)
            parent.selectedAssets = results.map { $0.asset }
            parent.presentationMode.wrappedValue.dismiss()
        }
    }
}

struct ContentView: View {
    @State private var selectedAssets = [PHAsset]()

    var body: some View {
        VStack {
            Button("Select Photos") {
                let picker = PhotoPicker(presentationMode: .wrappedValue, selectedAssets: $selectedAssets)
                UIApplication.shared.windows.first?.rootViewController?.present(picker, animated: true)
            }
            List(selectedAssets, id: \.localIdentifier) { asset in
                Text(asset.localIdentifier ?? "")
            }
        }
    }
}

参考链接

常见问题及解决方法

  1. 权限问题:如果用户未授权访问照片库,应用将无法调用 presentLimitedLibraryPicker。解决方法是在调用前检查并请求权限。
代码语言:txt
复制
PHPhotoLibrary.requestAuthorization { status in
    switch status {
    case .authorized:
        // 用户已授权,可以进行照片选择操作
    case .denied, .restricted, .notDetermined:
        // 处理未授权的情况
    @unknown default:
        fatalError()
    }
}
  1. 选择限制问题:如果用户选择的照片数量超过 configuration.selectionLimit 设置的限制,选择器将不会关闭。确保设置合理的限制并处理超出限制的情况。

通过以上步骤,你可以在 SwiftUI 中成功调用 presentLimitedLibraryPicker 并处理相关问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS14中的PHPicker

进行图片选择,下面我们来看看 PHPicker 的优点: 支持多选 支持搜索 独立的进程 内置隐私 不需要直接访问用户相册 不会弹出访问相册提示 仅提供用户选择的照片和视频(App 无法获取其他照片) 如何调用...然后我们可以在合适的时机调用以下这个 API 来推出 PHPickerController。...let viewController = self PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController)复制代码...监听相册变化 配合手动调用 PHPickerController,我们还需要监听用户添加/删除了哪些照片。 注意: 这组 API 并不是新出的, iOS 8 开始就支持了。...let viewController = self // 开始监听 PHPhotoLibrary.shared().register(viewController) // 结束监听 PHPhotoLibrary.shared

3.6K30

为什么不推荐使用PHPicker

进行图片选择,下面我们来看看 PHPicker 的优点: 支持多选 支持搜索 独立的进程 内置隐私 不需要直接访问用户相册 不会弹出访问相册提示 仅提供用户选择的照片和视频(App 无法获取其他照片) 如何调用...然后我们可以在合适的时机调用以下这个 API 来推出 PHPickerController。...let viewController = self PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController)复制代码...监听相册变化 配合手动调用 PHPickerController,我们还需要监听用户添加/删除了哪些照片。 注意: 这组 API 并不是新出的, iOS 8 开始就支持了。...let viewController = self // 开始监听 PHPhotoLibrary.shared().register(viewController) // 结束监听 PHPhotoLibrary.shared

2.5K40
  • SwiftUI中使用UIKit视图

    本文将通过对UITextField的包装来讲解以下几点: •如何SwiftUI中使用UIKit视图•如何让你的UIKit包装视图具有SwiftUI风格•在SwiftUI使用UIKit视图需要注意的地方...如果你已经对如何使用UIViewRepresentable有所掌握,可以直接SwiftUI风格化部分阅读 基础 在具体演示包装代码之前,我们先介绍一些与在SwiftUI中使用UIKit视图有关的基础知识...将UIKit视图包装成SwiftUI的视图时,我们需要了解两者生命周期之间的不同,不要强行试图找到完全对应的方法,要从SwiftUI的角度来思考如何调用UIKit视图。...如何实现类似原生TextFiled的链式调用呢?...不过有以下几点需要注意: •如何改变View内的的值(View是结构)•如何处理返回的类型(保证调用链继续有效)•如何利用SwiftUI框架现有的数据并与之交互逻辑 为了更全面的演示,下面的例子,采用了不同的处理方式

    8.2K22

    SwiftUI 下定制手势

    本文将通过几个示例,演示如何使用 SwiftUI 提供的原生手段定制所需手势。 基础 预置手势 SwiftUI 目前提供了 5 种预置手势,分别为点击、长按、拖拽、缩放和旋转。...除了提供了更多的调用时机外,而且支持了对按压区域尺寸的智能处理(提高手指触击成功率)。 Value SwiftUI 会依据手势的类型提供不同的数据内容。...时机 SwiftUI 手势内部没有状态一说,通过设置与指定时机对应的闭包,手势会在适当地时机自动进行调用。...苹果目前并没有提供应该如何实现它的文档,好在 SwiftUI 提供了一个含有约束的默认实现。...使用 simultaneously 将两种手势联合起来, DrageGesture 中获取位置数据, TapGesture 中退出。

    2.7K20

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 将状态视图中抽离出来,方便测试 )。...请阅读 Writing testable code when using SwiftUI[4] 一文,了解如何编写对测试友好的视图代码。...在我的例子中,不拖动时 0 到 75,拖动时 0 到 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴的刻度域。...我在想:1、对于像这样的 UITabBarController 中的 SwiftUI 视图,onAppear 到底应该在什么时候被调用?...image-20221022135326560San Francisco 宽度风格Q:如何SwiftUI如何使用 SF 字体家族新增的三种宽度风格( Compressed、Condensed、Expanded

    12.2K20

    SwiftUI TextField进阶——格式与校验

    为什么不自己封装新的实现 对于很多UIKit转到SwiftUI的开发者,当遇到SwiftUI官方API功能无法满足某些需求的情况下,非常自然地会想通过UIViewRepresentable来封装自己的实现...如何在TextField中实现格式化显示 现有格式化方法 在SwiftUI 3.0中,TextField新增了使用新老两种Formatter的构造方法。...如何在TextField中屏蔽无效字符 现有屏蔽字符方法 在SwiftUI中,可以通过设置仅使用特定的键盘类型来实现一定程度上的录入限制。...如何在TextField中检查内容是否符合指定条件 相较上述两个目标,在SwiftUI中检查TextField内容是否符合指定条件是相当方便的。...•可持续性(SwiftUI向后兼容性)方案二由于完全采用SwiftUI方式编写,因此其可持续性理论上应强于方案一。

    8.1K20

    Ask Apple 2022 与 SwiftUI 有关的问答(下)

    SwiftUI 布局 —— 尺寸( 上 )[8] 一文中,对建议尺寸的几种模式都进行了介绍。如何减少主线程的负担Q:如何避免所有操作都被放置在主线上?...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建底部开始的滚动视图Q:我如何实现一个在底部对齐的滚动视图,在 macOS 上会不会有糟糕的性能?...)调用 transformAnchorPreference(key:_, value:_, transform:_) or preference(key:_,value:_) 来在 SwiftUI 更新视图时收集坐标信息调用...在 SwiftUI 中,有一个第一版开始就存在但尚未公开的纯 SwiftUI 实现的滚动容器 —— _ScrollView 。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图。

    14.8K30

    肘子的 Swift 周报 #001

    然而,过了一段时间,我发现当我记忆中寻找技术线索时,那些我仔细筛选、阅读并推荐的文章给我留下了深刻的印象。停刊后,虽然我每天也在阅读不少文章和博客,但印象没有之前担任编辑时那么深刻。...如果你打算逐步 Core Data 迁移到 Swift Data,或者想在你的应用程序中为特定用例(如小组件)使用Swift Data,本文将对你有所帮助。...通过定制的 AttributeGraph 分析工具,最终发现根本原因来自于对 NSAttributedString 的初始化方法的错误调用,以及系统控件对 AG 碎片更新的错误时机。...How async/await works internally in Swift[22] Bruno Rocha[23] iOS 15 开始,Swift 引入了 async/await。...本文作者撰写了三篇文章,分别介绍了如何开设英国公司[26]、如何注册 Wise 企业账号[27]以及如何注册国外开发者账号。 提示:对于 App/ICP 备案,海外公司更难在国内备案。

    27640

    如何结合 Core Data 和 SwiftUI

    因此,剩下的就是我们要决定要在 Core Data 中存储哪些数据,以及如何读出这些数据。...使用获取请求 Core Data 中检索信息——我们描述了我们想要的内容,应如何对其进行排序以及是否应使用任何过滤器,然后 Core Data 会发回所有匹配的数据。...SwiftUI 有一个解决方案,而且——您猜对了——这是另一个属性包装器。这次将其称为@FetchRequest,它带有两个参数:我们要查询的实体以及我们希望结果如何排序。...这是一个引发函数的调用,因为理论上它可能会失败。实际上,我们所做的一切都没有失败的可能,因此我们可以使用try?来调用它——–我们不在乎捕获错误。 因此,请将最后一行添加到按钮的操作中: try?...这是该项目概述的最后一部分,因此,请将您的代码重设为初始状态,并确保您我们的数据模型中删除了Student实体——我们不再需要它。

    11.8K30

    TCA - SwiftUI 的救星?(一)

    对于以前很少接触声明式或者类似架构的朋友来说,其中有一些概念和选择可能不太容易理解,比如为什么 Side Effect 需要额外对应,如何在不同 View 之间共享状态,页面迁移的时候如何优雅处理等等。...可以说, iOS 14 开始,SwiftUI 才算逐渐进入了可用的状态。而最近随着公司的项目彻底抛弃 iOS 13,我也终于可以更多地正式在工作中用上 SwiftUI 了。...我们真的需要一种架构,来让 SwiftUI 的使用更加轻松一些。 Elm 获得的启示 我估摸着前端开发的圈子一年能大约能诞生 500 多种架构[8]。...会自动调用 View.body 为我们渲染新的界面。...随着 app 越来越复杂,在后面我们会看到更多的 Feature,以及如何通过 TCA 提供的工具,将它们组合到一起。

    3.2K30

    SwiftUI 视图的生命周期研究

    在进行更详尽说明之前,请大家先明确两个观点: •SwiftUI 没有同 UIkit(AppKit)对应的视图与视图生命周期•应避免对 SwiftUI 视图的创建、body 的调用、布局与渲染等的时机和频率进行假设...视图值树 在 SwiftUI 中,视图是状态的函数[2]。 开发者通过符合 View 协议的结构体来声明界面,SwiftUI 通过调用结构体实例的 body 获取对应的视图值。...SwiftUI 视图的生命周期 大多介绍 SwiftUI 视图生命周期的文章,通常会将视图的生命周期描述成如下的链条: 初始化视图实例——注册数据依赖——调用 body 计算结果——onAppear——...但 SwiftUI 并非一定会从新的实例中获取 body 结果,如果之前的实例注册过数据依赖,视图值树仍可能会原来的实例的 body 中获取结果。...调用 body 计算结果 通过在 body 中添加类似如下的代码,我们可以在 SwiftUI 调用实例的 body 时获得通知: let _ = print("update some view") 计算

    4.4K30

    SwiftUI 的动画机制

    开发者经常需要面对:如何动、怎么动、什么能动、为什么不动、为什么这么动、如何不让它动等等困扰。对 SwiftUI 的动画处理逻辑了解的不够深入是造成上述困扰的主要原因。...Majid 的 The magic of Animatable values in SwiftUI[3] 一文中,展示了如何让自定义类型满足 VectorArithmetic 协议。...当可动画部件关联的依赖项发生变化时,SwiftUI 将通过指定的时序曲线函数进行插值计算,并持续调用与该依赖项关联的可动画部件的 animatableData 属性。...当修饰符 id 的值发生变化时,SwiftUI 将其作用的视图当前的视图结构中移除,并创建新的视图添加到原先所在的视图层次位置。因此,可以影响到它的动画部件也是 AnyTransaction 。...在 ViewBuilder 研究(下) —— 模仿中学习[9] 一文中,我们展示了 SwiftUI 的 Text 是如何处理它的扩展方法的。

    14.7K40

    避免 SwiftUI 视图的重复计算

    本文将介绍如何减少( 甚至避免 )类似的情况发生,从而改善 SwiftUI 应用的整体表现。...当 SwiftUI 将视图加载到视图树时,通过调用 _makeProperty 完成将数据保存到托管数据池以及在属性图中创建关联的操作,并将数据在托管数据池中的引用保存在 _location ( AnyLocation...当 SwiftUI 将视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...store 实例的属性或方法,但无论在任何场合,但只要该实例的 objectWillChange.send 方法被调用( 例如修改了使用 @Published 包装的属性 ),所有与之相关联的视图(...会在主线程上运行触发器闭包,如果闭包中的操作比较昂贵,可以考虑将闭包发送到后台队列 总结 本文介绍了一些在 SwiftUI如何避免造成视图重复计算的技巧,除了从中查找是否有能解决你当前问题的方法外

    9.2K81

    ViewBuilder 研究(下) —— 模仿中学习

    SwiftUI 会在恰当的时机开发者创建的视图 body 属性中读取这些描述并进行绘制。 依赖 我们常说,视图是状态的函数。对于单个视图来说,它的状态是由所有与之相关的依赖共同组成的。...SwiftUI 如何处理视图 SwiftUI 加载视图、响应状态到屏幕绘制大概经历如下过程: 根视图开始按视图层级结构沿特定分支(依据初始状态)逐个实例化视图,直到满足当前全部的显示所需 上述实例化后的视图值...,按视图层级结构依当前状态逐个实例化视图类型(到满足全部显示所需为止) 将已不再需要参与布局和渲染的视图的值 SwiftUI 数据池中移除,并在数据池中添加上新增的视图值 对于仍需显示但视图值发生变化的视图...它会和 buildOptional 或 buildEither 一并使用,在满足了 API 可用性检查的情况下会调用该实现。...开发者通过 Modifier 在视图中表述自己的想法,SwiftUI 只会在布局和渲染时才会真正调用这些 modifier 的实现。

    3K20

    肘子的 Swift 周报 #034 | WWDC 2024,AI 并非全部

    在本文中,Rens Breur 将展示如何通过堆栈跟踪来阅读和理解 AttributeGraph 的函数,以及如何利用 LLDB 命令行工具来调用和查看 AttributeGraph 的各种打印功能。...此外,文章还探讨了如何利用 AttributeGraph 的特性来优化和理解 SwiftUI 中环境变量和偏好( PreferenceKey )的更新机制,并提供了一些实用的调试技巧和函数,帮助开发者更深入地理解和使用...Into Animating App Icons )[7] Bryce Bostwick[8] 在 iOS 系统中,通过替代应用图标系统(Alternate App Icons system),用户可以预设的静态图像集中选择应用图标...本文中,Bryce Bostwick 探讨了如何通过频繁更换图标来创造动画效果的技术手段。文章详细介绍了如何利用私有 API 进行实现,并且阐释了相关的技术细节。...该指南内容全面,包括:详解 Swift 的数据竞争安全模型、指导如何在 Swift 5 项目中开启完整的并发检查、如何渐进式采用并发技术,以及介绍解决常见问题的有效策略。

    10110

    SwiftUI 布局协议 - Part2

    当我们改变角度时,SwiftUI 会计算好每个视图最初和最终的位置,然后在动画期间内修改它们的位置,A点到B点成一条直线。...起初它似乎没有这样做,但是检查下面这个动画,集中注意观察单个视图,看看它们是如何都跟随直虚线移动的? 你有想过如果动画的角度是0到360会发生什么吗?给你一分钟... 对!...什么都不会发生。...我们的想法是信息视图流向布局,一会儿将看见这一点是如何被逆转。 本节所解释的想法应谨慎使用,以避免布局循环和 CPU 峰值。在下一部分我将会解释原因和如何避免它。...我们提到 SwiftUI 可能会多次调用 sizeThatFits 去测试视图的灵活性。在这些调用中,你返回的值应该是合理的。...总结 即使你不打算写你自己的布局容器,明白它是如何工作也会帮助你理解布局在 SwiftUI 的一般工作方式。

    2.7K30
    领券