├── .codebeatsettings ├── .github └── FUNDING.yml ├── .gitignore ├── .swiftlint.yml ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── Documentation ├── README_CN.md ├── RELEASE_NOTE.md ├── RELEASE_NOTE_CN.md ├── Support │ ├── ap.jpeg │ ├── bmc_qr.png │ ├── sample_graph.png │ ├── sample_graph_en.png │ └── wp.jpeg └── Wiki │ ├── EDITOR_GUIDE.md │ ├── GUIDE.md │ ├── HOME.md │ ├── INSTALLATION.md │ └── PICKER_GUIDE.md ├── Example ├── AppDelegate.swift ├── Classes │ ├── Controller │ │ ├── AvatarPickerConfigurationViewController.swift │ │ ├── CustomPickerCellViewController.swift │ │ ├── EditorConfigurationViewController.swift │ │ ├── HomeViewController.swift │ │ ├── PhotoBrowserViewController.swift │ │ ├── PickerColorConfigurationViewController.swift │ │ ├── PickerConfigurationViewController.swift │ │ ├── PickerResultViewController.swift │ │ ├── PickerResultViewController.xib │ │ ├── TestEditorViewController.swift │ │ ├── WeChatMometViewController.swift │ │ ├── WeChatViewController.swift │ │ └── WindowPickerViewController.swift │ ├── Example-Bridging-Header.h │ ├── Extension │ │ ├── Core+UIColor.swift │ │ ├── RowTypeRule.swift │ │ ├── String+Extension.swift │ │ ├── UIDevice+Extension.swift │ │ ├── UIFont+Extension.swift │ │ └── UIImage+Extension.swift │ ├── Model │ │ ├── GPUImageBeautifyFilter.h │ │ ├── GPUImageBeautifyFilter.m │ │ ├── ImageFilter.swift │ │ └── Tools.swift │ └── View │ │ ├── ConfigurationViewCell.swift │ │ └── CustomPickerCellView.swift ├── Example.entitlements ├── Info.plist └── Resources │ ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-1024.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-83.5@2x.png │ │ ├── Icon-Notify.png │ │ ├── Icon-Notify@2x.png │ │ ├── Icon-Notify@3x.png │ │ ├── Icon-Small-40.png │ │ ├── Icon-Small-40@2x.png │ │ ├── Icon-Small-40@3x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small@2x.png │ │ └── Icon-Small@3x.png │ ├── Contents.json │ ├── camera_overturn.imageset │ │ ├── Contents.json │ │ ├── camera_overturn@2x.png │ │ └── camera_overturn@3x.png │ ├── hx_compose_delete.imageset │ │ ├── Contents.json │ │ ├── hx_compose_delete@2x.png │ │ └── hx_compose_delete@3x.png │ ├── hx_photo_edit_tools_clip.imageset │ │ ├── Contents.json │ │ ├── hx_photo_edit_tools_clip@2x.png │ │ └── hx_photo_edit_tools_clip@3x.png │ ├── hx_photo_edit_tools_emoji.imageset │ │ ├── Contents.json │ │ ├── hx_photo_edit_tools_emoji@2x.png │ │ └── hx_photo_edit_tools_emoji@3x.png │ ├── hx_photo_edit_tools_graffiti.imageset │ │ ├── Contents.json │ │ ├── hx_photo_edit_tools_graffiti@2x.png │ │ └── hx_photo_edit_tools_graffiti@3x.png │ ├── hx_photo_edit_tools_mosaic.imageset │ │ ├── Contents.json │ │ ├── hx_photo_edit_tools_mosaic@2x.png │ │ └── hx_photo_edit_tools_mosaic@3x.png │ ├── hx_photo_edit_tools_text.imageset │ │ ├── Contents.json │ │ ├── hx_photo_edit_tools_text@2x.png │ │ └── hx_photo_edit_tools_text@3x.png │ ├── hx_picker_add_img.imageset │ │ ├── Contents.json │ │ ├── hx_picker_add_img@2x.png │ │ └── hx_picker_add_img@3x.png │ ├── hx_picker_cell_video_play.imageset │ │ ├── Contents.json │ │ ├── hx_picker_cell_video_play@2x.png │ │ └── hx_picker_cell_video_play@3x.png │ ├── hx_sticker_cover.imageset │ │ ├── Contents.json │ │ ├── hx_sticker_cover@2x.png │ │ └── hx_sticker_cover@3x.png │ ├── select_photo.imageset │ │ ├── Contents.json │ │ ├── select_photo@2x.png │ │ └── select_photo@3x.png │ └── wx_head_icon.imageset │ │ ├── Contents.json │ │ └── wx_head_icon@2x.png │ ├── Base.lproj │ └── LaunchScreen.storyboard │ ├── Images │ ├── hx_sticker_chongya.png │ ├── hx_sticker_haoxinqing.png │ ├── hx_sticker_housailei.png │ ├── hx_sticker_jintianfenkeai.png │ ├── hx_sticker_keaibiaoq.png │ ├── hx_sticker_kehaixing.png │ ├── hx_sticker_saihong.png │ ├── hx_sticker_wow.png │ ├── hx_sticker_woxiangfazipai.png │ ├── hx_sticker_xiaochuzhujiao.png │ ├── hx_sticker_yuanqimanman.png │ ├── hx_sticker_yuanqishaonv.png │ ├── hx_sticker_zaizaijia.png │ ├── livephoto_image.jpeg │ ├── love.png │ ├── love_text.png │ ├── picker_example_gif_image.GIF │ ├── picker_example_image.JPG │ ├── portrait.png │ ├── qiy.png │ ├── stars.png │ └── text.png │ ├── Music │ ├── 世间美好与你环环相扣 │ ├── 世间美好与你环环相扣.mp3 │ ├── 嘉宾 │ ├── 嘉宾.mp3 │ ├── 天外来物 │ ├── 天外来物.mp3 │ ├── 少女的祈祷 │ ├── 少女的祈祷.mp3 │ ├── 无赖 │ ├── 无赖.mp3 │ ├── 时光正好 │ ├── 时光正好.mp3 │ ├── 爱你 │ ├── 爱你.mp3 │ ├── 野孩子 │ └── 野孩子.mp3 │ └── Video │ └── livephoto_video.mp4 ├── HXPHPicker-Lite.podspec ├── HXPHPicker.podspec ├── HXPHPicker.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── Example.xcscheme │ └── HXPHPicker.xcscheme ├── HXPHPicker.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings ├── LICENSE ├── Package.resolved ├── Package.swift ├── Podfile ├── Podfile.lock ├── Pods ├── GDPerformanceView-Swift │ ├── GDPerformanceView-Swift │ │ └── GDPerformanceMonitoring │ │ │ ├── LinkedFramesList.swift │ │ │ ├── MarginLabel.swift │ │ │ ├── PerformanceMonitor.swift │ │ │ ├── PerformanceView.swift │ │ │ ├── PerformanceСalculator.swift │ │ │ ├── Protocols.swift │ │ │ └── WindowViewController.swift │ ├── LICENSE │ └── README.md ├── Kingfisher │ ├── LICENSE │ ├── README.md │ └── Sources │ │ ├── Cache │ │ ├── CacheSerializer.swift │ │ ├── DiskStorage.swift │ │ ├── FormatIndicatedCacheSerializer.swift │ │ ├── ImageCache.swift │ │ ├── MemoryStorage.swift │ │ └── Storage.swift │ │ ├── Extensions │ │ ├── CPListItem+Kingfisher.swift │ │ ├── ImageView+Kingfisher.swift │ │ ├── NSButton+Kingfisher.swift │ │ ├── NSTextAttachment+Kingfisher.swift │ │ ├── TVMonogramView+Kingfisher.swift │ │ ├── UIButton+Kingfisher.swift │ │ └── WKInterfaceImage+Kingfisher.swift │ │ ├── General │ │ ├── ImageSource │ │ │ ├── AVAssetImageDataProvider.swift │ │ │ ├── ImageDataProvider.swift │ │ │ ├── Resource.swift │ │ │ └── Source.swift │ │ ├── KF.swift │ │ ├── KFOptionsSetter.swift │ │ ├── Kingfisher.swift │ │ ├── KingfisherError.swift │ │ ├── KingfisherManager.swift │ │ └── KingfisherOptionsInfo.swift │ │ ├── Image │ │ ├── Filter.swift │ │ ├── GIFAnimatedImage.swift │ │ ├── GraphicsContext.swift │ │ ├── Image.swift │ │ ├── ImageDrawing.swift │ │ ├── ImageFormat.swift │ │ ├── ImageProcessor.swift │ │ ├── ImageProgressive.swift │ │ ├── ImageTransition.swift │ │ └── Placeholder.swift │ │ ├── Networking │ │ ├── AuthenticationChallengeResponsable.swift │ │ ├── ImageDataProcessor.swift │ │ ├── ImageDownloader.swift │ │ ├── ImageDownloaderDelegate.swift │ │ ├── ImageModifier.swift │ │ ├── ImagePrefetcher.swift │ │ ├── RedirectHandler.swift │ │ ├── RequestModifier.swift │ │ ├── RetryStrategy.swift │ │ ├── SessionDataTask.swift │ │ └── SessionDelegate.swift │ │ ├── SwiftUI │ │ ├── ImageBinder.swift │ │ ├── ImageContext.swift │ │ ├── KFAnimatedImage.swift │ │ ├── KFImage.swift │ │ ├── KFImageOptions.swift │ │ ├── KFImageProtocol.swift │ │ └── KFImageRenderer.swift │ │ ├── Utility │ │ ├── Box.swift │ │ ├── CallbackQueue.swift │ │ ├── Delegate.swift │ │ ├── ExtensionHelpers.swift │ │ ├── Result.swift │ │ ├── Runtime.swift │ │ ├── SizeExtensions.swift │ │ └── String+MD5.swift │ │ └── Views │ │ ├── AnimatedImageView.swift │ │ └── Indicator.swift ├── Local Podspecs │ └── HXPHPicker.podspec.json ├── Manifest.lock ├── Pods.xcodeproj │ └── project.pbxproj └── Target Support Files │ ├── GDPerformanceView-Swift │ ├── GDPerformanceView-Swift-Info.plist │ ├── GDPerformanceView-Swift-dummy.m │ ├── GDPerformanceView-Swift-prefix.pch │ ├── GDPerformanceView-Swift-umbrella.h │ ├── GDPerformanceView-Swift.debug.xcconfig │ ├── GDPerformanceView-Swift.modulemap │ └── GDPerformanceView-Swift.release.xcconfig │ ├── HXPHPicker │ ├── HXPHPicker-Info.plist │ ├── HXPHPicker-dummy.m │ ├── HXPHPicker-prefix.pch │ ├── HXPHPicker-umbrella.h │ ├── HXPHPicker.debug.xcconfig │ ├── HXPHPicker.modulemap │ └── HXPHPicker.release.xcconfig │ ├── Kingfisher │ ├── Kingfisher-Info.plist │ ├── Kingfisher-dummy.m │ ├── Kingfisher-prefix.pch │ ├── Kingfisher-umbrella.h │ ├── Kingfisher.debug.xcconfig │ ├── Kingfisher.modulemap │ └── Kingfisher.release.xcconfig │ └── Pods-Example │ ├── Pods-Example-Info.plist │ ├── Pods-Example-acknowledgements.markdown │ ├── Pods-Example-acknowledgements.plist │ ├── Pods-Example-dummy.m │ ├── Pods-Example-frameworks.sh │ ├── Pods-Example-resources.sh │ ├── Pods-Example-umbrella.h │ ├── Pods-Example.debug.xcconfig │ ├── Pods-Example.modulemap │ └── Pods-Example.release.xcconfig ├── README.md ├── Sources ├── HXPHPicker │ ├── Camera+Location │ │ └── CameraViewController+Location.swift │ ├── Camera │ │ ├── Config │ │ │ └── CameraConfiguration.swift │ │ ├── Controller │ │ │ ├── CameraController.swift │ │ │ ├── CameraControllerProtocol.swift │ │ │ ├── CameraManager.swift │ │ │ ├── CameraResultViewController.swift │ │ │ ├── CameraViewController+BottomView.swift │ │ │ ├── CameraViewController+Editor.swift │ │ │ ├── CameraViewController+Preview.swift │ │ │ ├── CameraViewController+Result.swift │ │ │ └── CameraViewController.swift │ │ ├── Model │ │ │ ├── CameraFilter.swift │ │ │ ├── CameraRenderer.swift │ │ │ └── DeviceOrientationHelper.swift │ │ ├── Util │ │ │ └── Camera+PhotoTools.swift │ │ └── View │ │ │ ├── CameraBottomView.swift │ │ │ ├── CameraPreviewView.swift │ │ │ ├── PassThrough.metal │ │ │ └── PreviewMetalView.swift │ ├── Core │ │ ├── Config │ │ │ └── SelectBoxConfiguration.swift │ │ ├── Controller │ │ │ └── BaseViewController.swift │ │ ├── Extension │ │ │ ├── Core+AVAsset.swift │ │ │ ├── Core+Bundle.swift │ │ │ ├── Core+CALayer.swift │ │ │ ├── Core+CGFloat.swift │ │ │ ├── Core+Data.swift │ │ │ ├── Core+Dictionary.swift │ │ │ ├── Core+DispatchQueue.swift │ │ │ ├── Core+FileManager.swift │ │ │ ├── Core+PHAsset.swift │ │ │ ├── Core+PHAssetCollection.swift │ │ │ ├── Core+String.swift │ │ │ ├── Core+UIApplication.swift │ │ │ ├── Core+UIColor.swift │ │ │ ├── Core+UIDevice.swift │ │ │ ├── Core+UIFont.swift │ │ │ ├── Core+UIImage.swift │ │ │ ├── Core+UIImageView.swift │ │ │ ├── Core+UILabel.swift │ │ │ ├── Core+UIView.swift │ │ │ ├── Core+UIViewController.swift │ │ │ └── Core+URL.swift │ │ ├── HXPHPicker.swift │ │ ├── Model │ │ │ ├── AppearanceStyle.swift │ │ │ ├── CustomLanguage.swift │ │ │ ├── ExportPreset.swift │ │ │ ├── ImageContentType.swift │ │ │ ├── IndicatorType.swift │ │ │ ├── LanguageType.swift │ │ │ ├── LivePhotoError.swift │ │ │ ├── PhotoError.swift │ │ │ └── PhotoPanGestureRecognizer.swift │ │ ├── Util │ │ │ ├── AssetManager+AVAsset.swift │ │ │ ├── AssetManager+AVAssetExportSession.swift │ │ │ ├── AssetManager+Asset.swift │ │ │ ├── AssetManager+AssetCollection.swift │ │ │ ├── AssetManager+Authorization.swift │ │ │ ├── AssetManager+Image.swift │ │ │ ├── AssetManager+ImageData.swift │ │ │ ├── AssetManager+ImageURL.swift │ │ │ ├── AssetManager+LivePhoto.swift │ │ │ ├── AssetManager+LivePhotoURL.swift │ │ │ ├── AssetManager+VideoURL.swift │ │ │ ├── AssetManager.swift │ │ │ ├── PhotoManager+Download.swift │ │ │ ├── PhotoManager+Language.swift │ │ │ ├── PhotoManager.swift │ │ │ ├── PhotoTools+Alert.swift │ │ │ ├── PhotoTools+Camera.swift │ │ │ ├── PhotoTools+File.swift │ │ │ └── PhotoTools.swift │ │ └── View │ │ │ ├── GIFImageView.swift │ │ │ ├── ImageView.swift │ │ │ ├── ProgressHUD.swift │ │ │ ├── ProgressImageView.swift │ │ │ ├── SelectBoxView.swift │ │ │ ├── VideoPlaySliderView.swift │ │ │ └── VideoPlayerView.swift │ ├── Editor+View │ │ ├── Extension │ │ │ ├── EditorView+AVAsset.swift │ │ │ ├── EditorView+CGFloat.swift │ │ │ ├── EditorView+CIImage.swift │ │ │ ├── EditorView+UIImage.swift │ │ │ └── EditorView+UIView.swift │ │ ├── ImageEditedResult.swift │ │ ├── Model │ │ │ ├── EditorModels.swift │ │ │ ├── EditorTypes.swift │ │ │ └── EditorVideoCompositor.swift │ │ ├── Util │ │ │ ├── EditorVideoTool.swift │ │ │ └── EditorView+PhotoTools.swift │ │ ├── VideoEditedResult.swift │ │ └── View │ │ │ ├── EditorAdjusterView+ContentView.swift │ │ │ ├── EditorAdjusterView+Croper.swift │ │ │ ├── EditorAdjusterView+Edit.swift │ │ │ ├── EditorAdjusterView+FrameView.swift │ │ │ ├── EditorAdjusterView+Mirror.swift │ │ │ ├── EditorAdjusterView+Rotate.swift │ │ │ ├── EditorAdjusterView+ScreenRotation.swift │ │ │ ├── EditorAdjusterView+ScrollView.swift │ │ │ ├── EditorAdjusterView+Video.swift │ │ │ ├── EditorAdjusterView.swift │ │ │ ├── EditorAdjusterViewProtocol.swift │ │ │ ├── EditorAudioAnimationView.swift │ │ │ ├── EditorContentView.swift │ │ │ ├── EditorControlView.swift │ │ │ ├── EditorDrawView.swift │ │ │ ├── EditorFrameView+Control.swift │ │ │ ├── EditorFrameView+VideoPlay.swift │ │ │ ├── EditorFrameView.swift │ │ │ ├── EditorMaskView.swift │ │ │ ├── EditorMosaicView.swift │ │ │ ├── EditorStickersContentView.swift │ │ │ ├── EditorStickersItemView.swift │ │ │ ├── EditorStickersTrashView.swift │ │ │ ├── EditorStickersView.swift │ │ │ ├── EditorVideoPlayerView.swift │ │ │ ├── EditorView+AdjusterView.swift │ │ │ ├── EditorView+GestureRecognizer.swift │ │ │ ├── EditorView+Public.swift │ │ │ ├── EditorView+ScrollView.swift │ │ │ ├── EditorView.swift │ │ │ └── EditorViewProtocol.swift │ ├── Editor │ │ ├── Config │ │ │ └── EditorConfiguration.swift │ │ ├── Controller │ │ │ ├── EditorChartletViewController.swift │ │ │ ├── EditorMaskListViewController.swift │ │ │ ├── EditorMusicListViewController.swift │ │ │ ├── EditorStickerTextViewController.swift │ │ │ ├── EditorViewController+Brush.swift │ │ │ ├── EditorViewController+Chartlet.swift │ │ │ ├── EditorViewController+EditorView.swift │ │ │ ├── EditorViewController+Filters.swift │ │ │ ├── EditorViewController+LoadAsset.swift │ │ │ ├── EditorViewController+Mosaic.swift │ │ │ ├── EditorViewController+Music.swift │ │ │ ├── EditorViewController+Ratio.swift │ │ │ ├── EditorViewController+Text.swift │ │ │ ├── EditorViewController+ToolsView.swift │ │ │ ├── EditorViewController+VideoControl.swift │ │ │ ├── EditorViewController.swift │ │ │ └── EditorViewControllerDelegate.swift │ │ ├── EditedResult.swift │ │ ├── Extension │ │ │ └── Editor+CIImage.swift │ │ ├── Model │ │ │ ├── EditorAsset.swift │ │ │ ├── EditorChartlet.swift │ │ │ ├── EditorPlayAuido.swift │ │ │ ├── EditorType.swift │ │ │ ├── PhotoEditorFilter.swift │ │ │ └── VideoEditorMusic.swift │ │ ├── Transition │ │ │ └── EditorTransition.swift │ │ ├── Util │ │ │ └── Editor+PhotoTools.swift │ │ └── View │ │ │ ├── EditorBrushBlockView.swift │ │ │ ├── EditorBrushColorView.swift │ │ │ ├── EditorBrushSizeView.swift │ │ │ ├── EditorChartletPreviewView.swift │ │ │ ├── EditorChartletViewCell.swift │ │ │ ├── EditorChartletViewListCell.swift │ │ │ ├── EditorCollectionView.swift │ │ │ ├── EditorFilterEditView.swift │ │ │ ├── EditorFilterParameterView.swift │ │ │ ├── EditorFiltersView.swift │ │ │ ├── EditorMaskListViewCell.swift │ │ │ ├── EditorMosaicToolView.swift │ │ │ ├── EditorMusicLyricViewCell.swift │ │ │ ├── EditorMusicView.swift │ │ │ ├── EditorMusicViewCell.swift │ │ │ ├── EditorRatioToolView.swift │ │ │ ├── EditorRatioToolViewCell.swift │ │ │ ├── EditorScaleView.swift │ │ │ ├── EditorStickerTextView+CollectionView.swift │ │ │ ├── EditorStickerTextView+Delegate.swift │ │ │ ├── EditorStickerTextView+Draw.swift │ │ │ ├── EditorStickerTextView.swift │ │ │ ├── EditorToolsView.swift │ │ │ ├── EditorVideoControlMaskView.swift │ │ │ ├── EditorVideoControlView.swift │ │ │ ├── EditorVideoControlViewCell.swift │ │ │ └── EditorVolumeView.swift │ ├── Picker │ │ ├── AssetURLResult.swift │ │ ├── Config │ │ │ ├── AlbumListConfiguration.swift │ │ │ ├── AlbumTitleViewConfiguration.swift │ │ │ ├── ArrowViewConfiguration.swift │ │ │ ├── EmptyViewConfiguration.swift │ │ │ ├── NotAuthorizedConfiguration.swift │ │ │ ├── PhotoListCellConfiguration.swift │ │ │ ├── PhotoListConfiguration.swift │ │ │ ├── PickerBottomViewConfiguration.swift │ │ │ ├── PickerConfiguration.swift │ │ │ ├── PreviewViewConfiguration.swift │ │ │ └── SystemCameraConfiguration.swift │ │ ├── Controller │ │ │ ├── AlbumViewController.swift │ │ │ ├── PhotoBrowser.swift │ │ │ ├── PhotoPeekViewController.swift │ │ │ ├── PhotoPickerController+FetchAsset.swift │ │ │ ├── PhotoPickerController+Internal.swift │ │ │ ├── PhotoPickerController+PHPhotoLibrary.swift │ │ │ ├── PhotoPickerController+Transitioning.swift │ │ │ ├── PhotoPickerController.swift │ │ │ ├── PhotoPickerControllerProtocol.swift │ │ │ ├── PhotoPickerViewController+AlbumView.swift │ │ │ ├── PhotoPickerViewController+BottomView.swift │ │ │ ├── PhotoPickerViewController+Camera.swift │ │ │ ├── PhotoPickerViewController+Cell.swift │ │ │ ├── PhotoPickerViewController+CollectionView.swift │ │ │ ├── PhotoPickerViewController+Editor.swift │ │ │ ├── PhotoPickerViewController+FetchAsset.swift │ │ │ ├── PhotoPickerViewController+Preview.swift │ │ │ ├── PhotoPickerViewController+SwipeSelect.swift │ │ │ ├── PhotoPickerViewController.swift │ │ │ ├── PhotoPreviewViewController+BottomView.swift │ │ │ ├── PhotoPreviewViewController+CollectionView.swift │ │ │ ├── PhotoPreviewViewController+Editor.swift │ │ │ ├── PhotoPreviewViewController+NavigationController.swift │ │ │ ├── PhotoPreviewViewController+SelectBox.swift │ │ │ ├── PhotoPreviewViewController.swift │ │ │ ├── PhotoPreviewViewControllerProtocol.swift │ │ │ └── SystemCameraViewController.swift │ │ ├── Extension │ │ │ ├── Picker+Array.swift │ │ │ ├── Picker+Int.swift │ │ │ ├── Picker+PhotoAsset.swift │ │ │ ├── Picker+UIImageView.swift │ │ │ └── Picker+UIViewController.swift │ │ ├── Model │ │ │ ├── LocalAsset.swift │ │ │ ├── NetworkAsset.swift │ │ │ ├── PhotoAsset+Codable.swift │ │ │ ├── PhotoAsset+Editor.swift │ │ │ ├── PhotoAsset+Equal.swift │ │ │ ├── PhotoAsset+FileSize.swift │ │ │ ├── PhotoAsset+Local.swift │ │ │ ├── PhotoAsset+Network.swift │ │ │ ├── PhotoAsset+Request.swift │ │ │ ├── PhotoAsset+URL.swift │ │ │ ├── PhotoAsset.swift │ │ │ ├── PhotoAssetCollection.swift │ │ │ ├── PickerManager.swift │ │ │ └── PickerTypes.swift │ │ ├── PickerResult.swift │ │ ├── Transition │ │ │ ├── PickerControllerInteractiveTransition.swift │ │ │ ├── PickerControllerTransition.swift │ │ │ ├── PickerInteractiveTransition.swift │ │ │ └── PickerTransition.swift │ │ ├── Util │ │ │ ├── Picker+LivePhotoTools.swift │ │ │ ├── Picker+PhotoManager.swift │ │ │ └── Picker+PhotoTools.swift │ │ └── View │ │ │ ├── AlbumTickView.swift │ │ │ ├── AlbumTitleView.swift │ │ │ ├── AlbumView.swift │ │ │ ├── ArrowView.swift │ │ │ ├── CaptureVideoPreviewView.swift │ │ │ ├── Cell │ │ │ ├── AlbumViewCell.swift │ │ │ ├── PhotoPickerBaseViewCell.swift │ │ │ ├── PhotoPickerLimitCell.swift │ │ │ ├── PhotoPickerSelectableViewCell.swift │ │ │ ├── PhotoPickerViewCell.swift │ │ │ ├── PhotoPickerWeChatViewCell.swift │ │ │ ├── PhotoPreviewSelectedViewCell.swift │ │ │ ├── PhotoPreviewViewCell.swift │ │ │ ├── PickerCameraViewCell.swift │ │ │ ├── PreviewLivePhotoViewCell.swift │ │ │ ├── PreviewPhotoViewCell.swift │ │ │ ├── PreviewVideoControlViewCell.swift │ │ │ └── PreviewVideoViewCell.swift │ │ │ ├── DeniedAuthorizationView.swift │ │ │ ├── EmptyView.swift │ │ │ ├── PhotoPickerBottomNumberView.swift │ │ │ ├── PhotoPickerBottomView.swift │ │ │ ├── PhotoPickerSwitchLayout.swift │ │ │ ├── PhotoPickerView+Asset.swift │ │ │ ├── PhotoPickerView+Camera.swift │ │ │ ├── PhotoPickerView+Cell.swift │ │ │ ├── PhotoPickerView+CollectionView.swift │ │ │ ├── PhotoPickerView+Editor.swift │ │ │ ├── PhotoPickerView+Function.swift │ │ │ ├── PhotoPickerView+Preview.swift │ │ │ ├── PhotoPickerView.swift │ │ │ ├── PhotoPickerViewProtocol.swift │ │ │ ├── PhotoPreviewContentView.swift │ │ │ ├── PhotoPreviewSelectedView.swift │ │ │ ├── PhotoPreviewVideoView.swift │ │ │ └── PhotoThumbnailView.swift │ └── Resources │ │ ├── .DS_Store │ │ └── HXPHPicker.bundle │ │ ├── ar.lproj │ │ └── Localizable.strings │ │ ├── de.lproj │ │ └── Localizable.strings │ │ ├── en.lproj │ │ └── Localizable.strings │ │ ├── fr.lproj │ │ └── Localizable.strings │ │ ├── id.lproj │ │ └── Localizable.strings │ │ ├── images │ │ ├── hx_camera_down_back@2x.png │ │ ├── hx_camera_down_back@3x.png │ │ ├── hx_camera_overturn@2x.png │ │ ├── hx_camera_overturn@3x.png │ │ ├── hx_editor_back@2x.png │ │ ├── hx_editor_back@3x.png │ │ ├── hx_editor_brush_color_custom@2x.png │ │ ├── hx_editor_brush_color_custom@3x.png │ │ ├── hx_editor_brush_repeal@2x.png │ │ ├── hx_editor_brush_repeal@3x.png │ │ ├── hx_editor_change_asset@2x.png │ │ ├── hx_editor_change_asset@3x.png │ │ ├── hx_editor_crop_mask_list@2x.png │ │ ├── hx_editor_crop_mask_list@3x.png │ │ ├── hx_editor_filter_edit_brightness@2x.png │ │ ├── hx_editor_filter_edit_brightness@3x.png │ │ ├── hx_editor_filter_edit_contrast@2x.png │ │ ├── hx_editor_filter_edit_contrast@3x.png │ │ ├── hx_editor_filter_edit_saturation@2x.png │ │ ├── hx_editor_filter_edit_saturation@3x.png │ │ ├── hx_editor_filter_edit_sharpen@2x.png │ │ ├── hx_editor_filter_edit_sharpen@3x.png │ │ ├── hx_editor_filter_edit_vignette@2x.png │ │ ├── hx_editor_filter_edit_vignette@3x.png │ │ ├── hx_editor_filter_edit_warmth@2x.png │ │ ├── hx_editor_filter_edit_warmth@3x.png │ │ ├── hx_editor_mosaic_brush_image@2x.png │ │ ├── hx_editor_mosaic_brush_image@3x.png │ │ ├── hx_editor_photo_crop@2x.png │ │ ├── hx_editor_photo_crop@3x.png │ │ ├── hx_editor_photo_crop_free@2x.png │ │ ├── hx_editor_photo_crop_free@3x.png │ │ ├── hx_editor_photo_mirror_horizontally@2x.png │ │ ├── hx_editor_photo_mirror_horizontally@3x.png │ │ ├── hx_editor_photo_mirror_vertically@2x.png │ │ ├── hx_editor_photo_mirror_vertically@3x.png │ │ ├── hx_editor_photo_rotate_left@2x.png │ │ ├── hx_editor_photo_rotate_left@3x.png │ │ ├── hx_editor_photo_rotate_right@2x.png │ │ ├── hx_editor_photo_rotate_right@3x.png │ │ ├── hx_editor_photo_text_normal@2x.png │ │ ├── hx_editor_photo_text_normal@3x.png │ │ ├── hx_editor_photo_text_selected@2x.png │ │ ├── hx_editor_photo_text_selected@3x.png │ │ ├── hx_editor_photo_tools_emoji@2x.png │ │ ├── hx_editor_photo_tools_emoji@3x.png │ │ ├── hx_editor_photo_tools_text@2x.png │ │ ├── hx_editor_photo_tools_text@3x.png │ │ ├── hx_editor_photo_trash_close@2x.png │ │ ├── hx_editor_photo_trash_close@3x.png │ │ ├── hx_editor_photo_trash_open@2x.png │ │ ├── hx_editor_photo_trash_open@3x.png │ │ ├── hx_editor_tool_mosaic_color@2x.png │ │ ├── hx_editor_tool_mosaic_color@3x.png │ │ ├── hx_editor_tool_mosaic_normal@2x.png │ │ ├── hx_editor_tool_mosaic_normal@3x.png │ │ ├── hx_editor_tools_chartle_album@2x.png │ │ ├── hx_editor_tools_chartle_album@3x.png │ │ ├── hx_editor_tools_filter@2x.png │ │ ├── hx_editor_tools_filter@3x.png │ │ ├── hx_editor_tools_filter_change@2x.png │ │ ├── hx_editor_tools_filter_change@3x.png │ │ ├── hx_editor_tools_filter_edit@2x.png │ │ ├── hx_editor_tools_filter_edit@3x.png │ │ ├── hx_editor_tools_graffiti@2x.png │ │ ├── hx_editor_tools_graffiti@3x.png │ │ ├── hx_editor_tools_mosaic@2x.png │ │ ├── hx_editor_tools_mosaic@3x.png │ │ ├── hx_editor_tools_music@2x.png │ │ ├── hx_editor_tools_music@3x.png │ │ ├── hx_editor_tools_play@2x.png │ │ ├── hx_editor_tools_play@3x.png │ │ ├── hx_editor_video_control_arrow_left@2x.png │ │ ├── hx_editor_video_control_arrow_left@3x.png │ │ ├── hx_editor_video_control_arrow_right@2x.png │ │ ├── hx_editor_video_control_arrow_right@3x.png │ │ ├── hx_editor_video_control_pause@2x.png │ │ ├── hx_editor_video_control_pause@3x.png │ │ ├── hx_editor_video_control_play@2x.png │ │ ├── hx_editor_video_control_play@3x.png │ │ ├── hx_editor_video_crop@2x.png │ │ ├── hx_editor_video_crop@3x.png │ │ ├── hx_editor_video_music_search@2x.png │ │ ├── hx_editor_video_music_search@3x.png │ │ ├── hx_editor_video_music_volume@2x.png │ │ ├── hx_editor_video_music_volume@3x.png │ │ ├── hx_editor_view_sticker_item_delete@2x.png │ │ ├── hx_editor_view_sticker_item_delete@3x.png │ │ ├── hx_editor_view_sticker_item_rotate@2x.png │ │ ├── hx_editor_view_sticker_item_rotate@3x.png │ │ ├── hx_editor_view_sticker_item_scale@2x.png │ │ ├── hx_editor_view_sticker_item_scale@3x.png │ │ ├── hx_photo_box_normal@2x.png │ │ ├── hx_photo_box_normal@3x.png │ │ ├── hx_photo_box_selected@2x.png │ │ ├── hx_photo_box_selected@3x.png │ │ ├── hx_photo_edit_pull_down@2x.png │ │ ├── hx_photo_edit_pull_down@3x.png │ │ ├── hx_picker_add_img@2x.png │ │ ├── hx_picker_add_img@3x.png │ │ ├── hx_picker_album_empty@2x.png │ │ ├── hx_picker_album_empty@3x.png │ │ ├── hx_picker_cell_livephoto_icon@2x.png │ │ ├── hx_picker_cell_livephoto_icon@3x.png │ │ ├── hx_picker_cell_photo_edit_icon@2x.png │ │ ├── hx_picker_cell_photo_edit_icon@3x.png │ │ ├── hx_picker_cell_video_edit_icon@2x.png │ │ ├── hx_picker_cell_video_edit_icon@3x.png │ │ ├── hx_picker_cell_video_icon@2x.png │ │ ├── hx_picker_cell_video_icon@3x.png │ │ ├── hx_picker_cell_video_play@2x.png │ │ ├── hx_picker_cell_video_play@3x.png │ │ ├── hx_picker_livePhoto@2x.png │ │ ├── hx_picker_livePhoto@3x.png │ │ ├── hx_picker_notAuthorized_close@2x.png │ │ ├── hx_picker_notAuthorized_close@3x.png │ │ ├── hx_picker_notAuthorized_close_dark@2x.png │ │ ├── hx_picker_notAuthorized_close_dark@3x.png │ │ ├── hx_picker_photoList_photograph@2x.png │ │ ├── hx_picker_photoList_photograph@3x.png │ │ ├── hx_picker_photoList_photograph_white@2x.png │ │ ├── hx_picker_photoList_photograph_white@3x.png │ │ ├── hx_picker_photo_icloud_mark@2x.png │ │ ├── hx_picker_photo_icloud_mark@3x.png │ │ ├── hx_picker_photolist_bottom_prompt@2x.png │ │ ├── hx_picker_photolist_bottom_prompt@3x.png │ │ ├── hx_picker_photolist_bottom_prompt_arrow@2x.png │ │ ├── hx_picker_photolist_bottom_prompt_arrow@3x.png │ │ ├── hx_picker_photolist_cancel@2x.png │ │ └── hx_picker_photolist_cancel@3x.png │ │ ├── ja.lproj │ │ └── Localizable.strings │ │ ├── ko.lproj │ │ └── Localizable.strings │ │ ├── metal │ │ └── default.metallib │ │ ├── musics │ │ └── 天外来物 │ │ ├── ru.lproj │ │ └── Localizable.strings │ │ ├── th.lproj │ │ └── Localizable.strings │ │ ├── vi.lproj │ │ └── Localizable.strings │ │ ├── zh-Hans.lproj │ │ └── Localizable.strings │ │ └── zh-Hant.lproj │ │ └── Localizable.strings └── Info.plist └── tmp.xcconfig /.codebeatsettings: -------------------------------------------------------------------------------- 1 | { 2 | "SWIFT": { 3 | "LOC": [100, 150, 200, 250], 4 | "ARITY": [100, 200, 300, 400], 5 | "TOO_MANY_FUNCTIONS": [100, 200, 300, 400], 6 | "TOO_MANY_IVARS": [100, 200, 300, 400], 7 | "TOTAL_LOC": [500, 600, 700, 800] 8 | } 9 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [silence] 4 | custom: [https://github.com/sponsors/SilenceLove] 5 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - trailing_whitespace 3 | - statement_position 4 | - identifier_name 5 | - unused_closure_parameter 6 | - multiple_closures_with_trailing_closure 7 | - type_body_length 8 | - function_parameter_count 9 | - force_cast 10 | - large_tuple 11 | 12 | excluded: 13 | - Carthage 14 | - Pods 15 | - Package.swift 16 | 17 | force_try: warning 18 | 19 | function_body_length: 20 | warning: 120 21 | error: 150 22 | 23 | file_length: 24 | warning: 1000 25 | error: 1500 26 | 27 | cyclomatic_complexity: 40 28 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Documentation/Support/ap.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/ap.jpeg -------------------------------------------------------------------------------- /Documentation/Support/bmc_qr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/bmc_qr.png -------------------------------------------------------------------------------- /Documentation/Support/sample_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/sample_graph.png -------------------------------------------------------------------------------- /Documentation/Support/sample_graph_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/sample_graph_en.png -------------------------------------------------------------------------------- /Documentation/Support/wp.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/wp.jpeg -------------------------------------------------------------------------------- /Documentation/Wiki/HOME.md: -------------------------------------------------------------------------------- 1 | `HXPHPicker` 是一个选取、编辑、展示图片的工具套件,使用 Swift 编写。 2 | 3 | ## 开始使用 4 | 5 | - [使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 6 | - [功能概览](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E5%8A%9F%E8%83%BD%E6%A6%82%E8%A7%88) 7 | - [使用方式](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F) 8 | - [使用要求](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E4%BD%BF%E7%94%A8%E8%A6%81%E6%B1%82) 9 | - [安装说明](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E) 10 | - [Swift Package Manager](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#swift-package-manager) 11 | - [CocoaPods](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#cocoapods) 12 | - [Carthage](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#carthage) 13 | - [Picker使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 14 | - [调用/回调说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E8%B0%83%E7%94%A8%E5%9B%9E%E8%B0%83%E8%AF%B4%E6%98%8E) 15 | - [配置项说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E9%85%8D%E7%BD%AE%E9%A1%B9%E8%AF%B4%E6%98%8E) 16 | - [公开方法](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E5%85%AC%E5%BC%80%E6%96%B9%E6%B3%95) 17 | - [Editor使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Editor%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 18 | - [调用/回调说明](https://github.com/SilenceLove/HXPHPicker/wiki/Editor%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E8%B0%83%E7%94%A8%E5%9B%9E%E8%B0%83%E8%AF%B4%E6%98%8E) 19 | 20 | 21 | ## 交流 22 | 23 | [Issue](https://github.com/SilenceLove/HXPHPicker/issues):如果你发现了任意 Bug,或者希望我们添加某些功能,欢迎给我们提 Issue。 24 | 25 | [Pull Request](https://github.com/SilenceLove/HXPHPicker/pulls):如果你想为这个项目做一些贡献,欢迎给我们提 PR,但是在这之前建议你先在 Issue 中与我们沟通,避免同时修改同一处内容。 26 | -------------------------------------------------------------------------------- /Documentation/Wiki/INSTALLATION.md: -------------------------------------------------------------------------------- 1 | ## Swift Package Manager 2 | 3 | [Swift Package Manager](https://github.com/apple/swift-package-manager) 是管理 Swift 代码分发的工具,与Swift构建系统集成在一起,可以自动执行依赖项的下载,编译和链接过程。 4 | 5 | ⚠️ 需要 Xcode 12.0 及以上版本来支持资源文件/本地化文件的添加。 6 | 7 | ```swift 8 | dependencies: [ 9 | .package(url: "https://github.com/SilenceLove/HXPHPicker.git", 10 | .upToNextMajor(from: "2.0")) 11 | ] 12 | ``` 13 | 14 | 15 | ## CocoaPods 16 | 17 | [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) 是项目依赖管理器,你可以用以下命令安装: 18 | 19 | ```ruby 20 | $ gem install cocoapods 21 | ``` 22 | 23 | 将下面内容添加到 `Podfile` 24 | 25 | ```ruby 26 | pod 'HXPHPicker' 27 | ``` 28 | 29 | 接下来执行安装命令: 30 | 31 | ```ruby 32 | $ pod install 33 | ``` 34 | 35 | ### 单独引入 36 | 37 | 一般情况下我们会引入所有默认模块,如果你只需要单独一个子模块可以使用下面的命令: 38 | 39 | ```ruby 40 | pod 'HXPHPicker' # 引入所有默认模块 41 | pod 'HXPHPicker', :subspecs => ['Picker'] # 只引入图片选择器 42 | pod 'HXPHPicker', :subspecs => ['Picker', 'Editor'] # 引入图片选择器和编辑器 43 | pod 'HXPHPicker', :subspecs => ['Editor'] # 只引入编辑器 44 | pod 'HXPHPicker', :subspecs => ['Camera'] # 只引入相机 45 | ``` 46 | 47 | ### 子模块列表 48 | 49 | ```ruby 50 | 'Picker' # 图片选择器,默认模块 51 | 'Editor' # 编辑器,默认模块 52 | 'Camera' # 相机,默认模块 53 | ``` 54 | 55 | 56 | ## Carthage 57 | 58 | [Carthage](https://github.com/Carthage/Carthage) 是项目依赖管理器,你可以用以下命令安装: 59 | 60 | ```ruby 61 | $ brew update 62 | $ brew install carthage 63 | ``` 64 | 65 | 将下面内容添加到 `Cartfile` 66 | 67 | ```ruby 68 | github "SilenceLove/HXPHPicker" 69 | ``` 70 | 71 | 接下来执行安装命令: 72 | 73 | ```ruby 74 | $ carthage update HXPHPicker --platform iOS 75 | ``` 76 | 77 | 78 | 79 | ## 下一步 80 | 81 | - [Picker使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 82 | -------------------------------------------------------------------------------- /Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2020/12/30. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | func application( 16 | _ application: UIApplication, 17 | didFinishLaunchingWithOptions 18 | launchOptions: [UIApplication.LaunchOptionsKey: Any]? 19 | ) -> Bool { 20 | // Override point for customization after application launch. 21 | let windows = UIWindow(frame: UIScreen.main.bounds) 22 | let homeController: HomeViewController 23 | if #available(iOS 13.0, *) { 24 | homeController = .init(style: .insetGrouped) 25 | } else { 26 | homeController = .init(style: .grouped) 27 | } 28 | let navigationController = UINavigationController(rootViewController: homeController) 29 | windows.rootViewController = navigationController 30 | windows.makeKeyAndVisible() 31 | self.window = windows 32 | return true 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Example/Classes/Controller/CustomPickerCellViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomPickerCellViewController.swift 3 | // Example 4 | // 5 | // Created by Slience on 2021/3/16. 6 | // 7 | 8 | import UIKit 9 | import HXPHPicker 10 | 11 | class CustomPickerCellViewController: UIViewController { 12 | 13 | var config: PickerConfiguration = PhotoTools.getWXPickerConfig(isMoment: false) 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | config.photoSelectionTapAction = .quickSelect 18 | config.videoSelectionTapAction = .quickSelect 19 | // config.photoList.cell.customSingleCellClass = CustomPickerViewCell.self 20 | config.photoList.cell.customSelectableCellClass = CustomPickerViewCell.self 21 | view.backgroundColor = .white 22 | title = "CustomCell" 23 | navigationItem.rightBarButtonItem = UIBarButtonItem( 24 | title: "打开选择器", 25 | style: .done, 26 | target: self, 27 | action: #selector(openPickerController) 28 | ) 29 | } 30 | 31 | @objc func openPickerController() { 32 | let pickerController = PhotoPickerController.init(config: config) 33 | pickerController.pickerDelegate = self 34 | pickerController.autoDismiss = false 35 | present(pickerController, animated: true, completion: nil) 36 | } 37 | } 38 | extension CustomPickerCellViewController: PhotoPickerControllerDelegate { 39 | func pickerController(_ pickerController: PhotoPickerController, didFinishSelection result: PickerResult) { 40 | pickerController.dismiss(true) { 41 | let pickerResultVC = PickerResultViewController.init() 42 | pickerResultVC.config = pickerController.config 43 | pickerResultVC.selectedAssets = result.photoAssets 44 | pickerResultVC.isOriginal = result.isOriginal 45 | self.navigationController?.pushViewController(pickerResultVC, animated: true) 46 | } 47 | } 48 | func pickerController(didCancel pickerController: PhotoPickerController) { 49 | pickerController.dismiss(animated: true, completion: nil) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Example/Classes/Example-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "GPUImageBeautifyFilter.h" 6 | -------------------------------------------------------------------------------- /Example/Classes/Extension/Core+UIColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UIColor.swift 3 | // Example 4 | // 5 | // Created by Slience on 2021/3/16. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(hexString: String) { 13 | let hexString = hexString.trimmingCharacters(in: .whitespacesAndNewlines) 14 | let scanner = Scanner(string: hexString) 15 | if hexString.hasPrefix("#") { 16 | scanner.scanLocation = 1 17 | } 18 | var color: UInt32 = 0 19 | scanner.scanHexInt32(&color) 20 | let mask = 0x000000FF 21 | let r = Int(color >> 16) & mask 22 | let g = Int(color >> 8) & mask 23 | let b = Int(color) & mask 24 | let red = CGFloat(r) / 255.0 25 | let green = CGFloat(g) / 255.0 26 | let blue = CGFloat(b) / 255.0 27 | self.init(red: red, green: green, blue: blue, alpha: 1) 28 | } 29 | class var systemTintColor: UIColor { 30 | UIColor.init(red: 0, green: 0.47843137254901963, blue: 1, alpha: 1) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Example/Classes/Extension/RowTypeRule.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RowTypeRule.swift 3 | // Example 4 | // 5 | // Created by Slience on 2021/3/16. 6 | // 7 | 8 | import UIKit 9 | import HXPHPicker 10 | 11 | protocol HomeRowTypeRule { 12 | var title: String { get } 13 | var controller: UIViewController { get } 14 | } 15 | 16 | protocol ConfigRowTypeRule { 17 | var title: String { get } 18 | var detailTitle: String { get } 19 | 20 | func getFunction(_ controller: T) -> ((IndexPath) -> Void) 21 | } 22 | -------------------------------------------------------------------------------- /Example/Classes/Extension/String+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extension.swift 3 | // Example 4 | // 5 | // Created by 洪欣 on 2023/5/2. 6 | // 7 | 8 | import Foundation 9 | 10 | 11 | extension String { 12 | 13 | subscript(_ indexs: ClosedRange) -> String { 14 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound) 15 | let endIndex = index(startIndex, offsetBy: indexs.upperBound) 16 | return String(self[beginIndex...endIndex]) 17 | } 18 | 19 | subscript(_ indexs: Range) -> String { 20 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound) 21 | let endIndex = index(startIndex, offsetBy: indexs.upperBound) 22 | return String(self[beginIndex..) -> String { 26 | let endIndex = index(startIndex, offsetBy: indexs.upperBound) 27 | return String(self[startIndex...endIndex]) 28 | } 29 | 30 | subscript(_ indexs: PartialRangeFrom) -> String { 31 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound) 32 | return String(self[beginIndex..) -> String { 36 | let endIndex = index(startIndex, offsetBy: indexs.upperBound) 37 | return String(self[startIndex.. UIFont { 13 | let font = UIFont.init(name: "PingFangSC-Regular", size: size) 14 | return font ?? UIFont.systemFont(ofSize: size) 15 | } 16 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont { 17 | let font = UIFont.init(name: "PingFangSC-Medium", size: size) 18 | return font ?? UIFont.systemFont(ofSize: size) 19 | } 20 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont { 21 | let font = UIFont.init(name: "PingFangSC-Semibold", size: size) 22 | return font ?? UIFont.systemFont(ofSize: size) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Example/Classes/Model/GPUImageBeautifyFilter.h: -------------------------------------------------------------------------------- 1 | // 2 | // GPUImageBeautifyFilter.h 3 | // BeautifyFaceDemo 4 | // 5 | // Created by guikz on 16/4/28. 6 | // Copyright © 2016年 guikz. All rights reserved. 7 | // 8 | 9 | #if __has_include() 10 | #import "GPUImage/GPUImage.h" 11 | 12 | @class GPUImageCombinationFilter; 13 | 14 | @interface GPUImageBeautifyFilter : GPUImageFilterGroup { 15 | GPUImageBilateralFilter *bilateralFilter; 16 | GPUImageCannyEdgeDetectionFilter *cannyEdgeFilter; 17 | GPUImageCombinationFilter *combinationFilter; 18 | GPUImageHSBFilter *hsbFilter; 19 | } 20 | 21 | //设置美化强度 22 | - (id)initWithDegree:(float)degree; 23 | 24 | @end 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Example/Classes/Model/ImageFilter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageFilter.swift 3 | // Example 4 | // 5 | // Created by Slience on 2022/2/18. 6 | // 7 | 8 | #if canImport(GPUImage) 9 | import UIKit 10 | import VideoToolbox 11 | import HXPHPicker 12 | import GPUImage 13 | 14 | struct FilterTools { 15 | static func filters() -> [CameraFilter] { 16 | [ 17 | BeautifyFilter(), InstantFilter(), Apply1977Filter(), ToasterFilter(), TransferFilter() 18 | ] 19 | } 20 | } 21 | 22 | class BeautifyFilter: CameraFilter { 23 | var filterName: String { 24 | return "美白" 25 | } 26 | 27 | var filter: GPUImageBeautifyFilter? 28 | 29 | func prepare(_ size: CGSize) { 30 | filter = GPUImageBeautifyFilter(degree: 0.6) 31 | } 32 | 33 | func render(_ pixelBuffer: CVPixelBuffer) -> CIImage? { 34 | var cgImage: CGImage? 35 | VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage) 36 | guard let cgImage = cgImage, let bilateralFilter = filter else { 37 | return nil 38 | } 39 | let picture = GPUImagePicture(cgImage: cgImage) 40 | picture?.addTarget(bilateralFilter) 41 | bilateralFilter.useNextFrameForImageCapture() 42 | picture?.processImage() 43 | let result = bilateralFilter.newCGImageFromCurrentlyProcessedOutput().takeRetainedValue() 44 | return .init(cgImage: result) 45 | } 46 | 47 | func reset() { 48 | filter = nil 49 | } 50 | } 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /Example/Classes/View/CustomPickerCellView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomPickerCellView.swift 3 | // Example 4 | // 5 | // Created by Slience on 2021/3/16. 6 | // 7 | 8 | import UIKit 9 | import HXPHPicker 10 | 11 | class CustomPickerViewCell: PhotoPickerViewCell { 12 | lazy var selectedMaskView: UIView = { 13 | let view = UIView.init() 14 | view.layer.borderWidth = 5 15 | view.layer.borderColor = UIColor(hexString: "#07c160").cgColor 16 | view.backgroundColor = UIColor.black.withAlphaComponent(0.6) 17 | view.addSubview(numberLb) 18 | view.isHidden = true 19 | return view 20 | }() 21 | 22 | lazy var numberLb: UILabel = { 23 | let label = UILabel.init() 24 | label.textColor = UIColor(hexString: "#ffffff") 25 | label.textAlignment = .center 26 | label.font = .boldSystemFont(ofSize: 35) 27 | label.adjustsFontSizeToFitWidth = true 28 | return label 29 | }() 30 | 31 | override func initView() { 32 | super.initView() 33 | contentView.addSubview(selectedMaskView) 34 | } 35 | 36 | override func updateSelectedState(isSelected: Bool, animated: Bool) { 37 | super.updateSelectedState(isSelected: isSelected, animated: animated) 38 | numberLb.text = String(photoAsset.selectIndex + 1) 39 | selectedMaskView.isHidden = !isSelected 40 | } 41 | 42 | override func layoutView() { 43 | super.layoutView() 44 | selectedMaskView.frame = bounds 45 | numberLb.frame = selectedMaskView.bounds 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /Example/Example.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.device.audio-input 8 | 9 | com.apple.security.device.camera 10 | 11 | com.apple.security.network.client 12 | 13 | com.apple.security.personal-information.location 14 | 15 | com.apple.security.personal-information.photos-library 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/camera_overturn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "camera_overturn@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "camera_overturn@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_compose_delete.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_compose_delete@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_compose_delete@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_photo_edit_tools_clip@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_photo_edit_tools_clip@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_photo_edit_tools_emoji@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_photo_edit_tools_emoji@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_photo_edit_tools_graffiti@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_photo_edit_tools_graffiti@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_photo_edit_tools_mosaic@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_photo_edit_tools_mosaic@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_photo_edit_tools_text@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_photo_edit_tools_text@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_picker_add_img@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_picker_add_img@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_picker_cell_video_play@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_picker_cell_video_play@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "hx_sticker_cover@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "hx_sticker_cover@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/select_photo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "select_photo@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "select_photo@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@2x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@3x.png -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/wx_head_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "wx_head_icon@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/Resources/Assets.xcassets/wx_head_icon.imageset/wx_head_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/wx_head_icon.imageset/wx_head_icon@2x.png -------------------------------------------------------------------------------- /Example/Resources/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_chongya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_chongya.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_haoxinqing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_haoxinqing.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_housailei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_housailei.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_jintianfenkeai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_jintianfenkeai.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_keaibiaoq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_keaibiaoq.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_kehaixing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_kehaixing.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_saihong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_saihong.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_wow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_wow.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_woxiangfazipai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_woxiangfazipai.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_xiaochuzhujiao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_xiaochuzhujiao.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_yuanqimanman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_yuanqimanman.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_yuanqishaonv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_yuanqishaonv.png -------------------------------------------------------------------------------- /Example/Resources/Images/hx_sticker_zaizaijia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_zaizaijia.png -------------------------------------------------------------------------------- /Example/Resources/Images/livephoto_image.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/livephoto_image.jpeg -------------------------------------------------------------------------------- /Example/Resources/Images/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/love.png -------------------------------------------------------------------------------- /Example/Resources/Images/love_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/love_text.png -------------------------------------------------------------------------------- /Example/Resources/Images/picker_example_gif_image.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/picker_example_gif_image.GIF -------------------------------------------------------------------------------- /Example/Resources/Images/picker_example_image.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/picker_example_image.JPG -------------------------------------------------------------------------------- /Example/Resources/Images/portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/portrait.png -------------------------------------------------------------------------------- /Example/Resources/Images/qiy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/qiy.png -------------------------------------------------------------------------------- /Example/Resources/Images/stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/stars.png -------------------------------------------------------------------------------- /Example/Resources/Images/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/text.png -------------------------------------------------------------------------------- /Example/Resources/Music/世间美好与你环环相扣: -------------------------------------------------------------------------------- 1 | [ti:世间美好与你环环相扣] 2 | [ar:妮达Anita] 3 | [al:妮达COVER片段合辑] 4 | [t_time:(00:31)] 5 | [00:02.44]此时已莺飞草长爱的人正在路上 6 | [00:06.502]我知他风雨兼程途经日暮不赏 7 | [00:10.510]穿越人海只为与你相拥 8 | [00:16.53]此刻已皓月当空爱的人手捧星光 9 | [00:20.530]我知他乘风破浪去了黑暗一趟 10 | [00:24.538]感同身受给你救赎热望 11 | -------------------------------------------------------------------------------- /Example/Resources/Music/世间美好与你环环相扣.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/世间美好与你环环相扣.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/嘉宾: -------------------------------------------------------------------------------- 1 | [ti:嘉宾] 2 | [t_time:(00:55)] 3 | [00:00.000]感谢你特别邀请 4 | [00:03.000]来见证你的爱情 5 | [00:06.341]我时刻提醒自己 别逃避 6 | [00:11.727]拿着喜帖一步一步走近 7 | [00:15.951]他精心布置的场地 8 | [00:19.680]可惜这是属于你的风景 9 | [00:23.450]而我只是嘉宾 10 | [00:25.982]我放下所有回忆 11 | [00:28.820]来成全你的爱情 12 | [00:32.179]却始终不愿相信 这是命 13 | [00:38.191]好久不见的你有点疏离 14 | [00:42.080]握手寒暄如此客气 15 | [00:45.250]何必要在他的面前刻意 16 | [00:49.020]隐瞒我的世界 有过你 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Example/Resources/Music/嘉宾.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/嘉宾.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/天外来物: -------------------------------------------------------------------------------- 1 | [ti:天外来物] 2 | [t_time:(00:38)] 3 | [00:00.000]你像 天外来物一样 求之不得 4 | [00:07.689]你在世俗里的名字 不重要了 5 | [00:14.689]正好 我隐藏的人格是契而不舍 6 | [00:21.689]直到蜂拥而至的人都透明了 7 | [00:28.689]我在 不近又不远处 8 | [00:33.189]用明天换你 靠近我 9 | -------------------------------------------------------------------------------- /Example/Resources/Music/天外来物.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/天外来物.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/少女的祈祷: -------------------------------------------------------------------------------- 1 | [ar:杨千嬅] 2 | [ti:少女的祈祷] 3 | [t_time:(00:34)] 4 | [00:00.000]祈求天地放过一双恋人 5 | [00:03.500]怕发生的永远别发生 6 | [00:07.959]从来未顺利遇上好景降临 7 | [00:12.200]如何能重拾信心 8 | [00:16.000]祈求天父做十分钟好人 9 | [00:19.600]赐我他的吻 如怜悯罪人 10 | [00:23.750]我爱主 同时亦爱一位世人 11 | [00:27.950]祈求沿途未变心 请给我护荫 12 | -------------------------------------------------------------------------------- /Example/Resources/Music/少女的祈祷.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/少女的祈祷.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/无赖: -------------------------------------------------------------------------------- 1 | [ar:郑中基] 2 | [ti:无赖] 3 | [t_time:(00:38)] 4 | [00:00.00]为何还喜欢我我这种无赖 5 | [00:05.90]是话你蠢还是很伟大 6 | [00:10.00]在座每位都将我踩 7 | [00:12.00]口碑有多坏 8 | [00:15.00]但你亦永远不见怪 9 | [00:18.870]何必跟我我这种无赖 10 | [00:23.00]活大半生还是很失败 11 | [00:27.80]但是你死都不变心 12 | [00:30.00]跟我笑着挨 13 | [00:32.00]换转别个也不忍心偷偷作怪 14 | -------------------------------------------------------------------------------- /Example/Resources/Music/无赖.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/无赖.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/时光正好: -------------------------------------------------------------------------------- 1 | [ar:郁可唯] 2 | [ti:时光正好] 3 | [t_time:(00:34)] 4 | [00:00.000]我爱你啊 5 | [00:03.000]很想念很感谢有你的夏天 6 | [00:08.000]没有人说谎啊 7 | [00:11.000]可时间会擦掉承诺的话 8 | [00:15.300]很爱你啊 9 | [00:18.200]以沉默以眼泪以正好时光 10 | [00:23.300]我站在那年那夜那一天 11 | [00:29.100]你不来我不老 12 | -------------------------------------------------------------------------------- /Example/Resources/Music/时光正好.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/时光正好.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/爱你: -------------------------------------------------------------------------------- 1 | [ti:爱你] 2 | [ar:团子] 3 | [t_time:(00:52)] 4 | [00:00.482]如果 你突然打了个喷嚏 5 | [00:04.245]那 一定就是我在想你 6 | [00:06.998]如果半夜被手机吵醒 7 | [00:09.505]啊 那是因为我关心 8 | [00:11.763]常常想你说的话 9 | [00:14.771]是不是别有用心 10 | [00:17.530]明明很想相信 11 | [00:19.785]却又忍不住怀疑 12 | [00:22.544]在你的心里 13 | [00:24.802]我是否就是唯一 14 | [00:27.309]爱就是有我常烦着你 15 | [00:31.575]so baby 情话多说一点 16 | [00:34.584]想我就多看一眼 17 | [00:37.344]表现多一点点 18 | [00:39.099]让我能真的看见 19 | [00:42.107]oh bye 少说一点 20 | [00:44.364]想陪你不只一天 21 | [00:46.873]多一点让我心甘情愿 22 | [00:50.385]爱你 23 | -------------------------------------------------------------------------------- /Example/Resources/Music/爱你.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/爱你.mp3 -------------------------------------------------------------------------------- /Example/Resources/Music/野孩子: -------------------------------------------------------------------------------- 1 | [ar:杨千嬅] 2 | [ti:野孩子] 3 | [t_time:(00:36)] 4 | [00:00.000]明知爱这种男孩子 5 | [00:03.000]也许只能如此 6 | [00:05.500]但我会成为你最牵挂的一个女子 7 | [00:09.400]朝朝暮暮让你猜想如何驯服我 8 | [00:13.000]若果亲手抱住 9 | [00:15.000]或者不必如此 10 | [00:17.600]许多旁人说我不太明了男孩子 11 | [00:21.500]不受命令就是一种最坏名字 12 | [00:25.200]笑我这个毫无办法管束的野孩子 13 | [00:31.000]连没有幸福都不介意 14 | -------------------------------------------------------------------------------- /Example/Resources/Music/野孩子.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/野孩子.mp3 -------------------------------------------------------------------------------- /Example/Resources/Video/livephoto_video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Video/livephoto_video.mp4 -------------------------------------------------------------------------------- /HXPHPicker.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HXPHPicker.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /HXPHPicker.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /HXPHPicker.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /HXPHPicker.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 silence 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Kingfisher", 6 | "repositoryURL": "https://github.com/onevcat/Kingfisher.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "3f6992b5cd3143e83b02300ea59c400d4cf0747a", 10 | "version": "7.8.0" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "HXPHPicker", 8 | platforms: [.iOS(.v12)], 9 | products: [ 10 | // Products define the executables and libraries a package produces, and make them visible to other packages. 11 | .library( 12 | name: "HXPHPicker", 13 | targets: ["HXPHPicker"]), 14 | ], 15 | dependencies: [ 16 | // Dependencies declare other packages that this package depends on. 17 | // .package(url: /* package url */, from: "1.0.0"), 18 | .package(url: "https://github.com/onevcat/Kingfisher.git", from: "7.0.0"), 19 | ], 20 | targets: [ 21 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 22 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 23 | .target( 24 | name: "HXPHPicker", 25 | dependencies: ["Kingfisher"], 26 | resources: [ 27 | .process("Resources") 28 | ], 29 | swiftSettings: [ 30 | .define("HXPICKER_ENABLE_SPM"), 31 | .define("HXPICKER_ENABLE_PICKER"), 32 | .define("HXPICKER_ENABLE_EDITOR"), 33 | .define("HXPICKER_ENABLE_CAMERA") 34 | ]), 35 | ] 36 | ) 37 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | platform :ios, '12.0' 3 | 4 | install! 'cocoapods', 5 | #:deterministic_uuids=>false, 6 | disable_input_output_paths: true, 7 | warn_for_unused_master_specs_repo: false 8 | 9 | use_frameworks! 10 | 11 | target 'Example' do 12 | # 包含所有功能,网络图片使用的是 'Kingfisher', '~> 7.0' 13 | pod 'HXPHPicker', :path => './' 14 | 15 | pod 'GDPerformanceView-Swift' 16 | 17 | # pod 'SwiftLint' // ${PODS_ROOT}/SwiftLint/swiftlint 18 | # pod 'GPUImage' 19 | end 20 | 21 | #post_install do |installer| 22 | # installer.pods_project.targets.each do |target| 23 | # if target.name == 'Pods-Example' 24 | ## Pod::UI.puts "'target':#{target}" 25 | # target.build_configurations.each do |config| 26 | # config.build_settings['MACH_O_TYPE'] = 'mh_dylib' 27 | # end 28 | # end 29 | # end 30 | #end 31 | 32 | # https://github.com/CocoaPods/CocoaPods/issues/11402 33 | post_install do |installer| 34 | installer.pods_project.targets.each do |target| 35 | if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle" 36 | target.build_configurations.each do |config| 37 | config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' 38 | end 39 | end 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - GDPerformanceView-Swift (2.1.1) 3 | - HXPHPicker (2.0.0): 4 | - HXPHPicker/Full (= 2.0.0) 5 | - HXPHPicker/Camera (2.0.0): 6 | - HXPHPicker/Camera/Lite (= 2.0.0) 7 | - HXPHPicker/Camera/Location (= 2.0.0) 8 | - HXPHPicker/Camera/Lite (2.0.0): 9 | - HXPHPicker/Core 10 | - HXPHPicker/Camera/Location (2.0.0): 11 | - HXPHPicker/Camera/Lite 12 | - HXPHPicker/Core (2.0.0) 13 | - HXPHPicker/Editor (2.0.0): 14 | - HXPHPicker/Editor/KF (= 2.0.0) 15 | - HXPHPicker/Editor/Lite (= 2.0.0) 16 | - HXPHPicker/Editor/KF (2.0.0): 17 | - HXPHPicker/Editor/Lite 18 | - HXPHPicker/EditorView/KF 19 | - Kingfisher (~> 7.0) 20 | - HXPHPicker/Editor/Lite (2.0.0): 21 | - HXPHPicker/EditorView/Lite 22 | - HXPHPicker/EditorView/KF (2.0.0): 23 | - HXPHPicker/EditorView/Lite 24 | - Kingfisher (~> 7.0) 25 | - HXPHPicker/EditorView/Lite (2.0.0): 26 | - HXPHPicker/Core 27 | - HXPHPicker/Full (2.0.0): 28 | - HXPHPicker/Camera 29 | - HXPHPicker/Editor 30 | - HXPHPicker/Picker 31 | - HXPHPicker/Picker (2.0.0): 32 | - HXPHPicker/Picker/KF (= 2.0.0) 33 | - HXPHPicker/Picker/Lite (= 2.0.0) 34 | - HXPHPicker/Picker/KF (2.0.0): 35 | - HXPHPicker/Picker/Lite 36 | - Kingfisher (~> 7.0) 37 | - HXPHPicker/Picker/Lite (2.0.0): 38 | - HXPHPicker/Core 39 | - Kingfisher (7.6.2) 40 | 41 | DEPENDENCIES: 42 | - GDPerformanceView-Swift 43 | - HXPHPicker (from `./`) 44 | 45 | SPEC REPOS: 46 | https://github.com/CocoaPods/Specs.git: 47 | - GDPerformanceView-Swift 48 | - Kingfisher 49 | 50 | EXTERNAL SOURCES: 51 | HXPHPicker: 52 | :path: "./" 53 | 54 | SPEC CHECKSUMS: 55 | GDPerformanceView-Swift: 22d964fe40b19e3d914dba2586237d064de8fd77 56 | HXPHPicker: 4fdbc2c27e0ca43a8f2c0060e128dfead5255594 57 | Kingfisher: 6c5449c6450c5239166510ba04afe374a98afc4f 58 | 59 | PODFILE CHECKSUM: 022685221be8605f1ae599c42b709a8786891c1b 60 | 61 | COCOAPODS: 1.12.1 62 | -------------------------------------------------------------------------------- /Pods/GDPerformanceView-Swift/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Gavrilov Daniil 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/Kingfisher/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Wei Wang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/Kingfisher/Sources/Utility/Box.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Box.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 2018/3/17. 6 | // Copyright (c) 2019 Wei Wang 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | 26 | import Foundation 27 | 28 | class Box { 29 | var value: T 30 | 31 | init(_ value: T) { 32 | self.value = value 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Pods/Kingfisher/Sources/Utility/Runtime.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Runtime.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 2018/10/12. 6 | // 7 | // Copyright (c) 2019 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | 29 | func getAssociatedObject(_ object: Any, _ key: UnsafeRawPointer) -> T? { 30 | return objc_getAssociatedObject(object, key) as? T 31 | } 32 | 33 | func setRetainedAssociatedObject(_ object: Any, _ key: UnsafeRawPointer, _ value: T) { 34 | objc_setAssociatedObject(object, key, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 35 | } 36 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - GDPerformanceView-Swift (2.1.1) 3 | - HXPHPicker (2.0.0): 4 | - HXPHPicker/Full (= 2.0.0) 5 | - HXPHPicker/Camera (2.0.0): 6 | - HXPHPicker/Camera/Lite (= 2.0.0) 7 | - HXPHPicker/Camera/Location (= 2.0.0) 8 | - HXPHPicker/Camera/Lite (2.0.0): 9 | - HXPHPicker/Core 10 | - HXPHPicker/Camera/Location (2.0.0): 11 | - HXPHPicker/Camera/Lite 12 | - HXPHPicker/Core (2.0.0) 13 | - HXPHPicker/Editor (2.0.0): 14 | - HXPHPicker/Editor/KF (= 2.0.0) 15 | - HXPHPicker/Editor/Lite (= 2.0.0) 16 | - HXPHPicker/Editor/KF (2.0.0): 17 | - HXPHPicker/Editor/Lite 18 | - HXPHPicker/EditorView/KF 19 | - Kingfisher (~> 7.0) 20 | - HXPHPicker/Editor/Lite (2.0.0): 21 | - HXPHPicker/EditorView/Lite 22 | - HXPHPicker/EditorView/KF (2.0.0): 23 | - HXPHPicker/EditorView/Lite 24 | - Kingfisher (~> 7.0) 25 | - HXPHPicker/EditorView/Lite (2.0.0): 26 | - HXPHPicker/Core 27 | - HXPHPicker/Full (2.0.0): 28 | - HXPHPicker/Camera 29 | - HXPHPicker/Editor 30 | - HXPHPicker/Picker 31 | - HXPHPicker/Picker (2.0.0): 32 | - HXPHPicker/Picker/KF (= 2.0.0) 33 | - HXPHPicker/Picker/Lite (= 2.0.0) 34 | - HXPHPicker/Picker/KF (2.0.0): 35 | - HXPHPicker/Picker/Lite 36 | - Kingfisher (~> 7.0) 37 | - HXPHPicker/Picker/Lite (2.0.0): 38 | - HXPHPicker/Core 39 | - Kingfisher (7.6.2) 40 | 41 | DEPENDENCIES: 42 | - GDPerformanceView-Swift 43 | - HXPHPicker (from `./`) 44 | 45 | SPEC REPOS: 46 | https://github.com/CocoaPods/Specs.git: 47 | - GDPerformanceView-Swift 48 | - Kingfisher 49 | 50 | EXTERNAL SOURCES: 51 | HXPHPicker: 52 | :path: "./" 53 | 54 | SPEC CHECKSUMS: 55 | GDPerformanceView-Swift: 22d964fe40b19e3d914dba2586237d064de8fd77 56 | HXPHPicker: 4fdbc2c27e0ca43a8f2c0060e128dfead5255594 57 | Kingfisher: 6c5449c6450c5239166510ba04afe374a98afc4f 58 | 59 | PODFILE CHECKSUM: 022685221be8605f1ae599c42b709a8786891c1b 60 | 61 | COCOAPODS: 1.12.1 62 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_GDPerformanceView_Swift : NSObject 3 | @end 4 | @implementation PodsDummy_GDPerformanceView_Swift 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double GDPerformanceView_SwiftVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char GDPerformanceView_SwiftVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "QuartzCore" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/GDPerformanceView-Swift 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.modulemap: -------------------------------------------------------------------------------- 1 | framework module GDPerformanceView_Swift { 2 | umbrella header "GDPerformanceView-Swift-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "QuartzCore" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/GDPerformanceView-Swift 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_HXPHPicker : NSObject 3 | @end 4 | @implementation PodsDummy_HXPHPicker 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double HXPHPickerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char HXPHPickerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 11 | PODS_ROOT = ${SRCROOT} 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/.. 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 15 | SKIP_INSTALL = YES 16 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = HXPICKER_ENABLE_CAMERA HXPICKER_ENABLE_CAMERA_LOCATION HXPICKER_ENABLE_EDITOR HXPICKER_ENABLE_EDITOR_VIEW HXPICKER_ENABLE_PICKER 17 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker.modulemap: -------------------------------------------------------------------------------- 1 | framework module HXPHPicker { 2 | umbrella header "HXPHPicker-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/HXPHPicker/HXPHPicker.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 11 | PODS_ROOT = ${SRCROOT} 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/.. 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 15 | SKIP_INSTALL = YES 16 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = HXPICKER_ENABLE_CAMERA HXPICKER_ENABLE_CAMERA_LOCATION HXPICKER_ENABLE_EDITOR HXPICKER_ENABLE_EDITOR_VIEW HXPICKER_ENABLE_PICKER 17 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 7.6.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Kingfisher : NSObject 3 | @end 4 | @implementation PodsDummy_Kingfisher 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double KingfisherVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char KingfisherVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -weak_framework "Combine" -weak_framework "SwiftUI" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher.modulemap: -------------------------------------------------------------------------------- 1 | framework module Kingfisher { 2 | umbrella header "Kingfisher-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Kingfisher/Kingfisher.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -weak_framework "Combine" -weak_framework "SwiftUI" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift/GDPerformanceView_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker/HXPHPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -framework "Foundation" -framework "GDPerformanceView_Swift" -framework "HXPHPicker" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Example { 2 | umbrella header "Pods-Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift/GDPerformanceView_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker/HXPHPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CFNetwork" -framework "Foundation" -framework "GDPerformanceView_Swift" -framework "HXPHPicker" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Camera+Location/CameraViewController+Location.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CameraViewController+Location.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/9/1. 6 | // 7 | 8 | #if HXPICKER_ENABLE_CAMERA_LOCATION 9 | import UIKit 10 | import CoreLocation 11 | 12 | extension CameraViewController: CLLocationManagerDelegate { 13 | 14 | var allowLocation: Bool { 15 | let whenIn = Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil 16 | let always = Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil 17 | return config.allowLocation && (whenIn || always) 18 | } 19 | 20 | func startLocation() { 21 | if !allowLocation { return } 22 | if CLLocationManager.authorizationStatus() != .denied { 23 | locationManager.startUpdatingLocation() 24 | didLocation = true 25 | } 26 | } 27 | 28 | public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 29 | if !locations.isEmpty { 30 | currentLocation = locations.last 31 | } 32 | } 33 | } 34 | #endif 35 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Camera/Controller/CameraViewController+Editor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CameraViewController+Editor.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/31. 6 | // 7 | 8 | import UIKit 9 | 10 | #if HXPICKER_ENABLE_EDITOR 11 | extension CameraViewController: EditorViewControllerDelegate { 12 | public func editorViewController(_ editorViewController: EditorViewController, didFinish asset: EditorAsset) { 13 | guard let result = asset.result else { 14 | if let image = asset.type.image { 15 | didFinish(withImage: image) 16 | } 17 | if let videoURL = asset.type.videoURL { 18 | didFinish(withVideo: videoURL) 19 | } 20 | return 21 | } 22 | switch result { 23 | case .image(let editedResult, _): 24 | if let image = UIImage(contentsOfFile: editedResult.url.path) { 25 | didFinish(withImage: image) 26 | } 27 | case .video(let editedResult, _): 28 | didFinish(withVideo: editedResult.url) 29 | } 30 | } 31 | } 32 | extension CameraViewController{ 33 | func openPhotoEditor(_ image: UIImage) { 34 | config.editor.isAutoBack = autoDismiss 35 | let vc = EditorViewController( 36 | .init(type: .image(image)), 37 | config: config.editor, 38 | delegate: self 39 | ) 40 | navigationController?.pushViewController(vc, animated: false) 41 | } 42 | } 43 | extension CameraViewController { 44 | func openVideoEditor(_ videoURL: URL) { 45 | config.editor.isAutoBack = autoDismiss 46 | let vc = EditorViewController( 47 | .init(type: .video(videoURL)), 48 | config: config.editor, 49 | delegate: self 50 | ) 51 | navigationController?.pushViewController(vc, animated: false) 52 | } 53 | } 54 | #endif 55 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Camera/Controller/CameraViewController+Preview.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CameraViewController+Preview.swift 3 | // CameraViewController+Preview 4 | // 5 | // Created by Slience on 2021/10/19. 6 | // 7 | 8 | import UIKit 9 | 10 | extension CameraViewController: CameraPreviewViewDelegate { 11 | func previewView(didPreviewing previewView: CameraPreviewView) { 12 | bottomView.hiddenTip() 13 | if !config.videoFilters.isEmpty && firstShowFilterName && cameraManager.filterIndex > 0 { 14 | if config.changeFilterShowName { 15 | previewView.showFilterName( 16 | cameraManager.videoFilter.currentFilterName, 17 | true 18 | ) 19 | } 20 | firstShowFilterName = false 21 | } 22 | bottomView.isGestureEnable = true 23 | } 24 | func previewView(_ previewView: CameraPreviewView, pinchGestureScale scale: CGFloat) { 25 | cameraManager.zoomFacto = scale 26 | } 27 | 28 | func previewView(_ previewView: CameraPreviewView, tappedToFocusAt point: CGPoint) { 29 | try? cameraManager.expose(at: point) 30 | } 31 | 32 | func previewView(didLeftSwipe previewView: CameraPreviewView) { 33 | if !config.videoFilters.isEmpty { 34 | cameraManager.filterIndex += 1 35 | if config.changeFilterShowName { 36 | previewView.showFilterName( 37 | cameraManager.videoFilter.currentFilterName, 38 | false 39 | ) 40 | } 41 | } 42 | } 43 | 44 | func previewView(didRightSwipe previewView: CameraPreviewView) { 45 | if !config.videoFilters.isEmpty { 46 | cameraManager.filterIndex -= 1 47 | if config.changeFilterShowName { 48 | previewView.showFilterName( 49 | cameraManager.videoFilter.currentFilterName, 50 | true 51 | ) 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Camera/View/PassThrough.metal: -------------------------------------------------------------------------------- 1 | /* 2 | See LICENSE folder for this sample’s licensing information. 3 | 4 | Abstract: 5 | Pass-through shader (used for preview). 6 | */ 7 | 8 | #include 9 | using namespace metal; 10 | 11 | // Vertex input/output structure for passing results from vertex shader to fragment shader 12 | struct VertexIO 13 | { 14 | float4 position [[position]]; 15 | float2 textureCoord [[user(texturecoord)]]; 16 | }; 17 | 18 | // Vertex shader for a textured quad 19 | vertex VertexIO vertexPassThrough(const device packed_float4 *pPosition [[ buffer(0) ]], 20 | const device packed_float2 *pTexCoords [[ buffer(1) ]], 21 | uint vid [[ vertex_id ]]) 22 | { 23 | VertexIO outVertex; 24 | 25 | outVertex.position = pPosition[vid]; 26 | outVertex.textureCoord = pTexCoords[vid]; 27 | 28 | return outVertex; 29 | } 30 | 31 | // Fragment shader for a textured quad 32 | fragment half4 fragmentPassThrough(VertexIO inputFragment [[ stage_in ]], 33 | texture2d inputTexture [[ texture(0) ]], 34 | sampler samplr [[ sampler(0) ]]) 35 | { 36 | return inputTexture.sample(samplr, inputFragment.textureCoord); 37 | } 38 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Config/SelectBoxConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SelectBoxConfiguration.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Slience on 2020/12/29. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: 选择框配置类 12 | public struct SelectBoxConfiguration { 13 | 14 | /// 选择框的大小 15 | public var size: CGSize = CGSize(width: 25, height: 25) 16 | 17 | /// 选择框的样式 18 | public var style: SelectBoxView.Style = .number 19 | 20 | /// 标题的文字大小 21 | public var titleFontSize: CGFloat = 16 22 | 23 | /// 选中之后的 标题 颜色 24 | public var titleColor: UIColor = .white 25 | 26 | /// 暗黑风格下选中之后的 标题 颜色 27 | public var titleDarkColor: UIColor = .white 28 | 29 | /// 选中状态下勾勾的宽度 30 | public var tickWidth: CGFloat = 1.5 31 | 32 | /// 选中之后的 勾勾 颜色 33 | public var tickColor: UIColor = .white 34 | 35 | /// 暗黑风格下选中之后的 勾勾 颜色 36 | public var tickDarkColor: UIColor = .white 37 | 38 | /// 未选中时框框中间的颜色 39 | public var backgroundColor: UIColor = .black.withAlphaComponent(0.4) 40 | 41 | /// 暗黑风格下未选中时框框中间的颜色 42 | public var darkBackgroundColor: UIColor = .black.withAlphaComponent(0.4) 43 | 44 | /// 选中之后的背景颜色 45 | public var selectedBackgroundColor: UIColor = HXPickerWrapper.systemTintColor 46 | 47 | /// 暗黑风格下选中之后的背景颜色 48 | public var selectedBackgroudDarkColor: UIColor = HXPickerWrapper.systemTintColor 49 | 50 | /// 未选中时的边框宽度 51 | public var borderWidth: CGFloat = 1.5 52 | 53 | /// 未选中时的边框颜色 54 | public var borderColor: UIColor = .white 55 | 56 | /// 暗黑风格下未选中时的边框颜色 57 | public var borderDarkColor: UIColor = .white 58 | 59 | public init() { } 60 | } 61 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+Bundle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+Bundle.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Silence on 2020/11/15. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension Bundle { 12 | 13 | static func localizedString(for key: String) -> String { 14 | return localizedString(for: key, value: nil) 15 | } 16 | 17 | static func localizedString(for key: String, value: String?) -> String { 18 | let bundle = PhotoManager.shared.languageBundle 19 | var newValue = bundle?.localizedString(forKey: key, value: value, table: nil) 20 | if newValue == nil { 21 | newValue = key 22 | } 23 | return newValue! 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+CALayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+CALayer.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/7/14. 6 | // 7 | 8 | import UIKit 9 | 10 | extension CALayer { 11 | func convertedToImage( 12 | size: CGSize = .zero, 13 | scale: CGFloat = UIScreen.main.scale 14 | ) -> UIImage? { 15 | var toSize: CGSize 16 | if size.equalTo(.zero) { 17 | toSize = frame.size 18 | }else { 19 | toSize = size 20 | } 21 | UIGraphicsBeginImageContextWithOptions(toSize, false, scale) 22 | guard let context = UIGraphicsGetCurrentContext() else { 23 | return nil 24 | } 25 | render(in: context) 26 | let image = UIGraphicsGetImageFromCurrentImageContext() 27 | UIGraphicsEndImageContext() 28 | return image 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+CGFloat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+CGFloat.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2023/1/31. 6 | // 7 | 8 | import Foundation 9 | 10 | extension CGFloat { 11 | 12 | static var max: CGFloat { 13 | CGFloat(MAXFLOAT) 14 | } 15 | 16 | var compressionQuality: CGFloat { 17 | if self > 30000000 { 18 | return 30000000 / self 19 | }else if self > 15000000 { 20 | return 10000000 / self 21 | }else if self > 10000000 { 22 | return 6000000 / self 23 | }else { 24 | return 3000000 / self 25 | } 26 | } 27 | 28 | var transitionCompressionQuality: CGFloat { 29 | if self > 6000000 { 30 | return 3000000 / self 31 | }else if self > 3000000 { 32 | return 1000000 / self 33 | }else if self > 1000000 { 34 | return 600000 / self 35 | }else { 36 | return 1000000 / self 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+Data.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+Data.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/5/20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Data { 11 | 12 | var imageContentType: ImageContentType { 13 | var values = [UInt8](repeating: 0, count: 1) 14 | copyBytes(to: &values, count: 1) 15 | switch values[0] { 16 | case 0xFF: 17 | return .jpg 18 | case 0x89: 19 | return .png 20 | case 0x47, 0x49, 0x46: 21 | return .gif 22 | default: 23 | return .unknown 24 | } 25 | } 26 | 27 | var isGif: Bool { 28 | imageContentType == .gif 29 | } 30 | 31 | 32 | var fileType: FileType { 33 | guard let firstByte = first else { 34 | return .unknown 35 | } 36 | switch firstByte { 37 | case 0xFF: 38 | return .image 39 | case 0x25: 40 | return .auido 41 | case 0x00: 42 | return .video 43 | default: 44 | return .unknown 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+Dictionary.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+Dictionary.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import Photos 9 | 10 | extension Dictionary { 11 | 12 | /// 资源是否存在iCloud上 13 | var inICloud: Bool { 14 | if let isICloud = self[AnyHashable(PHImageResultIsInCloudKey) as! Key] as? Int { 15 | return isICloud == 1 16 | } 17 | return false 18 | } 19 | 20 | /// 资源是否取消了下载 21 | var isCancel: Bool { 22 | if let isCancel = self[AnyHashable(PHImageCancelledKey) as! Key] as? Int { 23 | return isCancel == 1 24 | } 25 | return false 26 | } 27 | var error: Error? { 28 | self[AnyHashable(PHImageErrorKey) as! Key] as? Error 29 | } 30 | /// 判断资源是否下载错误 31 | var isError: Bool { 32 | self[AnyHashable(PHImageErrorKey) as! Key] != nil 33 | } 34 | 35 | /// 判断资源下载得到的是否为退化的 36 | var isDegraded: Bool { 37 | if let isDegraded = self[AnyHashable(PHImageResultIsDegradedKey) as! Key] as? Int { 38 | return isDegraded == 1 39 | } 40 | return false 41 | } 42 | 43 | /// 判断资源是否下载完成 44 | var downloadFinined: Bool { 45 | !isCancel && !isError && !isDegraded 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+DispatchQueue.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+DispatchQueue.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/5/14. 6 | // 7 | 8 | import Foundation 9 | 10 | extension DispatchQueue { 11 | // 注意此方法为 static 12 | private static var token: DispatchSpecificKey<()> = { 13 | // 初始化一个 key 14 | let key = DispatchSpecificKey<()>() 15 | // 在主队列上关联一个空元组 16 | DispatchQueue.main.setSpecific(key: key, value: ()) 17 | return key 18 | }() 19 | 20 | // 通过队列上是否有绑定 token 对应的值来判断是否为主队列 21 | static var isMain: Bool { 22 | return DispatchQueue.getSpecific(key: token) != nil 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+FileManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+FileManager.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2022/10/1. 6 | // 7 | 8 | import Foundation 9 | 10 | extension FileManager: HXPickerCompatible { 11 | class var documentPath: String { 12 | NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last ?? "" 13 | } 14 | class var cachesPath: String { 15 | NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last ?? "" 16 | } 17 | class var tempPath: String { 18 | NSTemporaryDirectory() 19 | } 20 | } 21 | 22 | public extension HXPickerWrapper where Base: FileManager { 23 | static var documentPath: String { 24 | Base.documentPath 25 | } 26 | static var cachesPath: String { 27 | Base.cachesPath 28 | } 29 | static var tempPath: String { 30 | Base.tempPath 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+PHAssetCollection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+PHAssetCollection.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | extension PHAssetCollection: HXPickerCompatible { 12 | 13 | /// 是否相机胶卷 14 | var isCameraRoll: Bool { 15 | var versionStr = UIDevice.current.systemVersion.replacingOccurrences(of: ".", with: "") 16 | if versionStr.count <= 1 { 17 | versionStr.append("00") 18 | }else if versionStr.count <= 2 { 19 | versionStr.append("0") 20 | } 21 | let version = Int(versionStr) ?? 0 22 | if version >= 800 && version <= 802 { 23 | return assetCollectionSubtype == .smartAlbumRecentlyAdded 24 | }else { 25 | return assetCollectionSubtype == .smartAlbumUserLibrary 26 | } 27 | } 28 | } 29 | 30 | public extension HXPickerWrapper where Base: PHAssetCollection { 31 | var isCameraRoll: Bool { 32 | base.isCameraRoll 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+UIApplication.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UIApplication.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2022/9/26. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIApplication { 11 | class var _keyWindow: UIWindow? { 12 | var window: UIWindow? 13 | if #available(iOS 13.0, *) { 14 | window = shared.windows.filter({ $0.isKeyWindow }).last 15 | } else { 16 | window = shared.delegate?.window ?? shared.keyWindow 17 | } 18 | return window 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+UIFont.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UIFont.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Silence on 2020/11/13. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIFont { 12 | 13 | static func regularPingFang(ofSize size: CGFloat) -> UIFont { 14 | let font = UIFont.init(name: "PingFangSC-Regular", size: size) 15 | return font ?? UIFont.systemFont(ofSize: size) 16 | } 17 | 18 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont { 19 | let font = UIFont.init(name: "PingFangSC-Medium", size: size) 20 | return font ?? UIFont.systemFont(ofSize: size) 21 | } 22 | 23 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont { 24 | let font = UIFont.init(name: "PingFangSC-Semibold", size: size) 25 | return font ?? UIFont.systemFont(ofSize: size) 26 | } 27 | } 28 | 29 | public extension HXPickerWrapper where Base == UIFont { 30 | 31 | static func regularPingFang(ofSize size: CGFloat) -> UIFont { 32 | Base.regularPingFang(ofSize: size) 33 | } 34 | 35 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont { 36 | Base.mediumPingFang(ofSize: size) 37 | } 38 | 39 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont { 40 | Base.semiboldPingFang(ofSize: size) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+UIImageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UIImageView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/9. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIImageView { 11 | 12 | func setImage(_ image: UIImage?, duration: CFTimeInterval = 0.2, animated: Bool = true) { 13 | if let image = image { 14 | self.image = image 15 | if animated { 16 | let transition = CATransition() 17 | transition.type = .fade 18 | transition.duration = duration 19 | transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) 20 | layer.add(transition, forKey: nil) 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+UILabel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UILabel.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/10/22. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UILabel { 11 | var textHeight: CGFloat { 12 | text?.height(ofFont: font, maxWidth: width > 0 ? width : .max) ?? 0 13 | } 14 | var textWidth: CGFloat { 15 | text?.width(ofFont: font, maxHeight: height > 0 ? height : .max) ?? 0 16 | } 17 | var textSize: CGSize { 18 | text?.size(ofFont: font, maxWidth: .max, maxHeight: .max) ?? .zero 19 | } 20 | } 21 | 22 | public extension HXPickerWrapper where Base: UILabel { 23 | var textWidth: CGFloat { 24 | base.textWidth 25 | } 26 | var textHeight: CGFloat { 27 | base.textHeight 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+UIViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+UIViewController.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/16. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController: HXPickerCompatible { 11 | 12 | class var topViewController: UIViewController? { 13 | let window = UIApplication._keyWindow 14 | if var topViewController = window?.rootViewController { 15 | while true { 16 | if let controller = topViewController.presentedViewController { 17 | topViewController = controller 18 | }else if let navController = topViewController as? UINavigationController, 19 | let controller = navController.topViewController { 20 | topViewController = controller 21 | }else if let tabbarController = topViewController as? UITabBarController, 22 | let controller = tabbarController.selectedViewController { 23 | topViewController = controller 24 | }else { 25 | break 26 | } 27 | } 28 | return topViewController 29 | } 30 | return nil 31 | } 32 | } 33 | 34 | public extension HXPickerWrapper where Base: UIViewController { 35 | static var topViewController: UIViewController? { 36 | Base.topViewController 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Extension/Core+URL.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Core+URL.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/6/17. 6 | // 7 | 8 | import Foundation 9 | #if canImport(Kingfisher) 10 | import Kingfisher 11 | #endif 12 | 13 | extension URL: HXPickerCompatibleValue { 14 | var isGif: Bool { 15 | absoluteString.hasSuffix("gif") || absoluteString.hasSuffix("GIF") 16 | } 17 | var fileSize: Int { 18 | guard let fileSize = try? resourceValues(forKeys: [.fileSizeKey]) else { 19 | return 0 20 | } 21 | return fileSize.fileSize ?? 0 22 | } 23 | 24 | #if canImport(Kingfisher) 25 | var isCache: Bool { 26 | ImageCache.default.isCached(forKey: cacheKey) 27 | } 28 | #endif 29 | 30 | var fileType: FileType { 31 | guard let fileData = try? Data(contentsOf: self) else { 32 | return .unknown 33 | } 34 | return fileData.fileType 35 | } 36 | } 37 | 38 | 39 | public extension HXPickerWrapper where Base == URL { 40 | #if canImport(Kingfisher) 41 | var isCache: Bool { 42 | base.isCache 43 | } 44 | #endif 45 | } 46 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/AppearanceStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppearanceStyle.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum AppearanceStyle: Int { 11 | /// 跟随系统变化 12 | case varied = 0 13 | /// 正常风格,不会跟随系统变化 14 | case normal = 1 15 | /// 暗黑风格 16 | case dark = 2 17 | } 18 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/CustomLanguage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomLanguage.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import Foundation 9 | 10 | public class CustomLanguage { 11 | /// 语言 12 | /// 会与 Locale.preferredLanguages 进行匹配,匹配成功的才会使用。请确保正确性 13 | public let language: String 14 | /// 语言文件路径 15 | public let path: String 16 | 17 | public init(language: String, 18 | path: String) { 19 | self.language = language 20 | self.path = path 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/ExportPreset.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExportPreset.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/18. 6 | // 7 | 8 | import UIKit 9 | import AVKit 10 | 11 | public struct VideoExportParameter { 12 | /// 视频导出的分辨率 13 | public let preset: ExportPreset 14 | /// 视频质量 [1 - 10] 15 | public let quality: Int 16 | 17 | /// 设置视频导出参数 18 | /// - Parameters: 19 | /// - exportPreset: 视频导出的分辨率 20 | /// - videoQuality: 视频质量 [1 - 10] 21 | public init( 22 | preset: ExportPreset, 23 | quality: Int 24 | ) { 25 | self.preset = preset 26 | self.quality = quality 27 | } 28 | } 29 | 30 | public enum ExportPreset { 31 | case lowQuality 32 | case mediumQuality 33 | case highQuality 34 | case ratio_640x480 35 | case ratio_960x540 36 | case ratio_1280x720 37 | 38 | public var name: String { 39 | switch self { 40 | case .lowQuality: 41 | return AVAssetExportPresetLowQuality 42 | case .mediumQuality: 43 | return AVAssetExportPresetMediumQuality 44 | case .highQuality: 45 | return AVAssetExportPresetHighestQuality 46 | case .ratio_640x480: 47 | return AVAssetExportPreset640x480 48 | case .ratio_960x540: 49 | return AVAssetExportPreset960x540 50 | case .ratio_1280x720: 51 | return AVAssetExportPreset1280x720 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/ImageContentType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageContentType.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/5/21. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum ImageContentType: String { 11 | case jpg, png, gif, unknown 12 | public var fileExtension: String { 13 | return self.rawValue 14 | } 15 | } 16 | 17 | enum FileType: String { 18 | case unknown 19 | case image 20 | case auido 21 | case video 22 | } 23 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/IndicatorType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IndicatorType.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/8. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum IndicatorType { 11 | /// gradient ring 12 | /// 渐变圆环 13 | case circle 14 | /// System chrysanthemum 15 | /// 系统菊花 16 | case system 17 | } 18 | 19 | public protocol IndicatorTypeConfig { 20 | /// Loading indicator type 21 | /// 加载指示器类型 22 | var indicatorType: IndicatorType { get set } 23 | } 24 | 25 | public extension IndicatorTypeConfig { 26 | var indicatorType: IndicatorType { 27 | get { PhotoManager.shared.indicatorType } 28 | set { PhotoManager.shared.indicatorType = newValue } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/LanguageType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LanguageType.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum LanguageType: Int { 11 | /// 跟随系统语言 12 | case system = 0 13 | /// 中文简体 14 | case simplifiedChinese = 1 15 | /// 中文繁体 16 | case traditionalChinese = 2 17 | /// 日文 18 | case japanese = 3 19 | /// 韩文 20 | case korean = 4 21 | /// 英文 22 | case english = 5 23 | /// 泰语 24 | case thai = 6 25 | /// 印尼语 26 | case indonesia = 7 27 | /// 越南语 28 | case vietnamese = 8 29 | /// 俄语 30 | case russian = 9 31 | /// 德语 32 | case german = 10 33 | /// 法语 34 | case french = 11 35 | /// 阿拉伯 36 | case arabic = 12 37 | } 38 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/LivePhotoError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LivePhotoError.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/7. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum LivePhotoError { 11 | case imageError(Error?) 12 | case videoError(Error?) 13 | case allError(Error?, Error?) 14 | } 15 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/Model/PhotoPanGestureRecognizer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPanGestureRecognizer.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/7/1. 6 | // 7 | 8 | import UIKit 9 | 10 | class PhotoPanGestureRecognizer: UIPanGestureRecognizer { 11 | override func touchesBegan(_ touches: Set, with event: UIEvent) { 12 | super.touchesBegan(touches, with: event) 13 | state = .began 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Core/View/VideoPlayerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideoPlayerView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/1/9. 6 | // 7 | 8 | import UIKit 9 | import AVKit 10 | 11 | class VideoPlayerView: UIView { 12 | 13 | override class var layerClass: AnyClass { 14 | return AVPlayerLayer.self 15 | } 16 | 17 | lazy var player: AVPlayer = { 18 | let player = AVPlayer() 19 | return player 20 | }() 21 | var playerLayer: AVPlayerLayer { 22 | return layer as! AVPlayerLayer 23 | } 24 | 25 | var avAsset: AVAsset? 26 | 27 | init() { 28 | super.init(frame: .zero) 29 | } 30 | 31 | required init?(coder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/Extension/EditorView+AVAsset.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorView+AVAsset.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2023/2/25. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | extension AVAsset { 12 | 13 | var videoOrientation: AVCaptureVideoOrientation { 14 | guard let videoTrack = tracks(withMediaType: .video).first else { 15 | return .landscapeRight 16 | } 17 | 18 | let t = videoTrack.preferredTransform 19 | 20 | if (t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0) || 21 | (t.a == 0 && t.b == 1.0 && t.c == 1.0 && t.d == 0) { 22 | return .portrait // 90 23 | } else if (t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0) || 24 | (t.a == 0 && t.b == -1.0 && t.c == -1.0 && t.d == 0) { 25 | return .portraitUpsideDown // 270 26 | } else if t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0 { 27 | return .landscapeRight // 0 28 | } else if t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0 { 29 | return .landscapeLeft // 180 30 | } else { 31 | return .landscapeRight 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/Extension/EditorView+CGFloat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGFloat+EditorView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2023/1/19. 6 | // 7 | 8 | import Foundation 9 | 10 | extension CGFloat { 11 | var angle: CGFloat { 12 | self * (180 / .pi) 13 | } 14 | var radians: CGFloat { 15 | self / 180 * .pi 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/Extension/EditorView+UIView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+EditorView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2023/1/19. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIView { 11 | func color(for point: CGPoint) -> UIColor? { 12 | // 用来存放目标像素值 13 | var pixel = [UInt8](repeatElement(0, count: 4)) 14 | // 颜色空间为 RGB,这决定了输出颜色的编码是 RGB 还是其他(比如 YUV) 15 | let colorSpace = CGColorSpaceCreateDeviceRGB() 16 | // 设置位图颜色分布为 RGBA 17 | let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue 18 | guard let context = CGContext( 19 | data: &pixel, 20 | width: 1, 21 | height: 1, 22 | bitsPerComponent: 8, 23 | bytesPerRow: 4, 24 | space: colorSpace, 25 | bitmapInfo: bitmapInfo 26 | ) else { 27 | return nil 28 | } 29 | // 设置 context 原点偏移为目标位置所有坐标 30 | context.translateBy(x: -point.x, y: -point.y) 31 | // 将图像渲染到 context 中 32 | layer.render(in: context) 33 | 34 | return UIColor(red: CGFloat(pixel[0]) / 255.0, 35 | green: CGFloat(pixel[1]) / 255.0, 36 | blue: CGFloat(pixel[2]) / 255.0, 37 | alpha: CGFloat(pixel[3]) / 255.0) 38 | } 39 | 40 | class func animate( 41 | animations: @escaping () -> Void, 42 | completion: ((Bool) -> Void)? = nil 43 | ) { 44 | animate( 45 | withDuration: 0.3, 46 | delay: 0, 47 | options: [.curveEaseOut, .layoutSubviews], 48 | animations: animations, 49 | completion: completion 50 | ) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/VideoEditedResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideoEditedResult.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/26. 6 | // 7 | 8 | import UIKit 9 | 10 | public struct VideoEditedResult { 11 | 12 | /// 编辑后的视频地址 13 | public var url: URL { 14 | urlConfig.url 15 | } 16 | 17 | public let urlConfig: EditorURLConfig 18 | 19 | /// 编辑后的视频封面 20 | public let coverImage: UIImage? 21 | 22 | /// 编辑后的视频大小 23 | public let fileSize: Int 24 | 25 | /// 视频时长 格式:00:00 26 | public let videoTime: String 27 | 28 | /// 视频时长 秒 29 | public let videoDuration: TimeInterval 30 | 31 | /// 编辑视图的状态 32 | public let data: EditAdjustmentData? 33 | 34 | public init(data: EditAdjustmentData? = nil) { 35 | self.data = data 36 | urlConfig = .empty 37 | coverImage = nil 38 | fileSize = 0 39 | videoTime = "00:00" 40 | videoDuration = 0 41 | } 42 | 43 | init( 44 | urlConfig: EditorURLConfig, 45 | coverImage: UIImage?, 46 | fileSize: Int, 47 | videoTime: String, 48 | videoDuration: TimeInterval, 49 | data: EditAdjustmentData? 50 | ) { 51 | self.urlConfig = urlConfig 52 | self.coverImage = coverImage 53 | self.fileSize = fileSize 54 | self.videoTime = videoTime 55 | self.videoDuration = videoDuration 56 | self.data = data 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/View/EditorFrameView+Control.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorFrameView+Control.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2022/11/13. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorFrameView: EditorControlViewDelegate { 11 | func controlView(beganChanged controlView: EditorControlView, _ rect: CGRect) { 12 | if !controlView.isUserInteractionEnabled { 13 | return 14 | } 15 | hideMaskBgView() 16 | maskLinesView.hideGridGraylinesView(animated: true) 17 | stopControlTimer() 18 | delegate?.frameView(beganChanged: self, rect) 19 | hideVideoSilder(true) 20 | } 21 | 22 | func controlView(didChanged controlView: EditorControlView, _ rect: CGRect) { 23 | if !controlView.isUserInteractionEnabled { 24 | return 25 | } 26 | stopControlTimer() 27 | maskBgView.updateLayers(rect, false) 28 | customMaskView.updateLayers(rect, false) 29 | maskLinesView.updateLayers(rect, false) 30 | updateVideoSlider(to: rect, animated: false) 31 | delegate?.frameView(didChanged: self, rect) 32 | } 33 | 34 | func controlView(endChanged controlView: EditorControlView, _ rect: CGRect) { 35 | if !controlView.isUserInteractionEnabled { 36 | return 37 | } 38 | startControlTimer() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/View/EditorFrameView+VideoPlay.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorFrameView+VideoPlay.swift 3 | // HXPHPicker 4 | // 5 | // Created by 洪欣 on 2023/5/4. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorFrameView: VideoPlaySliderViewDelegate { 11 | 12 | func videoSliderView( 13 | _ videoSliderView: VideoPlaySliderView, 14 | didChangedPlayDuration duration: CGFloat, 15 | state: VideoControlEvent 16 | ) { 17 | delegate?.frameView(self, didChangedPlayTime: duration, for: state) 18 | } 19 | 20 | func videoSliderView( 21 | _ videoSliderView: VideoPlaySliderView, 22 | didPlayButtonClick isSelected: Bool 23 | ) { 24 | delegate?.frameView(self, didPlayButtonClick: isSelected) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/View/EditorView+GestureRecognizer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorView+GestureRecognizer.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2022/11/13. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorView: UIGestureRecognizerDelegate { 11 | 12 | public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 13 | if gestureRecognizer is UIPanGestureRecognizer { 14 | if isDrawEnabled || isMosaicEnabled { 15 | return false 16 | } 17 | } 18 | return true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor+View/View/EditorView+ScrollView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorView+ScrollView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2022/11/13. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorView: UIScrollViewDelegate { 11 | 12 | public func viewForZooming(in scrollView: UIScrollView) -> UIView? { 13 | allowZoom ? adjusterView : nil 14 | } 15 | public func scrollViewDidZoom(_ scrollView: UIScrollView) { 16 | if !allowZoom { 17 | return 18 | } 19 | let viewWidth = scrollView.width - scrollView.contentInset.left - scrollView.contentInset.right 20 | let viewHeight = scrollView.height - scrollView.contentInset.top - scrollView.contentInset.bottom 21 | let offsetX = (viewWidth > scrollView.contentSize.width) ? 22 | (viewWidth - scrollView.contentSize.width) * 0.5 : 0 23 | let offsetY = (viewHeight > scrollView.contentSize.height) ? 24 | (viewHeight - scrollView.contentSize.height) * 0.5 : 0 25 | let centerX = scrollView.contentSize.width * 0.5 + offsetX 26 | let centerY = scrollView.contentSize.height * 0.5 + offsetY 27 | adjusterView.center = CGPoint(x: centerX, y: centerY) 28 | } 29 | public func scrollViewDidEndZooming( 30 | _ scrollView: UIScrollView, 31 | with view: UIView?, 32 | atScale scale: CGFloat 33 | ) { 34 | adjusterView.zoomScale = scale 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/Controller/EditorViewController+Mosaic.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorViewController+Mosaic.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/20. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorViewController: EditorMosaicToolViewDelegate { 11 | func mosaicToolView(_ mosaicToolView: EditorMosaicToolView, didChangedMosaicType type: EditorMosaicType) { 12 | editorView.mosaicType = type 13 | } 14 | 15 | func mosaicToolView(didUndoClick mosaicToolView: EditorMosaicToolView) { 16 | editorView.undoMosaic() 17 | mosaicToolView.canUndo = editorView.isCanUndoMosaic 18 | checkFinishButtonState() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/Controller/EditorViewController+Ratio.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorViewController+Ratio.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/17. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorViewController: EditorRatioToolViewDelegate { 11 | func ratioToolView(_ ratioToolView: EditorRatioToolView, didSelectedRatioAt ratio: CGSize) { 12 | if ratio.width < 0 || ratio.height < 0 { 13 | editorView.isFixedRatio = true 14 | editorView.setAspectRatio(editorView.originalAspectRatio, animated: true) 15 | }else { 16 | if ratio == .zero { 17 | editorView.isFixedRatio = false 18 | }else { 19 | editorView.isFixedRatio = true 20 | editorView.setAspectRatio(ratio, animated: true) 21 | } 22 | } 23 | resetButton.isEnabled = isReset 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/Controller/EditorViewController+Text.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorViewController+Text.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/17. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorViewController: EditorStickerTextViewControllerDelegate { 11 | func stickerTextViewController(_ controller: EditorStickerTextViewController, didFinish stickerText: EditorStickerText) { 12 | deselectedDrawTool() 13 | if let tool = selectedTool, 14 | tool.type == .graffiti || tool.type == .graffiti { 15 | selectedTool = nil 16 | } 17 | editorView.addSticker(stickerText) 18 | checkSelectedTool() 19 | checkFinishButtonState() 20 | } 21 | 22 | func stickerTextViewController( 23 | _ controller: EditorStickerTextViewController, 24 | didFinishUpdate stickerText: EditorStickerText 25 | ) { 26 | deselectedDrawTool() 27 | if let tool = selectedTool, 28 | tool.type == .graffiti || tool.type == .graffiti { 29 | selectedTool = nil 30 | } 31 | editorView.updateSticker(stickerText) 32 | checkSelectedTool() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/Model/EditorChartlet.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorChartlet.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/7/26. 6 | // 7 | 8 | import UIKit 9 | 10 | public typealias EditorTitleChartletResponse = ([EditorChartlet]) -> Void 11 | public typealias EditorChartletListResponse = (Int, [EditorChartlet]) -> Void 12 | 13 | public struct EditorChartlet { 14 | 15 | /// 贴图对应的 UIImage 对象, 视频支持gif 16 | public let image: UIImage? 17 | 18 | public let imageData: Data? 19 | 20 | #if canImport(Kingfisher) 21 | /// 贴图对应的 网络地址(视频支持gif) 22 | public let url: URL? 23 | #endif 24 | 25 | public let ext: Any? 26 | 27 | public init( 28 | image: UIImage?, 29 | imageData: Data? = nil, 30 | ext: Any? = nil 31 | ) { 32 | self.image = image 33 | self.imageData = imageData 34 | self.ext = ext 35 | #if canImport(Kingfisher) 36 | url = nil 37 | #endif 38 | } 39 | 40 | #if canImport(Kingfisher) 41 | public init( 42 | url: URL?, 43 | ext: Any? = nil 44 | ) { 45 | self.url = url 46 | self.ext = ext 47 | image = nil 48 | imageData = nil 49 | } 50 | #endif 51 | } 52 | 53 | class EditorChartletTitle { 54 | 55 | /// 标题图标 对应的 UIImage 数据 56 | let image: UIImage? 57 | 58 | #if canImport(Kingfisher) 59 | /// 标题图标 对应的 网络地址 60 | let url: URL? 61 | #endif 62 | 63 | init(image: UIImage?) { 64 | self.image = image 65 | #if canImport(Kingfisher) 66 | url = nil 67 | #endif 68 | } 69 | 70 | #if canImport(Kingfisher) 71 | init(url: URL?) { 72 | self.url = url 73 | image = nil 74 | } 75 | #endif 76 | 77 | var isSelected = false 78 | var isLoading = false 79 | var isAlbum = false 80 | var chartletList: [EditorChartlet] = [] 81 | } 82 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorBrushBlockView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorBrushBlockView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/10. 6 | // 7 | 8 | import UIKit 9 | 10 | class EditorBrushBlockView: UIView { 11 | 12 | var color: UIColor? { 13 | didSet { 14 | guard let color = color else { 15 | borderLayer.fillColor = UIColor.clear.cgColor 16 | return 17 | } 18 | borderLayer.fillColor = color.cgColor 19 | } 20 | } 21 | 22 | lazy var borderLayer: CAShapeLayer = { 23 | let borderLayer = CAShapeLayer() 24 | borderLayer.strokeColor = UIColor.white.cgColor 25 | borderLayer.fillColor = UIColor.clear.cgColor 26 | borderLayer.lineWidth = 2 27 | borderLayer.shadowColor = UIColor.black.cgColor 28 | borderLayer.shadowRadius = 2 29 | borderLayer.shadowOpacity = 0.4 30 | borderLayer.shadowOffset = CGSize(width: 0, height: 0) 31 | return borderLayer 32 | }() 33 | 34 | override init(frame: CGRect) { 35 | super.init(frame: frame) 36 | layer.addSublayer(borderLayer) 37 | } 38 | 39 | override func layoutSubviews() { 40 | super.layoutSubviews() 41 | borderLayer.frame = bounds 42 | 43 | let path = UIBezierPath( 44 | arcCenter: CGPoint(x: width * 0.5, y: height * 0.5), 45 | radius: width * 0.5 - 1, 46 | startAngle: 0, 47 | endAngle: CGFloat.pi * 2, 48 | clockwise: true 49 | ) 50 | borderLayer.path = path.cgPath 51 | } 52 | 53 | required init?(coder: NSCoder) { 54 | fatalError("init(coder:) has not been implemented") 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorCollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorCollectionView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/10. 6 | // 7 | 8 | import UIKit 9 | 10 | class EditorCollectionView: UICollectionView { 11 | public override func touchesShouldCancel(in view: UIView) -> Bool { 12 | true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorMusicLyricViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorMusicLyricViewCell.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class EditorMusicLyricViewCell: UICollectionViewCell { 11 | 12 | lazy var lyricLb: UILabel = { 13 | let label = UILabel.init() 14 | label.font = .mediumPingFang(ofSize: 16) 15 | label.textColor = .white 16 | return label 17 | }() 18 | 19 | var lyric: VideoEditorLyric! { 20 | didSet { 21 | lyricLb.text = lyric.lyric 22 | } 23 | } 24 | override init(frame: CGRect) { 25 | super.init(frame: frame) 26 | contentView.addSubview(lyricLb) 27 | } 28 | override func layoutSubviews() { 29 | super.layoutSubviews() 30 | lyricLb.frame = bounds 31 | } 32 | required init?(coder: NSCoder) { 33 | fatalError("init(coder:) has not been implemented") 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorStickerTextView+CollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorStickerTextView+CollectionView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/25. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorStickerTextView: UICollectionViewDataSource, 11 | UICollectionViewDelegate { 12 | func collectionView( 13 | _ collectionView: UICollectionView, 14 | numberOfItemsInSection section: Int 15 | ) -> Int { 16 | config.colors.count 17 | } 18 | func collectionView( 19 | _ collectionView: UICollectionView, 20 | cellForItemAt indexPath: IndexPath 21 | ) -> UICollectionViewCell { 22 | let cell = collectionView.dequeueReusableCell( 23 | withReuseIdentifier: "EditorStickerTextViewCellID", 24 | for: indexPath 25 | ) as! EditorStickerTextViewCell 26 | cell.colorHex = config.colors[indexPath.item] 27 | return cell 28 | } 29 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 30 | if currentSelectedIndex == indexPath.item { 31 | return 32 | } 33 | collectionView.deselectItem(at: IndexPath(item: currentSelectedIndex, section: 0), animated: true) 34 | let color = config.colors[indexPath.item].color 35 | currentSelectedColor = color 36 | currentSelectedIndex = indexPath.item 37 | if showBackgroudColor { 38 | useBgColor = color 39 | if color.isWhite { 40 | changeTextColor(color: .black) 41 | }else { 42 | changeTextColor(color: .white) 43 | } 44 | }else { 45 | changeTextColor(color: color) 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorStickerTextView+Delegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorStickerTextView+Delegate.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/25. 6 | // 7 | 8 | import UIKit 9 | 10 | extension EditorStickerTextView: UITextViewDelegate { 11 | func textViewDidChange(_ textView: UITextView) { 12 | textView.typingAttributes = typingAttributes 13 | if textIsDelete { 14 | drawTextBackgroudColor() 15 | textIsDelete = false 16 | } 17 | if !textView.text.isEmpty { 18 | if textView.text.count > config.maximumLimitTextLength && 19 | config.maximumLimitTextLength > 0 { 20 | let text = textView.text[.. Bool { 28 | if text.isEmpty { 29 | textIsDelete = true 30 | } 31 | return true 32 | } 33 | } 34 | 35 | extension EditorStickerTextView: NSLayoutManagerDelegate { 36 | func layoutManager( 37 | _ layoutManager: NSLayoutManager, 38 | didCompleteLayoutFor textContainer: NSTextContainer?, 39 | atEnd layoutFinishedFlag: Bool 40 | ) { 41 | if layoutFinishedFlag { 42 | drawTextBackgroudColor() 43 | } 44 | } 45 | } 46 | 47 | class EditorStickerTextLayer: CAShapeLayer { 48 | } 49 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Editor/View/EditorVideoControlViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditorVideoControlViewCell.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/13. 6 | // 7 | 8 | import UIKit 9 | 10 | class EditorVideoControlViewCell: UICollectionViewCell { 11 | 12 | lazy var imageView: UIImageView = { 13 | let imageView = UIImageView() 14 | imageView.clipsToBounds = true 15 | imageView.contentMode = .scaleAspectFill 16 | return imageView 17 | }() 18 | 19 | var image: UIImage? { 20 | didSet { 21 | if let image = image { 22 | imageView.setImage(image, animated: true) 23 | } 24 | } 25 | } 26 | 27 | override init(frame: CGRect) { 28 | super.init(frame: frame) 29 | addSubview(imageView) 30 | } 31 | 32 | required init?(coder: NSCoder) { 33 | fatalError("init(coder:) has not been implemented") 34 | } 35 | 36 | override func layoutSubviews() { 37 | super.layoutSubviews() 38 | imageView.frame = bounds 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/AssetURLResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetURLResult.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/25. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct AssetURLResult { 11 | 12 | public enum URLType { 13 | case local 14 | case network 15 | } 16 | 17 | /// Contents of LivePhoto 18 | /// LivePhoto包含的内容 19 | public struct LivePhoto { 20 | 21 | public let imageURL: URL 22 | public let imageURLType: URLType 23 | public let videoURL: URL 24 | public let videoURLType: URLType 25 | 26 | init( 27 | imageURL: URL, 28 | imageURLType: URLType = .local, 29 | videoURL: URL, 30 | videoURLType: URLType = .local 31 | ) { 32 | self.imageURL = imageURL 33 | self.imageURLType = imageURLType 34 | self.videoURL = videoURL 35 | self.videoURLType = videoURLType 36 | } 37 | } 38 | public let url: URL 39 | public let urlType: URLType 40 | public let mediaType: PhotoAsset.MediaType 41 | 42 | /// Contents of LivePhoto 43 | /// selectOptions needs to include livePhoto 44 | /// LivePhoto里包含的资源 45 | /// selectOptions 需包含 livePhoto 46 | public let livePhoto: LivePhoto? 47 | 48 | init( 49 | url: URL, 50 | urlType: URLType, 51 | mediaType: PhotoAsset.MediaType, 52 | livePhoto: LivePhoto? = nil 53 | ) { 54 | self.url = url 55 | self.urlType = urlType 56 | self.mediaType = mediaType 57 | self.livePhoto = livePhoto 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Config/AlbumTitleViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlbumTitleViewConfiguration.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/30. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: Album title view configuration class, valid when the pop-up window displays the album list / 相册标题视图配置类,弹窗展示相册列表时有效 11 | public struct AlbumTitleViewConfiguration { 12 | 13 | public var backgroundColor: UIColor? 14 | 15 | /// Background color in dark style 16 | /// 暗黑风格下背景颜色 17 | public var backgroudDarkColor: UIColor? 18 | 19 | /// Arrow configuration 20 | /// 箭头配置 21 | public var arrow: ArrowViewConfiguration = .init() 22 | 23 | public init() { } 24 | } 25 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Config/ArrowViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArrowViewConfiguration.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/30. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: Album title view configuration class, valid when the pop-up window displays the album list / 相册标题视图配置类,弹窗展示相册列表时有效 11 | public struct ArrowViewConfiguration { 12 | 13 | /// 箭头背景颜色 14 | public var backgroundColor: UIColor = HXPickerWrapper.systemTintColor 15 | 16 | /// 箭头颜色 17 | public var arrowColor: UIColor = "#ffffff".hx.color 18 | 19 | /// 暗黑风格下箭头背景颜色 20 | public var backgroudDarkColor: UIColor = HXPickerWrapper.systemTintColor 21 | 22 | /// 暗黑风格下箭头颜色 23 | public var arrowDarkColor: UIColor = "#ffffff".hx.color 24 | 25 | public init() { } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Config/EmptyViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyViewConfiguration.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Slience on 2020/12/29. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: 照片列表空资源时展示的视图 12 | public struct EmptyViewConfiguration { 13 | 14 | /// 标题颜色 15 | public var titleColor: UIColor = "#666666".hx.color 16 | 17 | /// 暗黑风格下标题颜色 18 | public var titleDarkColor: UIColor = "#ffffff".hx.color 19 | 20 | /// 子标题颜色 21 | public var subTitleColor: UIColor = "#999999".hx.color 22 | 23 | /// 暗黑风格下子标题颜色 24 | public var subTitleDarkColor: UIColor = "#dadada".hx.color 25 | 26 | public init() { } 27 | } 28 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Config/NotAuthorizedConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NotAuthorizedConfiguration.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Slience on 2020/12/29. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: 未授权界面配置类 12 | public struct NotAuthorizedConfiguration { 13 | 14 | /// 背景颜色 15 | public var backgroundColor: UIColor = .white 16 | 17 | /// 暗黑风格下的背景颜色 18 | public var darkBackgroundColor: UIColor = "#2E2F30".hx.color 19 | 20 | /// 关闭按钮图片名 21 | public var closeButtonImageName: String = "hx_picker_notAuthorized_close" 22 | 23 | /// 暗黑风格下的关闭按钮图片名 24 | public var closeButtonDarkImageName: String = "hx_picker_notAuthorized_close_dark" 25 | 26 | /// 隐藏关闭按钮 27 | public var isHiddenCloseButton: Bool = false 28 | 29 | /// 标题颜色 30 | public var titleColor: UIColor = .black 31 | 32 | /// 暗黑风格下的标题颜色 33 | public var titleDarkColor: UIColor = .white 34 | 35 | /// 子标题颜色 36 | public var subTitleColor: UIColor = "#444444".hx.color 37 | 38 | /// 暗黑风格下的子标题颜色 39 | public var darkSubTitleColor: UIColor = .white 40 | 41 | /// 跳转按钮背景颜色 42 | public var jumpButtonBackgroundColor: UIColor = "#333333".hx.color 43 | 44 | /// 暗黑风格下跳转按钮背景颜色 45 | public var jumpButtonDarkBackgroundColor: UIColor = .white 46 | 47 | /// 跳转按钮文字颜色 48 | public var jumpButtonTitleColor: UIColor = "#ffffff".hx.color 49 | 50 | /// 暗黑风格下跳转按钮文字颜色 51 | public var jumpButtonTitleDarkColor: UIColor = "#333333".hx.color 52 | 53 | public init() { } 54 | } 55 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Config/SystemCameraConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SystemCameraConfiguration.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Slience on 2020/12/29. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AVFoundation 11 | 12 | // MARK: System camera configuration class / 系统相机配置类 13 | public struct SystemCameraConfiguration { 14 | 15 | /// 媒体类型 16 | /// [kUTTypeImage, kUTTypeMovie] 17 | public var mediaTypes: [String] = [] 18 | 19 | /// Maximum video recording time 20 | /// 视频最大录制时长 21 | public var videoMaximumDuration: TimeInterval = 60 22 | 23 | /// Video quality at the time of shooting 24 | /// 拍摄时的视频质量 25 | public var videoQuality: UIImagePickerController.QualityType = .typeHigh 26 | 27 | /// Video Editing Crop Export Resolution 28 | /// 视频编辑裁剪导出的分辨率 29 | public var editExportPreset: ExportPreset = .ratio_960x540 30 | 31 | /// Video Editing Cropping Export Quality 32 | /// 视频编辑裁剪导出的质量 33 | public var editVideoQuality: Int = 6 34 | 35 | /// Use the rear camera by default 36 | /// 默认使用后置相机 37 | public var cameraDevice: UIImagePickerController.CameraDevice = .rear 38 | 39 | /// allow editing 40 | /// 允许编辑 41 | public var allowsEditing: Bool = true 42 | 43 | public init() { } 44 | } 45 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Controller/PhotoPickerViewController+BottomView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPickerViewController+BottomView.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/27. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: PhotoPickerBottomViewDelegate 11 | extension PhotoPickerViewController: PhotoPickerBottomViewDelegate { 12 | 13 | func bottomView( 14 | didPreviewButtonClick bottomView: PhotoPickerBottomView 15 | ) { 16 | guard let picker = pickerController else { return } 17 | pushPreviewViewController( 18 | previewAssets: picker.selectedAssetArray, 19 | currentPreviewIndex: 0, 20 | animated: true 21 | ) 22 | } 23 | func bottomView( 24 | didFinishButtonClick bottomView: PhotoPickerBottomView 25 | ) { 26 | pickerController?.finishCallback() 27 | } 28 | func bottomView( 29 | _ bottomView: PhotoPickerBottomView, 30 | didOriginalButtonClick isOriginal: Bool 31 | ) { 32 | pickerController?.originalButtonCallback() 33 | } 34 | 35 | public func setOriginal(_ isOriginal: Bool) { 36 | bottomView.boxControl.isSelected = isOriginal 37 | if !isOriginal { 38 | // 取消 39 | bottomView.cancelRequestAssetFileSize() 40 | }else { 41 | // 选中 42 | bottomView.requestAssetBytes() 43 | } 44 | pickerController?.isOriginal = isOriginal 45 | pickerController?.originalButtonCallback() 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Controller/PhotoPreviewViewController+NavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPreviewViewController+NavigationController.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/8/27. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: UINavigationControllerDelegate 11 | extension PhotoPreviewViewController: UINavigationControllerDelegate { 12 | 13 | public func navigationController( 14 | _ navigationController: UINavigationController, 15 | animationControllerFor operation: UINavigationController.Operation, 16 | from fromVC: UIViewController, 17 | to toVC: UIViewController 18 | ) -> UIViewControllerAnimatedTransitioning? { 19 | if operation == .push { 20 | if toVC is PhotoPreviewViewController && fromVC is PhotoPickerViewController { 21 | return PickerTransition.init(type: .push) 22 | } 23 | }else if operation == .pop { 24 | if fromVC is PhotoPreviewViewController && toVC is PhotoPickerViewController { 25 | let cell = getCell(for: currentPreviewIndex) 26 | cell?.scrollContentView.hiddenOtherSubview() 27 | return PickerTransition.init(type: .pop) 28 | } 29 | } 30 | return nil 31 | } 32 | public func navigationController( 33 | _ navigationController: UINavigationController, 34 | interactionControllerFor 35 | animationController: UIViewControllerAnimatedTransitioning 36 | ) -> UIViewControllerInteractiveTransitioning? { 37 | if let canInteration = interactiveTransition?.canInteration, canInteration { 38 | return interactiveTransition 39 | } 40 | return nil 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/Extension/Picker+Int.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Picker+Int.swift 3 | // HXPHPicker 4 | // 5 | // Created by Silence on 2023/5/5. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Int { 11 | 12 | var bytesString: String { 13 | let formatter = ByteCountFormatter() 14 | formatter.allowedUnits = [.useBytes, .useKB, .useMB] 15 | formatter.countStyle = .file 16 | return formatter.string(fromByteCount: Int64(self)) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/View/AlbumTickView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlbumTickView.swift 3 | // HXPHPickerExample 4 | // 5 | // Created by Slience on 2020/12/29. 6 | // Copyright © 2020 Silence. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class AlbumTickView: UIView { 12 | public lazy var tickLayer: CAShapeLayer = { 13 | let tickLayer = CAShapeLayer.init() 14 | tickLayer.contentsScale = UIScreen.main.scale 15 | let tickPath = UIBezierPath.init() 16 | tickPath.move(to: CGPoint(x: scale(8), y: height * 0.5 + scale(1))) 17 | tickPath.addLine(to: CGPoint(x: width * 0.5 - scale(2), y: height - scale(8))) 18 | tickPath.addLine(to: CGPoint(x: width - scale(7), y: scale(9))) 19 | tickLayer.path = tickPath.cgPath 20 | tickLayer.lineWidth = 1.5 21 | tickLayer.strokeColor = UIColor.black.cgColor 22 | tickLayer.fillColor = UIColor.clear.cgColor 23 | return tickLayer 24 | }() 25 | override init(frame: CGRect) { 26 | super.init(frame: frame) 27 | layer.addSublayer(tickLayer) 28 | } 29 | 30 | private func scale(_ numerator: CGFloat) -> CGFloat { 31 | return numerator / 30 * height 32 | } 33 | 34 | required init?(coder: NSCoder) { 35 | fatalError("init(coder:) has not been implemented") 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/View/Cell/PhotoPickerWeChatViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPickerWeChatViewCell.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/10/25. 6 | // 7 | 8 | import UIKit 9 | 10 | open class PhotoPickerWeChatViewCell: PhotoPickerSelectableViewCell { 11 | 12 | lazy var titleLb: UILabel = { 13 | let titleLb = UILabel() 14 | titleLb.textAlignment = .center 15 | titleLb.textColor = .white 16 | titleLb.font = .semiboldPingFang(ofSize: 15) 17 | titleLb.isHidden = true 18 | return titleLb 19 | }() 20 | 21 | open override func initView() { 22 | super.initView() 23 | contentView.insertSubview(titleLb, belowSubview: selectControl) 24 | } 25 | 26 | open override func updateSelectedState(isSelected: Bool, animated: Bool) { 27 | super.updateSelectedState(isSelected: isSelected, animated: animated) 28 | titleLb.isHidden = !isSelected 29 | titleLb.text = "\(photoAsset.selectIndex + 1)" 30 | titleLb.height = 18 31 | titleLb.width = titleLb.textWidth 32 | titleLb.centerY = selectControl.centerY 33 | } 34 | 35 | open override func layoutView() { 36 | super.layoutView() 37 | titleLb.x = 10 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/View/Cell/PreviewPhotoViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PreviewPhotoViewCell.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/3/12. 6 | // 7 | 8 | import UIKit 9 | 10 | class PreviewPhotoViewCell: PhotoPreviewViewCell, PhotoPreviewContentViewDelete { 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | scrollContentView = PhotoPreviewContentView.init(type: .photo) 15 | scrollContentView.delegate = self 16 | initView() 17 | } 18 | required init?(coder: NSCoder) { 19 | fatalError("init(coder:) has not been implemented") 20 | } 21 | func contentView(requestSucceed contentView: PhotoPreviewContentView) { 22 | delegate?.cell(requestSucceed: self) 23 | } 24 | func contentView(requestFailed contentView: PhotoPreviewContentView) { 25 | delegate?.cell(requestFailed: self) 26 | } 27 | func contentView(updateContentSize contentView: PhotoPreviewContentView) { 28 | setupScrollViewContentSize() 29 | } 30 | 31 | func contentView(networkImagedownloadSuccess contentView: PhotoPreviewContentView) { 32 | delegate?.photoCell(networkImagedownloadSuccess: self) 33 | } 34 | func contentView(networkImagedownloadFailed contentView: PhotoPreviewContentView) { 35 | delegate?.photoCell(networkImagedownloadFailed: self) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Picker/View/PhotoPickerSwitchLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPickerSwitchLayout.swift 3 | // HXPHPicker 4 | // 5 | // Created by Slience on 2021/9/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class PhotoPickerSwitchLayout: UICollectionViewFlowLayout { 11 | var changing: Bool = false 12 | override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint { 13 | if changing { 14 | return CGPoint(x: -collectionView!.contentInset.left, y: -collectionView!.contentInset.top) 15 | } 16 | return super.targetContentOffset(forProposedContentOffset: proposedContentOffset) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/.DS_Store -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ar.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/de.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/fr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@2x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@3x.png -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/metal/default.metallib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/metal/default.metallib -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/musics/天外来物: -------------------------------------------------------------------------------- 1 | [ti:天外来物] 2 | [t_time:(00:38)] 3 | [00:00.000]你像 天外来物一样 求之不得 4 | [00:07.689]你在世俗里的名字 不重要了 5 | [00:14.689]正好 我隐藏的人格是契而不舍 6 | [00:21.689]直到蜂拥而至的人都透明了 7 | [00:28.689]我在 不近又不远处 8 | [00:33.189]用明天换你 靠近我 9 | -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ru.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/vi.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/vi.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/HXPHPicker/Resources/HXPHPicker.bundle/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /tmp.xcconfig: -------------------------------------------------------------------------------- 1 | EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8\ 2 | EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))} 3 | --------------------------------------------------------------------------------