Giter Club home page Giter Club logo

hxphpicker's Introduction

中文 | English

Buy Me A Coffee
photo/video selector-supports LivePhoto, GIF selection, iCloud resource online download, photo/video editing

Features

  • UI Appearance supports light/dark/auto/custom
  • Support multiple selection/mixed content selection
  • Supported media types:
    • Photo
    • GIF
    • Live Photo
    • Video
  • Supported local media types:
    • Photo
    • Video
    • GIF
    • Live Photo
  • Supported network media types:
    • Photo
    • Video
  • Support downloading assets on iCloud
  • Support gesture back
  • Support sliding selection
  • Edit pictures (support animated pictures, network pictures)
    • Graffiti
    • Sticker
    • Text
    • Crop
    • Mosaic
    • Filter
  • Edit video (support network video)
    • Graffiti
    • Stickers (support GIF)
    • Text
    • Soundtrack (support lyrics and subtitles)
    • Crop duration
    • Crop Size
    • Filter
  • Album display mode
    • Separate list
    • Pop-ups
  • Multi-platform support
    • iOS
    • iPadOS
  • Internationalization support
    • 🇨🇳 Chinese, Simplified (zh-Hans)
    • 🇬🇧 English (en)
    • 🇨🇳 Chinese, traditional (zh-Hant)
    • 🇯🇵 Japanese (ja)
    • 🇰🇷 Korean (ko)
    • 🇹🇭 Thai (th)
    • 🇮🇳 Indonesian (id)
    • 🇻🇳 Vietnamese (vi)
    • 🇷🇺 russian (ru)
    • 🇩🇪 german (de)
    • 🇫🇷 french (fr)
    • 🇸🇦 arabic (ar)
    • ✍️ Custom language (custom)
    • 🤝 More support... (Pull requests welcome)

Requirements

  • iOS 12.0+
  • Xcode 12.5+
  • Swift 5.4+

Installation

⚠️ Needs Xcode 12.0+ to support resources and localization files

dependencies: [
    .package(url: "https://github.com/SilenceLove/HXPHPicker.git", .upToNextMajor(from: "2.0.0"))
]

Add this to Podfile, and then update dependency:

iOS 12.0+
pod 'HXPHPicker'

/// No Kingfisher
pod `HXPHPicker/Lite`

/// Only Picker
pod `HXPHPicker/Picker`
pod `HXPHPicker/Picker/Lite`

/// Only Editor
pod `HXPHPicker/Editor`
pod `HXPHPicker/Editor/Lite`

/// Only Camera
pod `HXPHPicker/Camera`
/// Does not include location functionality
pod `HXPHPicker/Camera/Lite`

iOS 10.0+
pod 'HXPHPicker-Lite'
pod 'HXPHPicker-Lite/Picker'
pod 'HXPHPicker-Lite/Editor'
pod 'HXPHPicker-Lite/Camera'

Add the following content to Cartfile and perform dependency update.

github "SilenceLove/HXPHPicker"

Usage

Wiki

Prepare

Add these keys to your Info.plist when needed:

Key Module Info
NSPhotoLibraryUsageDescription Picker Allow access to album
NSPhotoLibraryAddUsageDescription Picker Allow to save pictures to album
PHPhotoLibraryPreventAutomaticLimitedAccessAlert Picker Set YES to prevent automatic limited access alert in iOS 14+ (Picker has been adapted with Limited features that can be triggered by the user to enhance the user experience)
NSCameraUsageDescription Camera Allow camera
NSMicrophoneUsageDescription Camera Allow microphone

Quick Start

import HXPHPicker

class ViewController: UIViewController {

    func presentPickerController() {
        // Set the configuration consistent with the WeChat theme
        let config = PickerConfiguration.default
        
        // Method 1:
        let pickerController = PhotoPickerController(picker: config)
        pickerController.pickerDelegate = self
        // The array of PhotoAsset objects corresponding to the currently selected asset
        pickerController.selectedAssetArray = selectedAssets 
        // Whether to select the original image
        pickerController.isOriginal = isOriginal
        present(pickerController, animated: true, completion: nil)
        
        // Method 2:
        Photo.picker(
            config
        ) { result, pickerController in
            // Select completion callback
            // result Select result
            //  .photoAssets Currently selected data
            //  .isOriginal Whether the original image is selected
            // photoPickerController Corresponding photo selection controller
        } cancel: { pickerController in
            // Cancelled callback
            // photoPickerController Corresponding photo selection controller
        }
    }
}

extension ViewController: PhotoPickerControllerDelegate {
    
    /// Called after the selection is complete
    /// - Parameters:
    ///   - pickerController: corresponding PhotoPickerController
    ///   - result: Selected result
    ///     result.photoAssets  Selected asset array
    ///     result.isOriginal   Whether to select the original image
    func pickerController(_ pickerController: PhotoPickerController, 
                            didFinishSelection result: PickerResult) {
        result.getImage { (image, photoAsset, index) in
            if let image = image {
                print("success", image)
            }else {
                print("failed")
            }
        } completionHandler: { (images) in
            print(images)
        }
    }
    
    /// Called when cancel is clicked
    /// - Parameter pickerController: Corresponding PhotoPickerController
    func pickerController(didCancel pickerController: PhotoPickerController) {
        
    }
}

Get Content

Get UIImage

/// If it is a video, get the cover of the video
/// compressionQuality: Compress parameters, if not passed, no compression
photoAsset.getImage(compressionQuality: compressionQuality) { image in
    print(image)
}

Get URL

/// compression: Compress parameters, if not passed, no compression
photoAsset.getURL(compression: compression) { result in
    switch result {
    case .success(let urlResult): 
        
        switch urlResult.mediaType {
        case .photo:
        
        case .video:
        
        }
        
        switch urlResult.urlType {
        case .local:
        
        case .network:
        
        }
        
        print(urlResult.url)
        
        // Image and video urls contained in LivePhoto
        print(urlResult.livePhoto) 
        
    case .failure(let error):
        print(error)
    }
}

Release Notes

Version Release Date Xcode Swift iOS
v2.0.0 2023-06-14 14.3.0 5.7.0 12.0+
v1.4.6 2022-11-20 14.0.0 5.7.0 12.0+

License

HXPHPicker is released under the MIT license. See LICENSE for details.

Support

Buy Me A Coffee

or

Stargazers over time

Stargazers over time

🔝

hxphpicker's People

Contributors

mohamedabdelmaksoud22 avatar silencelove avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hxphpicker's Issues

PhotoBrowser的一点小优化

1.作为图片浏览器,当预览大图滚动时,原界面的轮播图片不会滚动到当前页码,加了一个DidScrollHandler = (Int) -> Void,把内部的页码传输出去
2.有时候浏览大图时,转场动画时不想隐藏原视图,Configuration增加了个hidenSourceView的控制参数
3.当在一个Present出来的控制器中再预览大图时,转场动画会有瑕疵,底部不会渐变,动画生硬,因为PickerTransition里contentView的frame设置的有问题,当type == .present,frame = toVC.view.bounds,type == .dismiss,frame = fromVC.view.bounds

发现一个点选的显示逻辑问题 , 作者看看是否需要修复~

当我选择了一张照片 , 并且选中了原图按钮后 , 后面会显示该图片按钮的大小 , 点击完成这张图片就进入到了九宫格里 , 此时我再点击右上角的设置让系统不允许选择照片 , 点击允许加载系统照片库为 不允许 , 此时我再点击 ➕ 按钮选择照片的时候之前那张照片的原图(2.8M)还会存在, 但是其实此时照片库已经没有可选的照片了 , 希望作者看一下这个问题 ;

点击路径为:
Picker -> 打开选择器(右上角) -> 选一张且选中原图 -> 点击完成 -> 点击设置(右上角) -> 点击允许加载系统照片库将值置为不允许 -> 点击确定 -> 点击九宫格➕选择照片, 发现底部的原图(2.8M)还在 ~

RowTypeRule.swift 文件的一些疑问

作者你好 ,我想问一下 RowTypeRule.swift 这个文件里有一个同名的接口协议 protocol RowTypeRule { ... } 和其默认实现
我想问一下 , 这个接口貌似在全局没有被用到 , 我想向你请教一下 , 这样的写法是 swift 必须得么? 还是说你也只是留一个口子在这 , 用不用无所谓 ? 希望您看到消息方便的时候回复一下 , 不胜感激!

不走代理方法

就是当单纯选择视频的时候 并且是单选(多选我没试)
此时底部会显示 编辑、原图、完成 按钮,这时候点击完成按钮不会走代理方法
必须是点击编辑页面里面的完成按钮才会走代理方法

private(set)修饰的一些讨论

作者您好 , 最近在通过您的这个开源项目学习 swift 语法也学习到了你代码中很好的 面向接口而非面向实现编程 的代码写法思路 , 有一个点想和您探讨 :
ConfigurationViewCell 这个文件中, 对控件的懒加载前面你用了 private(set)修饰, 但是其实我发现即便这样 ,我在外部还是可以通过比如 cell.titleLabel.XXX 拿到 titleLabel 内部的属性 , 还是能修改一些相关信息, 这里是不是直接用 private修饰更好 , 感觉这个 private(set)完全没起到作用, 它只是让 titleLabel 没办法再被定义被初始化 , 但是他里面的属性我还是拿得到能修改 , 这样对封装性是不是有一些破坏;
如果您看到信息, 烦请您方便的时候回复一下 , 谢谢!

选取或者拍摄视频,使用这个方法获取视频时,如何获取处理视频的进度

/// 获取视频地址
/// - Parameters:
/// - exportPreset: 视频分辨率,默认ratio_640x480,传 nil 获取则是原始视频
/// - videoQuality: 视频质量[0-10],默认4,exportPreset不为nil时有效
/// - exportSession: 导出视频时对应的 AVAssetExportSession,exportPreset不为nil时触发
/// - videoURLHandler: 每一次获取视频地址都会触发
/// - completionHandler: 全部获取完成(失败的不会添加)
func getVideoURL(
exportPreset: ExportPreset? = .ratio_640x480,
videoQuality: Int = 4,
exportSession: AVAssetExportSessionHandler? = nil,
videoURLHandler: URLHandler? = nil,
completionHandler: @escaping ([URL]) -> Void
) {
photoAssets.getVideoURL(
exportPreset: exportPreset,
videoQuality: videoQuality,
exportSession: exportSession,
videoURLHandler: videoURLHandler,
completionHandler: completionHandler
)
}

2:PickerConfiguration 和 PhotoEditorConfiguration能不能像CameraConfiguration 那样加上modalPresentationStyle的属性

Demo无法运行

运行报错:Command CompileSwiftSources failed with a nonzero exit code;对比了很多解决方法,仍存在问题;

照片和视频编辑滤镜问题

关于滤镜

咱们目前的滤镜是硬编码到代码中的,请问如何实现自定义滤镜样式,或者后期是否考虑增加动态设置滤镜参数的场景?

关于音频

添加背景音乐不支持选择背景音乐的指定一段时长,后期建议添加。

可以只显示gif吗?

设置config.selectOptions = [.gifPhoto],还是会显示静态图片。
设置config.selectOptions = [.video],只显示video。

PhotoBrowser浏览视频

PhotoBrowser浏览视频的时候,这种写法视频大小不对,只展示中间一部分
d8c2cc3e-8889-46f6-b201-159b60b6522c

PhotoBrowser.show(
            // 预览的资源数组
            [PhotoAsset.init(networkVideoAsset: .init(videoURL: url))],
            // 当前预览的位置
            pageIndex: pageIndex,
            // 预览相关配置
            config: config,
            // 来源控制器
            fromVC: self.fromVC,
            // 转场动画初始的 UIImage
            transitionalImage: fromView?.image
        ) { index in
            fromView
        } deleteAssetHandler: { index, photoAsset, photoBrowser in
            // 点击了删除按钮
            PhotoTools.showAlert(
                viewController: photoBrowser,
                title: R.string.localizable.deleteCommon(preferredLanguages: Helper.currentLanguage()),
                leftActionTitle: R.string.localizable.confirm(preferredLanguages: Helper.currentLanguage()),
                leftHandler: { (alertAction) in
                    photoBrowser.deleteCurrentPreviewPhotoAsset()
                    self.deleteAssetHandler?(index)
                }, rightActionTitle: R.string.localizable.cancel(preferredLanguages: Helper.currentLanguage())) { (alertAction) in }
        } longPressHandler: { index, photoAsset, photoBrowser in
            self.longPressHandler?(index)
            // 长按事件
            self.previewLongPressClick(
                photoAsset: photoAsset,
                photoBrowser: photoBrowser,
                showDelete: showDelete
            )
        }

编辑网络视频导出失败

如题 不管是用你的demo还是pod进项目的库
当编辑网络视频的时候 视频导出失败
是不支持编辑网络视频还是有bug?

在你的demo中我是直接在EditorConfigurationViewController控制器中修改你本地视频地址(videoURL)为网络视频地址

视频时长

config.maximumSelectedVideoDuration = 15
config.minimumSelectedVideoDuration = 5
我这样限制时间,然后可剪辑时长却只有10s
有人遇到同样的问题吗?

demo 运行报错

demo 运行报错;

let networkImageAsset = PhotoAsset.init(networkImageAsset: NetworkImageAsset.init(thumbnailURL: networkImageURL, originalURL: networkImageURL))

错误信息:Cannot find 'NetworkImageAsset' in scope

新建工程
pod 'HXPHPicker'
pod 'Kingfisher'
安装后

相同的报错原因;

分析: #if canImport(Kingfisher) 不能识别到Kingfisher 导致

作者能查看修复么?
谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.