├── .gitignore ├── LICENSE ├── Library ├── Base │ ├── BaseModel.swift │ ├── BaseViewController.swift │ └── ResultInfo.swift ├── Config │ └── Config.swift ├── Extension │ ├── Foundation+Extension.swift │ ├── Number+Extension.swift │ ├── UIButton+Extension.swift │ ├── UICollectView+Extension.swift │ ├── UIColor+Extension.swift │ ├── UIImage+Base.swift │ ├── UIImageView+Extension.swift │ ├── UINavigationController+Extension.swift │ ├── UIScrollView+Extension.swift │ ├── UITableView+Extension.swift │ ├── UIView+Base.swift │ ├── UIViewController+Extension.swift │ ├── UIWindow+Base.swift │ └── WKWebView+Extension.swift ├── GrandCue │ ├── GandAlert.swift │ ├── GrandCue.swift │ └── Toast.swift ├── GrandKit │ ├── GrandMenu │ │ ├── GrandBaseTable.swift │ │ ├── GrandCellTableViewCell.swift │ │ ├── GrandContentViewController.swift │ │ ├── GrandMenu.swift │ │ ├── GrandMenuItem.swift │ │ ├── GrandMenuTable.swift │ │ └── GrandPageContentView.swift │ ├── GrandRefresh │ │ ├── DefaultLoadMoreFooter.swift │ │ ├── DefaultRefreshHeader.swift │ │ ├── LoadMoreFooter.swift │ │ ├── RefreshComponent.swift │ │ ├── RefreshConstant.swift │ │ ├── RefreshExtension.swift │ │ ├── RefreshHeader.swift │ │ ├── RefreshStyle.swift │ │ └── Resource │ │ │ ├── Base.lproj │ │ │ └── Localize.strings │ │ │ ├── arrow_down@3x.png │ │ │ ├── en.lproj │ │ │ └── Localize.strings │ │ │ ├── failure@3x.png │ │ │ ├── success@3x.png │ │ │ └── zh-Hans.lproj │ │ │ └── Localize.strings │ ├── GrandStore │ │ ├── GrandStore.swift │ │ └── MMKV.xcframework │ │ │ ├── Info.plist │ │ │ ├── ios-arm64_armv7 │ │ │ └── MMKV.framework │ │ │ │ ├── Headers │ │ │ │ ├── MMKV.h │ │ │ │ └── MMKVHandler.h │ │ │ │ ├── Info.plist │ │ │ │ ├── MMKV │ │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ └── ios-x86_64-simulator │ │ │ └── MMKV.framework │ │ │ ├── Headers │ │ │ ├── MMKV.h │ │ │ └── MMKVHandler.h │ │ │ ├── Info.plist │ │ │ ├── MMKV │ │ │ ├── Modules │ │ │ └── module.modulemap │ │ │ └── _CodeSignature │ │ │ └── CodeResources │ ├── GrandTime │ │ ├── GrandTime.swift │ │ ├── GrandTimer.swift │ │ └── TimeSpan.swift │ └── StarReview │ │ └── StarReview.swift ├── MJRefresh │ ├── Base │ │ ├── MJRefreshAutoFooter.h │ │ ├── MJRefreshAutoFooter.m │ │ ├── MJRefreshBackFooter.h │ │ ├── MJRefreshBackFooter.m │ │ ├── MJRefreshComponent.h │ │ ├── MJRefreshComponent.m │ │ ├── MJRefreshFooter.h │ │ ├── MJRefreshFooter.m │ │ ├── MJRefreshHeader.h │ │ └── MJRefreshHeader.m │ ├── Custom │ │ ├── Footer │ │ │ ├── Auto │ │ │ │ ├── MJRefreshAutoGifFooter.h │ │ │ │ ├── MJRefreshAutoGifFooter.m │ │ │ │ ├── MJRefreshAutoNormalFooter.h │ │ │ │ ├── MJRefreshAutoNormalFooter.m │ │ │ │ ├── MJRefreshAutoStateFooter.h │ │ │ │ └── MJRefreshAutoStateFooter.m │ │ │ └── Back │ │ │ │ ├── MJRefreshBackGifFooter.h │ │ │ │ ├── MJRefreshBackGifFooter.m │ │ │ │ ├── MJRefreshBackNormalFooter.h │ │ │ │ ├── MJRefreshBackNormalFooter.m │ │ │ │ ├── MJRefreshBackStateFooter.h │ │ │ │ └── MJRefreshBackStateFooter.m │ │ └── Header │ │ │ ├── MJRefreshGifHeader.h │ │ │ ├── MJRefreshGifHeader.m │ │ │ ├── MJRefreshNormalHeader.h │ │ │ ├── MJRefreshNormalHeader.m │ │ │ ├── MJRefreshStateHeader.h │ │ │ └── MJRefreshStateHeader.m │ ├── MJRefresh.bundle │ │ ├── arrow@2x.png │ │ ├── en.lproj │ │ │ └── Localizable.strings │ │ ├── ko.lproj │ │ │ └── Localizable.strings │ │ ├── ru.lproj │ │ │ └── Localizable.strings │ │ ├── uk.lproj │ │ │ └── Localizable.strings │ │ ├── zh-Hans.lproj │ │ │ └── Localizable.strings │ │ └── zh-Hant.lproj │ │ │ └── Localizable.strings │ ├── MJRefresh.h │ ├── MJRefreshConfig.h │ ├── MJRefreshConfig.m │ ├── MJRefreshConst.h │ ├── MJRefreshConst.m │ ├── NSBundle+MJRefresh.h │ ├── NSBundle+MJRefresh.m │ ├── UIScrollView+MJExtension.h │ ├── UIScrollView+MJExtension.m │ ├── UIScrollView+MJRefresh.h │ ├── UIScrollView+MJRefresh.m │ ├── UIView+MJExtension.h │ └── UIView+MJExtension.m ├── Media │ ├── ShadowCamera │ │ ├── ShadowCameraHandle.swift │ │ ├── ShadowCameraModel.swift │ │ └── ShadowEncoder.swift │ ├── ShadowPlayer │ │ ├── ShadowAudioPlayerBack.swift │ │ ├── ShadowAudioPlayerView.swift │ │ ├── ShadowDataManager.swift │ │ ├── ShadowDownloader.swift │ │ ├── ShadowPlayBack.swift │ │ ├── ShadowPlayer.swift │ │ ├── ShadowRangeManager.swift │ │ ├── ShadowVideoControlView.swift │ │ ├── ShadowVideoPlayControlView.swift │ │ ├── ShadowVideoPlayView.swift │ │ └── ShadowVideoPlayerViewController.swift │ └── VideoRecord │ │ ├── AssetWriterCoordinator.swift │ │ ├── CameraModel.swift │ │ ├── CaptureSessionAssetWriterCoordinator.swift │ │ ├── CaptureSessionCoordinator.swift │ │ └── FocusFrameView.swift ├── Model │ └── LogInfo.swift ├── TZImagePickerController │ ├── NSBundle+TZImagePicker.h │ ├── NSBundle+TZImagePicker.m │ ├── TZAssetCell.h │ ├── TZAssetCell.m │ ├── TZAssetModel.h │ ├── TZAssetModel.m │ ├── TZGifPhotoPreviewController.h │ ├── TZGifPhotoPreviewController.m │ ├── TZImageCropManager.h │ ├── TZImageCropManager.m │ ├── TZImageManager.h │ ├── TZImageManager.m │ ├── TZImagePickerController.bundle │ │ ├── MMVideoPreviewPlay@2x.png │ │ ├── MMVideoPreviewPlayHL@2x.png │ │ ├── VideoSendIcon@2x.png │ │ ├── ar.lproj │ │ │ └── Localizable.strings │ │ ├── bg.lproj │ │ │ └── Localizable.strings │ │ ├── cs-CZ.lproj │ │ │ └── Localizable.strings │ │ ├── de.lproj │ │ │ └── Localizable.strings │ │ ├── el.lproj │ │ │ └── Localizable.strings │ │ ├── en.lproj │ │ │ └── Localizable.strings │ │ ├── es.lproj │ │ │ └── Localizable.strings │ │ ├── fr.lproj │ │ │ └── Localizable.strings │ │ ├── he.lproj │ │ │ └── Localizable.strings │ │ ├── it.lproj │ │ │ └── Localizable.strings │ │ ├── ja.lproj │ │ │ └── Localizable.strings │ │ ├── ko-KP.lproj │ │ │ └── Localizable.strings │ │ ├── ko.lproj │ │ │ └── Localizable.strings │ │ ├── navi_back@2x.png │ │ ├── nl.lproj │ │ │ └── Localizable.strings │ │ ├── photo_def_photoPickerVc@2x.png │ │ ├── photo_def_previewVc@2x.png │ │ ├── photo_number_icon@2x.png │ │ ├── photo_original_def@2x.png │ │ ├── photo_original_sel@2x.png │ │ ├── photo_sel_photoPickerVc@2x.png │ │ ├── photo_sel_previewVc@2x.png │ │ ├── pl.lproj │ │ │ └── Localizable.strings │ │ ├── preview_number_icon@2x.png │ │ ├── preview_original_def@2x.png │ │ ├── pt.lproj │ │ │ └── Localizable.strings │ │ ├── ro.lproj │ │ │ └── Localizable.strings │ │ ├── ru.lproj │ │ │ └── Localizable.strings │ │ ├── sk.lproj │ │ │ └── Localizable.strings │ │ ├── sv.lproj │ │ │ └── Localizable.strings │ │ ├── takePicture80@2x.png │ │ ├── takePicture@2x.png │ │ ├── th.lproj │ │ │ └── Localizable.strings │ │ ├── tr.lproj │ │ │ └── Localizable.strings │ │ ├── uk.lproj │ │ │ └── Localizable.strings │ │ ├── vi.lproj │ │ │ └── Localizable.strings │ │ ├── zh-Hans.lproj │ │ │ └── Localizable.strings │ │ └── zh-Hant.lproj │ │ │ └── Localizable.strings │ ├── TZImagePickerController.h │ ├── TZImagePickerController.m │ ├── TZImageRequestOperation.h │ ├── TZImageRequestOperation.m │ ├── TZLocationManager.h │ ├── TZLocationManager.m │ ├── TZPhotoPickerController.h │ ├── TZPhotoPickerController.m │ ├── TZPhotoPreviewCell.h │ ├── TZPhotoPreviewCell.m │ ├── TZPhotoPreviewController.h │ ├── TZPhotoPreviewController.m │ ├── TZProgressView.h │ ├── TZProgressView.m │ ├── TZVideoPlayerController.h │ ├── TZVideoPlayerController.m │ ├── UIView+Layout.h │ └── UIView+Layout.m ├── Tool │ ├── Auth.swift │ ├── CatoMonitor.swift │ ├── FPSTool.swift │ ├── HttpClient.swift │ ├── Singleton.h │ ├── Tool.swift │ └── log4cplus.h ├── View │ ├── BarSlider.swift │ ├── FlowLayout.swift │ ├── FlowView.swift │ ├── GrandTextView.swift │ ├── GridView.swift │ ├── HintView.swift │ ├── ImageBrowserViewController.swift │ ├── JXLayoutButton.h │ ├── JXLayoutButton.m │ ├── LimitTextView.swift │ ├── ProgressButton.swift │ ├── SlideMenuView.swift │ └── TimerButton.swift └── mars │ ├── Component │ ├── LogHelper.h │ ├── LogHelper.mm │ ├── LogUtil.h │ ├── LogUtil.m │ ├── log_crypt.cc │ └── log_crypt.h │ ├── bridge │ ├── appender-swift-bridge.h │ └── appender-swift-bridge.mm │ └── mars.framework │ ├── Headers │ ├── comm │ │ ├── ThreadOperationQueue.h │ │ ├── autobuffer.h │ │ ├── comm_data.h │ │ ├── has_member.h │ │ ├── http.h │ │ ├── local_ipstack.h │ │ ├── nat64_prefix_util.h │ │ ├── projdef.h │ │ ├── scope_autoreleasepool.h │ │ ├── string_cast.h │ │ ├── strutil.h │ │ ├── time_utils.h │ │ └── verinfo.h │ └── xlog │ │ ├── appender.h │ │ ├── preprocessor.h │ │ ├── xlogger.h │ │ ├── xlogger_interface.h │ │ └── xloggerbase.h │ └── mars ├── Podfile ├── Podfile.lock ├── README.md ├── demo.playground ├── Contents.swift └── contents.xcplayground ├── iOSDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── xcshareddata │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── iOSDemo.xcscheme ├── iOSDemo.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist └── iOSDemo ├── AppDelegate.swift ├── Assets.xcassets ├── 1.imageset │ ├── 1.jpg │ └── Contents.json ├── 10.imageset │ ├── 10.jpg │ └── Contents.json ├── 2.imageset │ ├── 2.jpg │ └── Contents.json ├── 3.imageset │ ├── 3.jpg │ └── Contents.json ├── 4.imageset │ ├── 4.jpg │ └── Contents.json ├── 5.imageset │ ├── 5.jpg │ └── Contents.json ├── 6.imageset │ ├── 6.jpg │ └── Contents.json ├── 7.imageset │ ├── 7.jpg │ └── Contents.json ├── AppIcon.appiconset │ └── Contents.json ├── Audio │ ├── Contents.json │ ├── btn_pause_recording_audio.imageset │ │ ├── Contents.json │ │ └── btn_pause_recording_audio.png │ ├── btn_pause_small.imageset │ │ ├── Contents.json │ │ └── btn_pause_small.png │ ├── btn_play_small.imageset │ │ ├── Contents.json │ │ └── btn_play_small.png │ ├── btn_play_small_disable.imageset │ │ ├── Contents.json │ │ └── btn_play_small_disable.png │ └── btn_recording_audio.imageset │ │ ├── Contents.json │ │ └── btn_recording_audio.png ├── Contents.json ├── Player │ ├── Contents.json │ ├── full_screen.imageset │ │ ├── Contents.json │ │ └── full_screen@2x.png │ ├── knob.imageset │ │ ├── Contents.json │ │ └── knob.png │ ├── pause.imageset │ │ ├── Contents.json │ │ └── pause@2x.png │ └── play.imageset │ │ ├── Contents.json │ │ └── play@2x.png ├── Video │ ├── Contents.json │ ├── btn_recording_video.imageset │ │ ├── Contents.json │ │ └── btn_recording_video.png │ ├── btn_start_record_video.imageset │ │ ├── Contents.json │ │ └── btn_start_record_video.png │ ├── btn_video_delete_confirm.imageset │ │ ├── Contents.json │ │ └── btn_video_delete_confirm.png │ ├── btn_video_delete_normal.imageset │ │ ├── Contents.json │ │ └── btn_video_delete_normal.png │ ├── btn_video_uploading.imageset │ │ ├── Contents.json │ │ └── btn_video_uploading.png │ ├── camra_beauty.imageset │ │ ├── Contents.json │ │ └── camra_beauty@3x.png │ ├── camra_beauty_close.imageset │ │ ├── Contents.json │ │ └── camra_beauty_close@3x.png │ ├── camra_preview.imageset │ │ ├── Contents.json │ │ └── camra_preview@3x.png │ └── close_preview.imageset │ │ ├── Contents.json │ │ └── close_preview@3x.png ├── btn_flash_off.imageset │ ├── Contents.json │ └── btn_flash_off.png ├── btn_flash_on.imageset │ ├── Contents.json │ └── btn_flash_on.png ├── btn_location.imageset │ ├── Contents.json │ └── btn_location.png ├── file_not_exist.imageset │ ├── Contents.json │ └── file_not_exist.png ├── header │ ├── Contents.json │ ├── a10.imageset │ │ ├── Contents.json │ │ └── a10.jpg │ ├── a11.imageset │ │ ├── Contents.json │ │ └── a11.jpg │ ├── a3.imageset │ │ ├── Contents.json │ │ └── a3.jpg │ ├── a4.imageset │ │ ├── Contents.json │ │ └── a4.jpg │ ├── a5.imageset │ │ ├── Contents.json │ │ └── a5.jpg │ ├── a6.imageset │ │ ├── Contents.json │ │ └── a6.jpg │ ├── a7.imageset │ │ ├── Contents.json │ │ └── a7.jpg │ ├── a8.imageset │ │ ├── Contents.json │ │ └── a8.jpg │ └── a9.imageset │ │ ├── Contents.json │ │ └── a9.jpg ├── heart.imageset │ ├── Contents.json │ └── heart.png ├── icon │ ├── Contents.json │ ├── check.imageset │ │ ├── Contents.json │ │ └── check.png │ ├── computer.imageset │ │ ├── Contents.json │ │ └── computer.png │ ├── filter.imageset │ │ ├── Contents.json │ │ └── filter.png │ ├── open_menu.imageset │ │ ├── Contents.json │ │ └── open_menu.png │ ├── phone.imageset │ │ ├── Contents.json │ │ └── phone.png │ ├── star_full.imageset │ │ ├── Contents.json │ │ └── star_full.png │ ├── star_hollow.imageset │ │ ├── Contents.json │ │ └── star_hollow.png │ └── tablet.imageset │ │ ├── Contents.json │ │ └── tablet.png ├── icon_close.imageset │ ├── Contents.json │ └── icon_close.png ├── icon_error.imageset │ ├── Contents.json │ └── icon_error.png ├── img_watermark.imageset │ ├── Contents.json │ └── img_watermark.png ├── img_watermark_a.imageset │ ├── Contents.json │ └── img_watermark_a.png ├── img_watermark_b.imageset │ ├── Contents.json │ └── img_watermark_b.png ├── info.imageset │ ├── Contents.json │ └── info.png ├── public_btn_back_white_solid.imageset │ ├── Contents.json │ └── public_btn_back_white_solid@2x.png ├── public_btn_delete_white_solid.imageset │ ├── Contents.json │ └── public_btn_delete_white_solid@2x.png ├── public_btn_next_white_solid.imageset │ ├── Contents.json │ └── public_btn_next_white_solid@2x.png └── public_btn_setting_white_solid.imageset │ ├── Contents.json │ └── public_btn_setting_white_solid@2x.png ├── Base.lproj └── LaunchScreen.storyboard ├── Base ├── BasicViewController.swift ├── ClearCacheViewController.swift ├── Log │ ├── LogTool.swift │ └── LogViewController.swift ├── MemeryLeak │ └── MemeryLeakTestViewController.swift ├── StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata │ ├── AppData │ │ ├── Documents │ │ │ └── DB │ │ │ │ └── common.sqlite3 │ │ └── Library │ │ │ ├── Caches │ │ │ ├── StanHu.iOSDemo │ │ │ │ ├── Cache.db │ │ │ │ ├── Cache.db-shm │ │ │ │ ├── Cache.db-wal │ │ │ │ ├── GrandStoreGrandStore.plist │ │ │ │ ├── GrandStoreuserVideoStore │ │ │ │ └── fsCachedData │ │ │ │ │ ├── 0A202D6D-0E9E-462F-8ABF-3C63300AE4CA │ │ │ │ │ ├── A789C9A1-F71C-49AF-8D11-3A954CC54F51 │ │ │ │ │ ├── A845B740-6461-4C3E-818B-AC32D4DD58B5 │ │ │ │ │ └── C9ACB54D-FE04-42A9-9B7B-A010A906AF72 │ │ │ ├── WebKit │ │ │ │ └── NetworkCache │ │ │ │ │ └── Version 16 │ │ │ │ │ ├── Records │ │ │ │ │ └── D1565B558C74E88CB4A6B765A2F1B767D91C3DF2 │ │ │ │ │ │ └── Resource │ │ │ │ │ │ └── AE33E3019CD235305F4EC4EF29C54C3A8826DAF6 │ │ │ │ │ └── salt │ │ │ ├── com.apple.WebKit.WebContent │ │ │ │ └── com.apple.metal │ │ │ │ │ ├── functions.data │ │ │ │ │ └── functions.list │ │ │ └── com.apple.dyld │ │ │ │ └── iOSDemo.closure │ │ │ ├── Cookies │ │ │ └── Cookies.binarycookies │ │ │ ├── Preferences │ │ │ └── StanHu.iOSDemo.plist │ │ │ ├── Saved Application State │ │ │ └── StanHu.iOSDemo.savedState │ │ │ │ └── KnownSceneSessions │ │ │ │ └── data.data │ │ │ ├── SplashBoard │ │ │ └── Snapshots │ │ │ │ ├── StanHu.iOSDemo - {DEFAULT GROUP} │ │ │ │ ├── 54CF958A-C7CB-47CB-8E17-1961C5089A3A@2x.ktx │ │ │ │ ├── 5E63D984-94A4-4D75-B731-2A9A4D37F372@2x.ktx │ │ │ │ ├── BBA2B351-1CDF-4605-8FB4-90A748FEB171@2x.ktx │ │ │ │ └── BC2436C2-BF5C-4D1F-A258-D312148D1C01@2x.ktx │ │ │ │ └── sceneID:StanHu.iOSDemo-default │ │ │ │ ├── 4821B647-25AE-429D-A45C-284F1A6167C9@2x.ktx │ │ │ │ ├── 545DAF94-5537-479D-8168-C1833A9D3C30@2x.ktx │ │ │ │ └── downscaled │ │ │ │ ├── 9B3635E5-4FAC-4794-A98A-6DE8F58811C1@2x.ktx │ │ │ │ └── A012DE26-B4E5-43D3-9E87-8807EB96E502@2x.ktx │ │ │ └── WebKit │ │ │ └── WebsiteData │ │ │ └── ResourceLoadStatistics │ │ │ ├── observations.db │ │ │ ├── observations.db-shm │ │ │ └── observations.db-wal │ └── AppDataInfo.plist └── Thread │ ├── Apply.swift │ ├── Group.swift │ ├── Semaphore.swift │ └── ThreadViewController.swift ├── Info.plist ├── Network └── README.md ├── ViewController.swift ├── bridge.h ├── iOSDemo.entitlements └── iOSDemo.pch /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | *.mlmodel 21 | 22 | ## Other 23 | *.moved-aside 24 | *.xccheckout 25 | *.xcscmblueprint 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | .build/ 43 | 44 | # CocoaPods 45 | # 46 | # We recommend against adding the Pods directory to your .gitignore. However 47 | # you should judge for yourself, the pros and cons are mentioned at: 48 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 49 | # 50 | # Pods/ 51 | Pods 52 | # Carthage 53 | # 54 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 55 | # Carthage/Checkouts 56 | 57 | Carthage 58 | 59 | # fastlane 60 | # 61 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 62 | # screenshots whenever they are needed. 63 | # For more information about the recommended setup visit: 64 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 65 | 66 | fastlane/report.xml 67 | fastlane/Preview.html 68 | fastlane/screenshots 69 | fastlane/test_output 70 | 71 | *.DS_Store 72 | framework 73 | ffmpeg_ios 74 | *.mp4 75 | MAMapKit.framework 76 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Stan 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 | -------------------------------------------------------------------------------- /Library/Base/BaseModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseModel.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/9/25. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseModel { 12 | var cellHeight:CGFloat = 0 13 | } 14 | -------------------------------------------------------------------------------- /Library/Base/BaseViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewController.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 28/12/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseViewController: UIViewController { 12 | 13 | deinit { 14 | Log(message: "\(type(of:self))已经被回收了") 15 | } 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Library/Base/ResultInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResultInfo.swift 3 | // Novel 4 | // 5 | // Created by Stan Hu on 21/7/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftyJSON 11 | typealias completed = (_ result:ResultInfo)->Void 12 | struct ResultInfo { 13 | var code = 0 14 | var message = "" 15 | var data:Any? 16 | var count = 0 17 | var content:[String:Any]? 18 | init() { 19 | 20 | } 21 | 22 | init(rawData:Data?) { 23 | if let d = rawData{ 24 | let js = JSON(d) 25 | if let code = js["code"].int{ 26 | self.code = code 27 | message = js["msg"].stringValue 28 | data = js["data"] 29 | } 30 | else{ 31 | code = -1 32 | message = "网络错误,请重新再试" 33 | } 34 | 35 | 36 | } 37 | else{ 38 | code = -1 39 | message = "网络错误,请重新再试" 40 | } 41 | } 42 | } 43 | 44 | 45 | 46 | func handleResult(result:ResultInfo) -> Bool { 47 | return handleResult(result: result, needHideWait: true) 48 | } 49 | 50 | func handleResult(result:ResultInfo,needHideWait:Bool) -> Bool { 51 | if needHideWait { 52 | GrandCue.dismissLoading() 53 | } 54 | 55 | if result.code != 0 { 56 | GrandCue.toast(result.message ) 57 | return false 58 | } 59 | return true 60 | } 61 | -------------------------------------------------------------------------------- /Library/Extension/UINavigationController+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+Extension.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/5/16. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | private var NSObject_previousViewController = 0 11 | extension UINavigationController{ 12 | @objc var previousViewController:AnyClass?{ 13 | get{ 14 | return objc_getAssociatedObject(self, &NSObject_previousViewController) as? AnyClass 15 | } 16 | set{ 17 | objc_setAssociatedObject(self, &NSObject_previousViewController, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY_NONATOMIC) 18 | } 19 | } 20 | 21 | func myPopViewControllerAnimated(animated: Bool) -> UIViewController? { 22 | if let prev = self.myPopViewControllerAnimated(animated: animated){ 23 | previousViewController = type(of: prev) 24 | } 25 | return nil 26 | } 27 | 28 | 29 | func setNavgationBarClear() { 30 | navigationBar.isTranslucent = true 31 | let rect = CGRect(x: 0, y: 0, w: ScreenWidth, h: NavigationBarHeight) 32 | UIGraphicsBeginImageContext(rect.size) 33 | let context = UIGraphicsGetCurrentContext() 34 | context?.setFillColor(UIColor.clear.cgColor) 35 | context?.fill(rect) 36 | let img = UIGraphicsGetImageFromCurrentImageContext() 37 | UIGraphicsEndImageContext() 38 | navigationBar.setBackgroundImage(img!, for: .default) 39 | navigationBar.clipsToBounds = true 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Library/Extension/UIScrollView+Extension.swift: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // UIScrollView+Extension.swift 4 | // iOSDemo 5 | // 6 | // Created by Stan Hu on 2018/5/9. 7 | // Copyright © 2018 Stan Hu. All rights reserved. 8 | // 9 | 10 | import UIKit 11 | 12 | extension UIScrollView{ 13 | func addTopTranslucency(height:CGFloat) { 14 | let v = UIView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: height)) 15 | let ly = CAGradientLayer() 16 | ly.startPoint = CGPoint(x: 0.5, y: 0) 17 | ly.endPoint = CGPoint(x: 0.5, y: 1) 18 | ly.colors = [UIColor.white.cgColor,UIColor(red: 1, green: 1, blue: 1, alpha: 0).cgColor] 19 | ly.frame = v.bounds 20 | v.layer.insertSublayer(ly, at: 0) 21 | self.addSubview(v) 22 | } 23 | 24 | func addBottomTranslucency(height:CGFloat) { 25 | let v = UIView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: height)) 26 | let ly = CAGradientLayer() 27 | ly.startPoint = CGPoint(x: 0.5, y: 0) 28 | ly.endPoint = CGPoint(x: 0.5, y: 1) 29 | ly.colors = [UIColor(red: 1, green: 1, blue: 1, alpha: 0).cgColor,UIColor.white.cgColor] 30 | ly.frame = v.bounds 31 | v.layer.insertSublayer(ly, at: 0) 32 | self.addSubview(v) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Library/Extension/UIViewController+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extension.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/9/14. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | private var UIViewController_Tag = 110 12 | extension UIViewController{ 13 | @objc var tag:Int{ 14 | get{ 15 | return objc_getAssociatedObject(self, &UIViewController_Tag) as? Int ?? 0 16 | } 17 | set{ 18 | objc_setAssociatedObject(self, &UIViewController_Tag, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Library/Extension/UIWindow+Base.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIWindow+Base.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 14/9/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIWindow{ 12 | // open override func topMostController() -> UIViewController { 13 | // var topViewController = rootViewController! 14 | // while topViewController.presentedViewController != nil { 15 | // topViewController = topViewController.presentedViewController! 16 | // } 17 | // return topViewController 18 | // } 19 | 20 | open func currentViewController() -> UIViewController? { 21 | var currentViewController = topMostController() 22 | while currentViewController is UINavigationController && (currentViewController as! UINavigationController).topViewController != nil { 23 | currentViewController = (currentViewController as! UINavigationController).topViewController! 24 | } 25 | return currentViewController 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Library/Extension/WKWebView+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WKWebView+Extension.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2021/7/14. 6 | // Copyright © 2021 Stan Hu. All rights reserved. 7 | // 8 | 9 | import WebKit 10 | extension WKWebView{ 11 | @objc static func gghandlesURLScheme(_ urlScheme: String) -> Bool{ 12 | if urlScheme == "http" || urlScheme == "https" { 13 | return false 14 | } 15 | else{ 16 | return gghandlesURLScheme(urlScheme) 17 | } 18 | } 19 | 20 | @objc func ggLoad(_ request: URLRequest) -> WKNavigation?{ 21 | print("--------------hook Load 方法成功--------------") 22 | return ggLoad(request) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Library/GrandCue/Toast.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Toast.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/5/16. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import KRProgressHUD 11 | class Toast{ 12 | 13 | 14 | 15 | static var isShowing = false 16 | 17 | static func showToast(msg:String) { 18 | 19 | DispatchQueue.main.async { 20 | KRProgressHUD.dismiss() 21 | self.isShowing = false 22 | GrandCue.toast(msg) 23 | } 24 | 25 | } 26 | static func showToast(msg:String,originy:Float) { 27 | GrandCue.toast(msg, verticalScale: originy) 28 | } 29 | 30 | static func showLoading(txt:String = "加载中..."){ 31 | KRProgressHUD.set(style: .custom(background: UIColor.blue, text: UIColor.red, icon: UIColor.yellow)).showMessage(txt) 32 | isShowing = true 33 | } 34 | 35 | // func isShowing() -> Bool { 36 | // 37 | // } 38 | 39 | static func dismissLoading() { 40 | KRProgressHUD.dismiss() 41 | isShowing = false 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandMenu/GrandBaseTable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GrandBaseTable.swift 3 | // DemoLayout 4 | // 5 | // Created by Stan Hu on 11/6/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | open class GrandBaseTable: UITableView,UIGestureRecognizerDelegate { 11 | public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 12 | return true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandMenu/GrandCellTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // menuCellTableViewCell.swift 3 | // DemoLayout 4 | // 5 | // Created by Stan Hu on 11/6/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class GrandCellTableViewCell: UITableViewCell { 12 | 13 | open var pageContentView:GrandPageContentView? 14 | open var vcs = [UIViewController]() 15 | open var cellCanScroll = false{ 16 | didSet{ 17 | for vc in vcs{ 18 | if let v = vc as? GrandContentViewController{ 19 | v.canScroll = cellCanScroll 20 | v.tableView.contentOffset = CGPoint() 21 | } 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/RefreshConstant.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class RefreshConstant { 4 | static let slowAnimationDuration: TimeInterval = 0.4 5 | static let fastAnimationDuration: TimeInterval = 0.25 6 | 7 | 8 | static let keyPathContentOffset: String = "contentOffset" 9 | static let keyPathContentInset: String = "contentInset" 10 | static let keyPathContentSize: String = "contentSize" 11 | // static let keyPathPanState: String = "state" 12 | 13 | 14 | static var associatedObjectHeader = 0 15 | static var associatedObjectFooter = 1 16 | 17 | static let debug = false 18 | } 19 | 20 | public func RLocalize(_ string:String)->String{ 21 | return NSLocalizedString(string, tableName: "Localize", bundle: Bundle(for: DefaultRefreshHeader.self), value: "", comment: "") 22 | } 23 | public struct RHeaderString{ 24 | static public let pullDownToRefresh = RLocalize("pullDownToRefresh") 25 | static public let releaseToRefresh = RLocalize("releaseToRefresh") 26 | static public let refreshSuccess = RLocalize("refreshSuccess") 27 | static public let refreshFailure = RLocalize("refreshFailure") 28 | static public let refreshing = RLocalize("refreshing") 29 | } 30 | 31 | public struct RFooterString{ 32 | static public let pullUpToRefresh = RLocalize("pullUpToRefresh") 33 | static public let loadding = RLocalize("loadMore") 34 | static public let noMoreData = RLocalize("noMoreData") 35 | static public let releaseLoadMore = RLocalize("releaseLoadMore") 36 | //static public let scrollAndTapToRefresh = GTMRLocalize("scrollAndTapToRefresh") 37 | } 38 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/Base.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "Pull to refresh"; 9 | 10 | releaseToRefresh = "Release to refresh"; 11 | 12 | refreshSuccess = "Update successful"; 13 | 14 | refreshFailure = "Update failed"; 15 | 16 | refreshing = "Refreshing..."; 17 | 18 | pullUpToRefresh = "Scroll to load"; 19 | 20 | noMoreData = "No more data, daling!"; 21 | 22 | tapToRefresh = "Tap to refresh"; 23 | 24 | scrollAndTapToRefresh = "Scroll or tap to load"; 25 | 26 | loadMore = "Loading..."; 27 | 28 | releaseLoadMore = "Release to load more"; 29 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/arrow_down@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandRefresh/Resource/arrow_down@3x.png -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/en.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "Pull to refresh"; 9 | 10 | releaseToRefresh = "Release to refresh"; 11 | 12 | refreshSuccess = "Update successful"; 13 | 14 | refreshFailure = "Update failed"; 15 | 16 | refreshing = "Refreshing..."; 17 | 18 | pullUpToRefresh = "Scroll to load"; 19 | 20 | noMoreData = "No more data, daling!"; 21 | 22 | tapToRefresh = "Tap to refresh"; 23 | 24 | scrollAndTapToRefresh = "Scroll or tap to load"; 25 | 26 | loadMore = "Loading..."; 27 | 28 | releaseLoadMore = "Release to load more"; 29 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/failure@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandRefresh/Resource/failure@3x.png -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/success@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandRefresh/Resource/success@3x.png -------------------------------------------------------------------------------- /Library/GrandKit/GrandRefresh/Resource/zh-Hans.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "下拉可以刷新"; 9 | 10 | releaseToRefresh = "松开立即刷新"; 11 | 12 | refreshSuccess = "刷新成功"; 13 | 14 | refreshFailure = "刷新失败"; 15 | 16 | refreshing = "正在刷新数据中..."; 17 | 18 | pullUpToRefresh = "上拉加载更多数据"; 19 | 20 | noMoreData = "真没有了,哥!"; 21 | 22 | tapToRefresh = "点击加载更多"; 23 | 24 | scrollAndTapToRefresh = "上拉或点击加载更多"; 25 | 26 | loadMore = "正在加载..."; 27 | 28 | releaseLoadMore = "松开加载更多"; 29 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AvailableLibraries 6 | 7 | 8 | LibraryIdentifier 9 | ios-x86_64-simulator 10 | LibraryPath 11 | MMKV.framework 12 | SupportedArchitectures 13 | 14 | x86_64 15 | 16 | SupportedPlatform 17 | ios 18 | SupportedPlatformVariant 19 | simulator 20 | 21 | 22 | LibraryIdentifier 23 | ios-arm64_armv7 24 | LibraryPath 25 | MMKV.framework 26 | SupportedArchitectures 27 | 28 | arm64 29 | armv7 30 | 31 | SupportedPlatform 32 | ios 33 | 34 | 35 | CFBundlePackageType 36 | XFWK 37 | XCFrameworkFormatVersion 38 | 1.0 39 | 40 | 41 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-arm64_armv7/MMKV.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandStore/MMKV.xcframework/ios-arm64_armv7/MMKV.framework/Info.plist -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-arm64_armv7/MMKV.framework/MMKV: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandStore/MMKV.xcframework/ios-arm64_armv7/MMKV.framework/MMKV -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-arm64_armv7/MMKV.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module MMKV { 2 | umbrella header "MMKV.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-x86_64-simulator/MMKV.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandStore/MMKV.xcframework/ios-x86_64-simulator/MMKV.framework/Info.plist -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-x86_64-simulator/MMKV.framework/MMKV: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/GrandKit/GrandStore/MMKV.xcframework/ios-x86_64-simulator/MMKV.framework/MMKV -------------------------------------------------------------------------------- /Library/GrandKit/GrandStore/MMKV.xcframework/ios-x86_64-simulator/MMKV.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module MMKV { 2 | umbrella header "MMKV.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Library/MJRefresh/Base/MJRefreshAutoFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoFooter : MJRefreshFooter 14 | /** 是否自动刷新(默认为YES) */ 15 | @property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh; 16 | 17 | /** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ 18 | @property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated("请使用triggerAutomaticallyRefreshPercent属性"); 19 | 20 | /** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ 21 | @property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent; 22 | 23 | /** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效, 24 | 25 | 如果为 -1, 则为无限触发 26 | */ 27 | @property (nonatomic) NSInteger autoTriggerTimes; 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /Library/MJRefresh/Base/MJRefreshBackFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackFooter : MJRefreshFooter 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /Library/MJRefresh/Base/MJRefreshFooter.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // MJRefreshFooter.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/5. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 上拉刷新控件 9 | 10 | #import "MJRefreshComponent.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MJRefreshFooter : MJRefreshComponent 15 | /** 创建footer */ 16 | + (instancetype)footerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; 17 | /** 创建footer */ 18 | + (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; 19 | 20 | /** 提示没有更多的数据 */ 21 | - (void)endRefreshingWithNoMoreData; 22 | - (void)noticeNoMoreData MJRefreshDeprecated("使用endRefreshingWithNoMoreData"); 23 | 24 | /** 重置没有更多的数据(消除没有更多数据的状态) */ 25 | - (void)resetNoMoreData; 26 | 27 | /** 忽略多少scrollView的contentInset的bottom */ 28 | @property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom; 29 | 30 | /** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏。默认是NO) */ 31 | @property (assign, nonatomic, getter=isAutomaticallyHidden) BOOL automaticallyHidden MJRefreshDeprecated("已废弃此属性,开发者请自行控制footer的显示和隐藏"); 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /Library/MJRefresh/Base/MJRefreshFooter.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // MJRefreshFooter.m 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/5. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 9 | 10 | #import "MJRefreshFooter.h" 11 | #include "UIScrollView+MJRefresh.h" 12 | 13 | @interface MJRefreshFooter() 14 | 15 | @end 16 | 17 | @implementation MJRefreshFooter 18 | #pragma mark - 构造方法 19 | + (instancetype)footerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock 20 | { 21 | MJRefreshFooter *cmp = [[self alloc] init]; 22 | cmp.refreshingBlock = refreshingBlock; 23 | return cmp; 24 | } 25 | + (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action 26 | { 27 | MJRefreshFooter *cmp = [[self alloc] init]; 28 | [cmp setRefreshingTarget:target refreshingAction:action]; 29 | return cmp; 30 | } 31 | 32 | #pragma mark - 重写父类的方法 33 | - (void)prepare 34 | { 35 | [super prepare]; 36 | 37 | // 设置自己的高度 38 | self.mj_h = MJRefreshFooterHeight; 39 | 40 | // 默认不会自动隐藏 41 | // self.automaticallyHidden = NO; 42 | } 43 | 44 | #pragma mark - 公共方法 45 | - (void)endRefreshingWithNoMoreData 46 | { 47 | MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateNoMoreData;) 48 | } 49 | 50 | - (void)noticeNoMoreData 51 | { 52 | [self endRefreshingWithNoMoreData]; 53 | } 54 | 55 | - (void)resetNoMoreData 56 | { 57 | MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;) 58 | } 59 | 60 | - (void)setAutomaticallyHidden:(BOOL)automaticallyHidden 61 | { 62 | _automaticallyHidden = automaticallyHidden; 63 | } 64 | @end 65 | -------------------------------------------------------------------------------- /Library/MJRefresh/Base/MJRefreshHeader.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // MJRefreshHeader.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/4. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 下拉刷新控件:负责监控用户下拉的状态 9 | 10 | #import "MJRefreshComponent.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MJRefreshHeader : MJRefreshComponent 15 | /** 创建header */ 16 | + (instancetype)headerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; 17 | /** 创建header */ 18 | + (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; 19 | 20 | /** 这个key用来存储上一次下拉刷新成功的时间 */ 21 | @property (copy, nonatomic) NSString *lastUpdatedTimeKey; 22 | /** 上一次下拉刷新成功的时间 */ 23 | @property (strong, nonatomic, readonly, nullable) NSDate *lastUpdatedTime; 24 | 25 | /** 忽略多少scrollView的contentInset的top */ 26 | @property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoGifFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoGifFooter : MJRefreshAutoStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoNormalFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoNormalFooter : MJRefreshAutoStateFooter 14 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 15 | 16 | /** 菊花的样式 */ 17 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 18 | @end 19 | 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoStateFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/6/13. 6 | // Copyright © 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoStateFooter : MJRefreshAutoFooter 14 | /** 文字距离圈圈、箭头的距离 */ 15 | @property (assign, nonatomic) CGFloat labelLeftInset; 16 | /** 显示刷新状态的label */ 17 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 18 | 19 | /** 设置state状态下的文字 */ 20 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 21 | 22 | /** 隐藏刷新状态的文字 */ 23 | @property (assign, nonatomic, getter=isRefreshingTitleHidden) BOOL refreshingTitleHidden; 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackGifFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackGifFooter : MJRefreshBackStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackNormalFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackNormalFooter : MJRefreshBackStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *arrowView; 15 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 16 | 17 | /** 菊花的样式 */ 18 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackStateFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/6/13. 6 | // Copyright © 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackStateFooter : MJRefreshBackFooter 14 | /** 文字距离圈圈、箭头的距离 */ 15 | @property (assign, nonatomic) CGFloat labelLeftInset; 16 | /** 显示刷新状态的label */ 17 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 18 | /** 设置state状态下的文字 */ 19 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 20 | 21 | /** 获取state状态下的title */ 22 | - (NSString *)titleForState:(MJRefreshState)state; 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Header/MJRefreshGifHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshGifHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshStateHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshGifHeader : MJRefreshStateHeader 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Header/MJRefreshNormalHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshNormalHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshStateHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshNormalHeader : MJRefreshStateHeader 14 | @property (weak, nonatomic, readonly) UIImageView *arrowView; 15 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 16 | 17 | 18 | /** 菊花的样式 */ 19 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /Library/MJRefresh/Custom/Header/MJRefreshStateHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshStateHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshStateHeader : MJRefreshHeader 14 | #pragma mark - 刷新时间相关 15 | /** 利用这个block来决定显示的更新时间文字 */ 16 | @property (copy, nonatomic, nullable) NSString *(^lastUpdatedTimeText)(NSDate * _Nullable lastUpdatedTime); 17 | /** 显示上一次刷新时间的label */ 18 | @property (weak, nonatomic, readonly) UILabel *lastUpdatedTimeLabel; 19 | 20 | #pragma mark - 状态相关 21 | /** 文字距离圈圈、箭头的距离 */ 22 | @property (assign, nonatomic) CGFloat labelLeftInset; 23 | /** 显示刷新状态的label */ 24 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 25 | /** 设置state状态下的文字 */ 26 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/MJRefresh/MJRefresh.bundle/arrow@2x.png -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "MJRefreshHeaderIdleText" = "아래로 당겨 새로고침"; 2 | "MJRefreshHeaderPullingText" = "놓으면 새로고침"; 3 | "MJRefreshHeaderRefreshingText" = "로딩중..."; 4 | 5 | "MJRefreshAutoFooterIdleText" = "탭 또는 위로 당겨 로드함"; 6 | "MJRefreshAutoFooterRefreshingText" = "로딩중..."; 7 | "MJRefreshAutoFooterNoMoreDataText" = "더이상 데이터 없음"; 8 | 9 | "MJRefreshBackFooterIdleText" = "위로 당겨 더 로드 가능"; 10 | "MJRefreshBackFooterPullingText" = "놓으면 더 로드됨."; 11 | "MJRefreshBackFooterRefreshingText" = "로딩중..."; 12 | "MJRefreshBackFooterNoMoreDataText" = "더이상 데이터 없음"; 13 | 14 | "MJRefreshHeaderLastTimeText" = "마지막 업데이트: "; 15 | "MJRefreshHeaderDateTodayText" = "오늘"; 16 | "MJRefreshHeaderNoneLastDateText" = "기록 없음"; 17 | -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "MJRefreshHeaderIdleText" = "下拉可以刷新"; 2 | "MJRefreshHeaderPullingText" = "鬆開立即刷新"; 3 | "MJRefreshHeaderRefreshingText" = "正在刷新數據中..."; 4 | 5 | "MJRefreshAutoFooterIdleText" = "點擊或上拉加載更多"; 6 | "MJRefreshAutoFooterRefreshingText" = "正在加載更多的數據..."; 7 | "MJRefreshAutoFooterNoMoreDataText" = "已經全部加載完畢"; 8 | 9 | "MJRefreshBackFooterIdleText" = "上拉可以加載更多"; 10 | "MJRefreshBackFooterPullingText" = "鬆開立即加載更多"; 11 | "MJRefreshBackFooterRefreshingText" = "正在加載更多的數據..."; 12 | "MJRefreshBackFooterNoMoreDataText" = "已經全部加載完畢"; 13 | 14 | "MJRefreshHeaderLastTimeText" = "最後更新:"; 15 | "MJRefreshHeaderDateTodayText" = "今天"; 16 | "MJRefreshHeaderNoneLastDateText" = "無記錄"; 17 | -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | 4 | #import "UIScrollView+MJRefresh.h" 5 | #import "UIScrollView+MJExtension.h" 6 | #import "UIView+MJExtension.h" 7 | 8 | #import "MJRefreshNormalHeader.h" 9 | #import "MJRefreshGifHeader.h" 10 | 11 | #import "MJRefreshBackNormalFooter.h" 12 | #import "MJRefreshBackGifFooter.h" 13 | #import "MJRefreshAutoNormalFooter.h" 14 | #import "MJRefreshAutoGifFooter.h" -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefreshConfig.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshConfig.h 3 | // 4 | // Created by Frank on 2018/11/27. 5 | // Copyright © 2018 小码哥. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface MJRefreshConfig : NSObject 13 | 14 | /** 默认使用的语言版本, 默认为 nil. 将随系统的语言自动改变 */ 15 | @property (copy, nonatomic, nullable) NSString *languageCode; 16 | 17 | /** @return Singleton Config instance */ 18 | + (instancetype)defaultConfig; 19 | 20 | - (instancetype)init NS_UNAVAILABLE; 21 | + (instancetype)new NS_UNAVAILABLE; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefreshConfig.m: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshConfig.m 3 | // 4 | // Created by Frank on 2018/11/27. 5 | // Copyright © 2018 小码哥. All rights reserved. 6 | // 7 | 8 | #import "MJRefreshConfig.h" 9 | 10 | @implementation MJRefreshConfig 11 | 12 | static MJRefreshConfig *mj_RefreshConfig = nil; 13 | 14 | + (instancetype)defaultConfig { 15 | static dispatch_once_t onceToken; 16 | dispatch_once(&onceToken, ^{ 17 | mj_RefreshConfig = [[self alloc] init]; 18 | }); 19 | return mj_RefreshConfig; 20 | } 21 | 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Library/MJRefresh/MJRefreshConst.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | #import 4 | 5 | const CGFloat MJRefreshLabelLeftInset = 25; 6 | const CGFloat MJRefreshHeaderHeight = 54.0; 7 | const CGFloat MJRefreshFooterHeight = 44.0; 8 | const CGFloat MJRefreshFastAnimationDuration = 0.25; 9 | const CGFloat MJRefreshSlowAnimationDuration = 0.4; 10 | 11 | NSString *const MJRefreshKeyPathContentOffset = @"contentOffset"; 12 | NSString *const MJRefreshKeyPathContentInset = @"contentInset"; 13 | NSString *const MJRefreshKeyPathContentSize = @"contentSize"; 14 | NSString *const MJRefreshKeyPathPanState = @"state"; 15 | 16 | NSString *const MJRefreshHeaderLastUpdatedTimeKey = @"MJRefreshHeaderLastUpdatedTimeKey"; 17 | 18 | NSString *const MJRefreshHeaderIdleText = @"MJRefreshHeaderIdleText"; 19 | NSString *const MJRefreshHeaderPullingText = @"MJRefreshHeaderPullingText"; 20 | NSString *const MJRefreshHeaderRefreshingText = @"MJRefreshHeaderRefreshingText"; 21 | 22 | NSString *const MJRefreshAutoFooterIdleText = @"MJRefreshAutoFooterIdleText"; 23 | NSString *const MJRefreshAutoFooterRefreshingText = @"MJRefreshAutoFooterRefreshingText"; 24 | NSString *const MJRefreshAutoFooterNoMoreDataText = @"MJRefreshAutoFooterNoMoreDataText"; 25 | 26 | NSString *const MJRefreshBackFooterIdleText = @"MJRefreshBackFooterIdleText"; 27 | NSString *const MJRefreshBackFooterPullingText = @"MJRefreshBackFooterPullingText"; 28 | NSString *const MJRefreshBackFooterRefreshingText = @"MJRefreshBackFooterRefreshingText"; 29 | NSString *const MJRefreshBackFooterNoMoreDataText = @"MJRefreshBackFooterNoMoreDataText"; 30 | 31 | NSString *const MJRefreshHeaderLastTimeText = @"MJRefreshHeaderLastTimeText"; 32 | NSString *const MJRefreshHeaderDateTodayText = @"MJRefreshHeaderDateTodayText"; 33 | NSString *const MJRefreshHeaderNoneLastDateText = @"MJRefreshHeaderNoneLastDateText"; -------------------------------------------------------------------------------- /Library/MJRefresh/NSBundle+MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSBundle+MJRefresh.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 16/6/13. 6 | // Copyright © 2016年 小码哥. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSBundle (MJRefresh) 14 | + (instancetype)mj_refreshBundle; 15 | + (UIImage *)mj_arrowImage; 16 | + (NSString *)mj_localizedStringForKey:(NSString *)key value:(nullable NSString *)value; 17 | + (NSString *)mj_localizedStringForKey:(NSString *)key; 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Library/MJRefresh/UIScrollView+MJExtension.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIScrollView+Extension.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIScrollView (MJExtension) 15 | @property (readonly, nonatomic) UIEdgeInsets mj_inset; 16 | 17 | @property (assign, nonatomic) CGFloat mj_insetT; 18 | @property (assign, nonatomic) CGFloat mj_insetB; 19 | @property (assign, nonatomic) CGFloat mj_insetL; 20 | @property (assign, nonatomic) CGFloat mj_insetR; 21 | 22 | @property (assign, nonatomic) CGFloat mj_offsetX; 23 | @property (assign, nonatomic) CGFloat mj_offsetY; 24 | 25 | @property (assign, nonatomic) CGFloat mj_contentW; 26 | @property (assign, nonatomic) CGFloat mj_contentH; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /Library/MJRefresh/UIScrollView+MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIScrollView+MJRefresh.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/4. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 给ScrollView增加下拉刷新、上拉刷新的功能 9 | 10 | #import 11 | #import "MJRefreshConst.h" 12 | 13 | @class MJRefreshHeader, MJRefreshFooter; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @interface UIScrollView (MJRefresh) 18 | /** 下拉刷新控件 */ 19 | @property (strong, nonatomic, nullable) MJRefreshHeader *mj_header; 20 | @property (strong, nonatomic, nullable) MJRefreshHeader *header MJRefreshDeprecated("使用mj_header"); 21 | /** 上拉刷新控件 */ 22 | @property (strong, nonatomic, nullable) MJRefreshFooter *mj_footer; 23 | @property (strong, nonatomic, nullable) MJRefreshFooter *footer MJRefreshDeprecated("使用mj_footer"); 24 | 25 | #pragma mark - other 26 | - (NSInteger)mj_totalDataCount; 27 | 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /Library/MJRefresh/UIView+MJExtension.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIView+Extension.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIView (MJExtension) 15 | @property (assign, nonatomic) CGFloat mj_x; 16 | @property (assign, nonatomic) CGFloat mj_y; 17 | @property (assign, nonatomic) CGFloat mj_w; 18 | @property (assign, nonatomic) CGFloat mj_h; 19 | @property (assign, nonatomic) CGSize mj_size; 20 | @property (assign, nonatomic) CGPoint mj_origin; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Library/MJRefresh/UIView+MJExtension.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIView+Extension.m 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import "UIView+MJExtension.h" 11 | 12 | @implementation UIView (MJExtension) 13 | - (void)setMj_x:(CGFloat)mj_x 14 | { 15 | CGRect frame = self.frame; 16 | frame.origin.x = mj_x; 17 | self.frame = frame; 18 | } 19 | 20 | - (CGFloat)mj_x 21 | { 22 | return self.frame.origin.x; 23 | } 24 | 25 | - (void)setMj_y:(CGFloat)mj_y 26 | { 27 | CGRect frame = self.frame; 28 | frame.origin.y = mj_y; 29 | self.frame = frame; 30 | } 31 | 32 | - (CGFloat)mj_y 33 | { 34 | return self.frame.origin.y; 35 | } 36 | 37 | - (void)setMj_w:(CGFloat)mj_w 38 | { 39 | CGRect frame = self.frame; 40 | frame.size.width = mj_w; 41 | self.frame = frame; 42 | } 43 | 44 | - (CGFloat)mj_w 45 | { 46 | return self.frame.size.width; 47 | } 48 | 49 | - (void)setMj_h:(CGFloat)mj_h 50 | { 51 | CGRect frame = self.frame; 52 | frame.size.height = mj_h; 53 | self.frame = frame; 54 | } 55 | 56 | - (CGFloat)mj_h 57 | { 58 | return self.frame.size.height; 59 | } 60 | 61 | - (void)setMj_size:(CGSize)mj_size 62 | { 63 | CGRect frame = self.frame; 64 | frame.size = mj_size; 65 | self.frame = frame; 66 | } 67 | 68 | - (CGSize)mj_size 69 | { 70 | return self.frame.size; 71 | } 72 | 73 | - (void)setMj_origin:(CGPoint)mj_origin 74 | { 75 | CGRect frame = self.frame; 76 | frame.origin = mj_origin; 77 | self.frame = frame; 78 | } 79 | 80 | - (CGPoint)mj_origin 81 | { 82 | return self.frame.origin; 83 | } 84 | @end 85 | -------------------------------------------------------------------------------- /Library/Media/ShadowCamera/ShadowCameraModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShadowCameraModel.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/6/24. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AVFoundation 11 | class ShadowCameraModel: NSObject { 12 | var previewView:UIView 13 | var preset:AVCaptureSession.Preset! 14 | var frameRate = 30 15 | var resolutionHeight = 1920 16 | var videoFormat:OSType 17 | var torchMode:AVCaptureDevice.TorchMode 18 | var focusMode:AVCaptureDevice.FocusMode 19 | var exposureMode:AVCaptureDevice.ExposureMode 20 | var flashMode:AVCaptureDevice.FlashMode 21 | var whiteBlackMode:AVCaptureDevice.WhiteBalanceMode 22 | var position:AVCaptureDevice.Position 23 | var videoGravity:AVLayerVideoGravity 24 | var videoOrientation:AVCaptureVideoOrientation 25 | var isEnableVideoStabilization:Bool 26 | 27 | init(previewView:UIView, 28 | preset:AVCaptureSession.Preset, 29 | frameRate:Int, 30 | resolutionHeight:Int, 31 | videoFormat:OSType, 32 | torchMode:AVCaptureDevice.TorchMode, 33 | focusMode:AVCaptureDevice.FocusMode, 34 | exposureMode:AVCaptureDevice.ExposureMode, 35 | flashMode:AVCaptureDevice.FlashMode, 36 | whiteBlackMode:AVCaptureDevice.WhiteBalanceMode, 37 | position:AVCaptureDevice.Position, 38 | videoGravity:AVLayerVideoGravity, 39 | videoOrientation:AVCaptureVideoOrientation, 40 | isEnableVideoStabilization:Bool) { 41 | self.previewView = previewView 42 | self.preset = preset 43 | self.frameRate = frameRate 44 | self.resolutionHeight = resolutionHeight 45 | self.videoFormat = videoFormat 46 | self.torchMode = torchMode 47 | self.focusMode = focusMode 48 | self.exposureMode = exposureMode 49 | self.flashMode = flashMode 50 | self.whiteBlackMode = whiteBlackMode 51 | self.position = position 52 | self.videoGravity = videoGravity 53 | self.videoOrientation = videoOrientation 54 | self.isEnableVideoStabilization = isEnableVideoStabilization 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Library/Media/ShadowPlayer/ShadowVideoPlayControlView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShadowPlayView.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/5/21. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | class ShadowVideoPlayControlView: UIView { 11 | let btnImage = UIButton() 12 | var playBlock:((_ view:ShadowVideoPlayControlView,_ state:Bool)->Void)? 13 | var state = false 14 | 15 | override init(frame: CGRect) { 16 | super.init(frame: frame) 17 | btnImage.addTarget(self, action: #selector(handleImageTapAction(sender:)), for: .touchUpInside) 18 | addSubview(btnImage) 19 | btnImage.snp.makeConstraints { (m) in 20 | m.edges.equalTo(self) 21 | } 22 | } 23 | 24 | required init?(coder aDecoder: NSCoder) { 25 | fatalError("init(coder:) has not been implemented") 26 | } 27 | 28 | override func draw(_ rect: CGRect) { 29 | btnImage.setImage(#imageLiteral(resourceName: "play"), for: .normal) 30 | btnImage.showsTouchWhenHighlighted = true 31 | btnImage.setImage(#imageLiteral(resourceName: "pause"), for: .selected) 32 | } 33 | 34 | @objc func handleImageTapAction(sender:UIButton) { 35 | sender.isSelected = !sender.isSelected 36 | state = btnImage.isSelected 37 | playBlock?(self,state) 38 | } 39 | 40 | deinit { 41 | Log(message: "\(type(of:self))已经被回收了") 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Library/Media/ShadowPlayer/ShadowVideoPlayerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShadowPlayerViewController.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/5/22. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | //http://download.3g.joy.cn/video/236/60236937/1451280942752_hd.mp4 11 | class ShadowVideoPlayerViewController: UIViewController { 12 | var url:URL? 13 | var videoTitle:String?{ 14 | didSet{ 15 | player.title = videoTitle ?? "" 16 | } 17 | } 18 | let btnClose = UIButton() 19 | 20 | var player : ShadowVideoPlayerView! = nil 21 | override func viewDidLoad() { 22 | super.viewDidLoad() 23 | view.backgroundColor = UIColor.black 24 | assert(navigationController == nil, "你不能Navigation到这个页面") 25 | assert(url != nil, "videl url can not be nil") 26 | player = ShadowVideoPlayerView(frame: CGRect(), url: url!) 27 | 28 | player.title = url!.lastPathComponent 29 | player.backgroundColor = UIColor.black 30 | view.addSubview(player) 31 | player.snp.makeConstraints { (m) in 32 | m.left.right.equalTo(0) 33 | m.top.equalTo(80) 34 | m.bottom.equalTo(-50) 35 | } 36 | 37 | btnClose.setImage(#imageLiteral(resourceName: "icon_close"), for: .normal) 38 | view.addSubview(btnClose) 39 | btnClose.snp.makeConstraints { (m) in 40 | m.left.equalTo(10) 41 | m.top.equalTo(46) 42 | } 43 | btnClose.addTarget(self, action: #selector(close), for: .touchUpInside) 44 | 45 | 46 | 47 | } 48 | 49 | override func viewDidDisappear(_ animated: Bool) { 50 | super.viewDidDisappear(animated) 51 | player.stop() 52 | } 53 | 54 | @objc func close() { 55 | dismiss(animated: true, completion: nil) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Library/Media/VideoRecord/CameraModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CameraModel.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/6/3. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AVFoundation 11 | class CameraModel: NSObject { 12 | var previewView:UIView? 13 | var preset:AVCaptureSession.Preset! 14 | var frameRate = 30 15 | var resolutionHeight = 1920 16 | var videoFormat:OSType 17 | var torchMode:AVCaptureDevice.TorchMode 18 | var focusMode:AVCaptureDevice.FocusMode 19 | var exposureMode:AVCaptureDevice.ExposureMode 20 | var flashMode:AVCaptureDevice.FlashMode 21 | var whiteBlackMode:AVCaptureDevice.WhiteBalanceMode 22 | var position:AVCaptureDevice.Position 23 | var videoGravity:AVLayerVideoGravity 24 | var videoOrientation:AVCaptureVideoOrientation 25 | var isEnableVideoStabilization:Bool 26 | 27 | init(preset:AVCaptureSession.Preset, 28 | frameRate:Int, 29 | resolutionHeight:Int, 30 | videoFormat:OSType, 31 | torchMode:AVCaptureDevice.TorchMode, 32 | focusMode:AVCaptureDevice.FocusMode, 33 | exposureMode:AVCaptureDevice.ExposureMode, 34 | flashMode:AVCaptureDevice.FlashMode, 35 | whiteBlackMode:AVCaptureDevice.WhiteBalanceMode, 36 | position:AVCaptureDevice.Position, 37 | videoGravity:AVLayerVideoGravity, 38 | videoOrientation:AVCaptureVideoOrientation, 39 | isEnableVideoStabilization:Bool) { 40 | self.preset = preset 41 | self.frameRate = frameRate 42 | self.resolutionHeight = resolutionHeight 43 | self.videoFormat = videoFormat 44 | self.torchMode = torchMode 45 | self.focusMode = focusMode 46 | self.exposureMode = exposureMode 47 | self.flashMode = flashMode 48 | self.whiteBlackMode = whiteBlackMode 49 | self.position = position 50 | self.videoGravity = videoGravity 51 | self.videoOrientation = videoOrientation 52 | self.isEnableVideoStabilization = isEnableVideoStabilization 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Library/Media/VideoRecord/FocusFrameView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FocusFrameView.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/6/4. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class FocusFrameView:UIView { 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | 15 | layer.borderWidth = 2 16 | layer.borderColor = UIColor.blue.cgColor 17 | 18 | } 19 | 20 | required init?(coder aDecoder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | func startToFocus(point:CGPoint,view:UIView) { 25 | 26 | view.addSubview(self) 27 | self.center = point 28 | let scaleAn = CABasicAnimation(keyPath: "transform.scale") 29 | scaleAn.isRemovedOnCompletion = false 30 | scaleAn.fromValue = 2 31 | scaleAn.toValue = 1 32 | scaleAn.setValue("scale", forKey: "name") 33 | scaleAn.delegate = self 34 | layer.add(scaleAn, forKey: nil) 35 | 36 | //再来个闪 37 | 38 | } 39 | } 40 | extension FocusFrameView:CAAnimationDelegate{ 41 | func animationDidStart(_ anim: CAAnimation) { 42 | print("动画开始调用") 43 | } 44 | 45 | func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 46 | if flag { 47 | print("动画完成调用") 48 | let name = anim.value(forKey: "name") as! String 49 | if name == "fade"{ 50 | removeFromSuperview() 51 | } 52 | else{ 53 | let fade = CABasicAnimation(keyPath: "opacity") 54 | fade.fromValue = 1 55 | fade.toValue = 0 56 | fade.repeatCount = 2 57 | fade.delegate = self 58 | fade.setValue("fade", forKey: "name") 59 | layer.add(fade, forKey: nil)//结束后来一个动画 60 | } 61 | } 62 | else{ 63 | print("动画没有完成调用") 64 | 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Library/Model/LogInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogInfo.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 24/03/2018. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | struct LogInfo:JsonValue { 12 | var id = 0 13 | var time = 0 14 | var logText = "" 15 | } 16 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/NSBundle+TZImagePicker.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSBundle+TZImagePicker.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 16/08/18. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSBundle (TZImagePicker) 12 | 13 | + (NSBundle *)tz_imagePickerBundle; 14 | 15 | + (NSString *)tz_localizedStringForKey:(NSString *)key value:(NSString *)value; 16 | + (NSString *)tz_localizedStringForKey:(NSString *)key; 17 | 18 | @end 19 | 20 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/NSBundle+TZImagePicker.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSBundle+TZImagePicker.m 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 16/08/18. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import "NSBundle+TZImagePicker.h" 10 | #import "TZImagePickerController.h" 11 | 12 | @implementation NSBundle (TZImagePicker) 13 | 14 | + (NSBundle *)tz_imagePickerBundle { 15 | NSBundle *bundle = [NSBundle bundleForClass:[TZImagePickerController class]]; 16 | NSURL *url = [bundle URLForResource:@"TZImagePickerController" withExtension:@"bundle"]; 17 | bundle = [NSBundle bundleWithURL:url]; 18 | return bundle; 19 | } 20 | 21 | + (NSString *)tz_localizedStringForKey:(NSString *)key { 22 | return [self tz_localizedStringForKey:key value:@""]; 23 | } 24 | 25 | + (NSString *)tz_localizedStringForKey:(NSString *)key value:(NSString *)value { 26 | NSBundle *bundle = [TZImagePickerConfig sharedInstance].languageBundle; 27 | NSString *value1 = [bundle localizedStringForKey:key value:value table:nil]; 28 | return value1; 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZAssetModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZAssetModel.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 15/12/24. 6 | // Copyright © 2015年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | typedef enum : NSUInteger { 13 | TZAssetModelMediaTypePhoto = 0, 14 | TZAssetModelMediaTypeLivePhoto, 15 | TZAssetModelMediaTypePhotoGif, 16 | TZAssetModelMediaTypeVideo, 17 | TZAssetModelMediaTypeAudio 18 | } TZAssetModelMediaType; 19 | 20 | @class PHAsset; 21 | @interface TZAssetModel : NSObject 22 | 23 | @property (nonatomic, strong) PHAsset *asset; 24 | @property (nonatomic, assign) BOOL isSelected; ///< The select status of a photo, default is No 25 | @property (nonatomic, assign) TZAssetModelMediaType type; 26 | @property (nonatomic, copy) NSString *timeLength; 27 | 28 | /// Init a photo dataModel With a PHAsset 29 | /// 用一个PHAsset实例,初始化一个照片模型 30 | + (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type; 31 | + (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength; 32 | 33 | @end 34 | 35 | 36 | @class PHFetchResult; 37 | @interface TZAlbumModel : NSObject 38 | 39 | @property (nonatomic, strong) NSString *name; ///< The album name 40 | @property (nonatomic, assign) NSInteger count; ///< Count of photos the album contain 41 | @property (nonatomic, strong) PHFetchResult *result; 42 | 43 | @property (nonatomic, strong) NSArray *models; 44 | @property (nonatomic, strong) NSArray *selectedModels; 45 | @property (nonatomic, assign) NSUInteger selectedCount; 46 | 47 | @property (nonatomic, assign) BOOL isCameraRoll; 48 | 49 | - (void)setResult:(PHFetchResult *)result needFetchAssets:(BOOL)needFetchAssets; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZAssetModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // TZAssetModel.m 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 15/12/24. 6 | // Copyright © 2015年 谭真. All rights reserved. 7 | // 8 | 9 | #import "TZAssetModel.h" 10 | #import "TZImageManager.h" 11 | 12 | @implementation TZAssetModel 13 | 14 | + (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type{ 15 | TZAssetModel *model = [[TZAssetModel alloc] init]; 16 | model.asset = asset; 17 | model.isSelected = NO; 18 | model.type = type; 19 | return model; 20 | } 21 | 22 | + (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength { 23 | TZAssetModel *model = [self modelWithAsset:asset type:type]; 24 | model.timeLength = timeLength; 25 | return model; 26 | } 27 | 28 | @end 29 | 30 | 31 | 32 | @implementation TZAlbumModel 33 | 34 | - (void)setResult:(PHFetchResult *)result needFetchAssets:(BOOL)needFetchAssets { 35 | _result = result; 36 | if (needFetchAssets) { 37 | [[TZImageManager manager] getAssetsFromFetchResult:result completion:^(NSArray *models) { 38 | self->_models = models; 39 | if (self->_selectedModels) { 40 | [self checkSelectedModels]; 41 | } 42 | }]; 43 | } 44 | } 45 | 46 | - (void)setSelectedModels:(NSArray *)selectedModels { 47 | _selectedModels = selectedModels; 48 | if (_models) { 49 | [self checkSelectedModels]; 50 | } 51 | } 52 | 53 | - (void)checkSelectedModels { 54 | self.selectedCount = 0; 55 | NSMutableSet *selectedAssets = [NSMutableSet setWithCapacity:_selectedModels.count]; 56 | for (TZAssetModel *model in _selectedModels) { 57 | [selectedAssets addObject:model.asset]; 58 | } 59 | for (TZAssetModel *model in _models) { 60 | if ([selectedAssets containsObject:model.asset]) { 61 | self.selectedCount ++; 62 | } 63 | } 64 | } 65 | 66 | - (NSString *)name { 67 | if (_name) { 68 | return _name; 69 | } 70 | return @""; 71 | } 72 | 73 | @end 74 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZGifPhotoPreviewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZGifPhotoPreviewController.h 3 | // TZImagePickerController 4 | // 5 | // Created by ttouch on 2016/12/13. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class TZAssetModel; 12 | @interface TZGifPhotoPreviewController : UIViewController 13 | 14 | @property (nonatomic, strong) TZAssetModel *model; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImageCropManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZImageCropManager.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 2016/12/5. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 图片裁剪管理类 8 | 9 | #import 10 | #import 11 | 12 | @interface TZImageCropManager : NSObject 13 | 14 | /// 裁剪框背景的处理 15 | + (void)overlayClippingWithView:(UIView *)view cropRect:(CGRect)cropRect containerView:(UIView *)containerView needCircleCrop:(BOOL)needCircleCrop; 16 | 17 | /* 18 | 1.7.2 为了解决多位同学对于图片裁剪的需求,我这两天有空便在研究图片裁剪 19 | 幸好有tuyou的PhotoTweaks库做参考,裁剪的功能实现起来简单许多 20 | 该方法和其内部引用的方法基本来自于tuyou的PhotoTweaks库,我做了稍许删减和修改 21 | 感谢tuyou同学在github开源了优秀的裁剪库PhotoTweaks,表示感谢 22 | PhotoTweaks库的github链接:https://github.com/itouch2/PhotoTweaks 23 | */ 24 | /// 获得裁剪后的图片 25 | + (UIImage *)cropImageView:(UIImageView *)imageView toRect:(CGRect)rect zoomScale:(double)zoomScale containerView:(UIView *)containerView; 26 | 27 | /// 获取圆形图片 28 | + (UIImage *)circularClipImage:(UIImage *)image; 29 | 30 | @end 31 | 32 | 33 | /// 该分类的代码来自SDWebImage:https://github.com/rs/SDWebImage 34 | /// 为了防止冲突,我将分类名字和方法名字做了修改 35 | @interface UIImage (TZGif) 36 | 37 | + (UIImage *)sd_tz_animatedGIFWithData:(NSData *)data; 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/MMVideoPreviewPlay@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/MMVideoPreviewPlay@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/MMVideoPreviewPlayHL@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/MMVideoPreviewPlayHL@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/VideoSendIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/VideoSendIcon@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "阿拉伯语"; 2 | "OK" = "حسنا"; 3 | "Back" = "الى الخلف"; 4 | "Done" = "فعله"; 5 | "Sorry" = "آسف"; 6 | "Cancel" = "إلغاء"; 7 | "Setting" = "ضبط"; 8 | "Photos" = "الصور"; 9 | "Videos" = "أشرطة فيديو"; 10 | "Preview" = "معاينة"; 11 | "Full image" = "الصورة كاملة"; 12 | "Processing..." = "معالجة..."; 13 | "No Photos or Videos" = "لا توجد صور أو مقاطع فيديو"; 14 | "Synchronizing photos from iCloud" = "مزامنة الصور من iCloud"; 15 | "Can not use camera" = "لا يمكن استخدام الكاميرا"; 16 | "Can not choose both video and photo" = "لا يمكن اختيار كل من الفيديو والصور"; 17 | "Can not choose both photo and GIF" = "لا يمكن اختيار كل من الصور و GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "حدد مقطع الفيديو عندما يكون في حالة متعددة، وسنعمل على معالجة مقطع الفيديو كصورة"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "إذا تعذّر الانتقال إلى صفحة "إعدادات الخصوصية"، فيرجى الانتقال إلى صفحة "الإعدادات" بنفسك، شكرًا لك"; 20 | "Select a maximum of %zd photos" = "حدد فقط ما يصل إلى %zd صورة"; 21 | "Select a minimum of %zd photos" = "الرجاء تحديد %zd صورة على الأقل"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "السماح لـ %@ بالوصول إلى الألبوم في \"الإعدادات > الخصوصية > الصور\""; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "الرجاء السماح لـ %@ بالوصول إلى الكاميرا في \"الإعدادات > الخصوصية > الكاميرا\""; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/bg.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "保加利亚语"; 2 | "OK" = "Добре"; 3 | "Back" = "обратно"; 4 | "Done" = "Свършен"; 5 | "Sorry" = "съжалявам"; 6 | "Cancel" = "Отказ"; 7 | "Setting" = "обстановка"; 8 | "Photos" = "Снимки"; 9 | "Videos" = "Видео"; 10 | "Preview" = "предварителен преглед"; 11 | "Full image" = "Пълно изображение"; 12 | "Processing..." = "Обработка ..."; 13 | "No Photos or Videos" = "Няма снимки или видеоклипове"; 14 | "Synchronizing photos from iCloud" = "Синхронизиране на снимки от iCloud"; 15 | "Can not use camera" = "Не може да се използва камера"; 16 | "Can not choose both video and photo" = "Не можете да изберете видео и снимка"; 17 | "Can not choose both photo and GIF" = "Не може да се избере снимка и GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/cs-CZ.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "捷克语"; 2 | "OK" = "OK"; 3 | "Back" = "Zadní"; 4 | "Done" = "Hotovo"; 5 | "Sorry" = "Promiňte"; 6 | "Cancel" = "zrušení"; 7 | "Setting" = "Nastavení"; 8 | "Photos" = "Fotky"; 9 | "Videos" = "Videa"; 10 | "Preview" = "Náhled"; 11 | "Full image" = "Celý obrázek"; 12 | "Processing..." = "Zpracovává se..."; 13 | "No Photos or Videos" = "Žádné fotky nebo videa"; 14 | "Synchronizing photos from iCloud" = "Synchronizace fotografií z iCloud"; 15 | "Can not use camera" = "Nelze použít fotoaparát"; 16 | "Can not choose both video and photo" = "Nelze vybrat video ani fotografii"; 17 | "Can not choose both photo and GIF" = "Nelze vybrat fotografie a GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "德语"; 2 | "OK" = "OK"; 3 | "Back" = "Zurück"; 4 | "Done" = "Erledigt"; 5 | "Sorry" = "Es tut uns leid"; 6 | "Cancel" = "Stornieren"; 7 | "Setting" = "Rahmen"; 8 | "Photos" = "Fotos"; 9 | "Videos" = "Videos"; 10 | "Preview" = "Vorschau"; 11 | "Full image" = "Vollbild"; 12 | "Processing..." = "Wird bearbeitet..."; 13 | "No Photos or Videos" = "Keine Fotos oder Videos"; 14 | "Synchronizing photos from iCloud" = "Fotos aus iCloud synchronisieren"; 15 | "Can not use camera" = "Kann die Kamera nicht benutzen"; 16 | "Can not choose both video and photo" = "Video und Foto können nicht ausgewählt werden"; 17 | "Can not choose both photo and GIF" = "Foto und GIF können nicht ausgewählt werden"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "Wenn Sie das Video im Multi-Status auswählen, wird es als Foto behandelt"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "Sie können nicht zur Seite mit den Datenschutz-Einstellungen springen; bitte navigieren Sie selbst zur Einstellungsseite. Vielen Dank."; 20 | "Select a maximum of %zd photos" = "Wählen Sie maximal %zd Bilder aus"; 21 | "Select a minimum of %zd photos" = "Bitte wählen Sie mindestens %zd Fotos aus"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Erlauben Sie %@ den Zugriff auf Ihr Album unter: „Einstellungen > Datenschutz > Fotos“"; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Erlauben Sie %@ den Zugriff auf Ihre Kamera unter: „Einstellungen > Datenschutz > Kamera“"; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/el.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "希腊语"; 2 | "OK" = "Εντάξει"; 3 | "Back" = "Πίσω"; 4 | "Done" = "Εγινε"; 5 | "Sorry" = "Συγνώμη"; 6 | "Cancel" = "Ματαίωση"; 7 | "Setting" = "Σύνθεση"; 8 | "Photos" = "Φωτογραφίες"; 9 | "Videos" = "Βίντεο"; 10 | "Preview" = "Προεπισκόπηση"; 11 | "Full image" = "Πλήρης εικόνα"; 12 | "Processing..." = "Επεξεργασία..."; 13 | "No Photos or Videos" = "Δεν υπάρχουν φωτογραφίες ή βίντεο"; 14 | "Synchronizing photos from iCloud" = "Συγχρονισμός φωτογραφιών από το iCloud"; 15 | "Can not use camera" = "Δεν είναι δυνατή η χρήση της κάμερας"; 16 | "Can not choose both video and photo" = "Δεν είναι δυνατή η επιλογή του βίντεο και της φωτογραφίας"; 17 | "Can not choose both photo and GIF" = "Δεν είναι δυνατή η επιλογή φωτογραφίας και GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "西班牙语"; 2 | "OK" = "DE ACUERDO"; 3 | "Back" = "Espalda"; 4 | "Done" = "Hecho"; 5 | "Sorry" = "Lo siento"; 6 | "Cancel" = "Cancelar"; 7 | "Setting" = "Ajuste"; 8 | "Photos" = "Las fotos"; 9 | "Videos" = "Videos"; 10 | "Preview" = "Avance"; 11 | "Full image" = "Imagen completa"; 12 | "Processing..." = "Tratamiento..."; 13 | "No Photos or Videos" = "No hay fotos o videos"; 14 | "Synchronizing photos from iCloud" = "Sincronizando fotos desde iCloud"; 15 | "Can not use camera" = "No puedo usar la camara"; 16 | "Can not choose both video and photo" = "No se puede elegir tanto el video como la foto."; 17 | "Can not choose both photo and GIF" = "No se puede elegir tanto foto como GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "Seleccione el vídeo en estado múltiple, trataremos el vídeo como una fotografía"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "No se puede saltar a la página de ajustes de privacidad, vaya a la página de ajustes manualmente, muchas gracias"; 20 | "Select a maximum of %zd photos" = "Seleccione solamente hasta %zd imágenes"; 21 | "Select a minimum of %zd photos" = "Seleccione al menos %zd fotografías"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Permita que %@ acceda a su galería en \"Ajustes > Privacidad > Fotografías\""; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Permita que %@ acceda a su cámara en \"Ajustes > Privacidad > Cámara\""; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "法语"; 2 | "OK" = "D'accord"; 3 | "Back" = "Retour"; 4 | "Done" = "Terminé"; 5 | "Sorry" = "Pardon"; 6 | "Cancel" = "Annuler"; 7 | "Setting" = "Réglage"; 8 | "Photos" = "Photos"; 9 | "Videos" = "Vidéos"; 10 | "Preview" = "Aperçu"; 11 | "Full image" = "Image complète"; 12 | "Processing..." = "En traitement..."; 13 | "No Photos or Videos" = "Aucune photo ou vidéo"; 14 | "Synchronizing photos from iCloud" = "Synchroniser des photos depuis iCloud"; 15 | "Can not use camera" = "Impossible d'utiliser la caméra"; 16 | "Can not choose both video and photo" = "Impossible de choisir à la fois la vidéo et la photo"; 17 | "Can not choose both photo and GIF" = "Impossible de choisir à la fois photo et GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "Sélectionnez la vidéo lorsqu’elle est en état multiple, nous la traiterons comme une photo"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "Impossible d'ouvrir la page des paramètres de confidentialité, veuillez accéder vous-même à la page des paramètres, merci"; 20 | "Select a maximum of %zd photos" = "Vous pouvez uniquement sélectionner un maximum de %zd images"; 21 | "Select a minimum of %zd photos" = "Veuillez sélectionner un minimum de %zd photos"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Autorisez %@ à accéder à votre album dans « Paramètres > Confidentialité > Photos »"; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Autorisez %@ à accéder à votre appareil photo dans « Paramètres > Confidentialité > Appareil photo »"; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/he.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "希伯来语"; 2 | "OK" = "בסדר"; 3 | "Back" = "חזור"; 4 | "Done" = "בוצע"; 5 | "Sorry" = "מצטער"; 6 | "Cancel" = "בטל"; 7 | "Setting" = "הגדרה"; 8 | "Photos" = "תמונות"; 9 | "Videos" = "סרטונים"; 10 | "Preview" = "תצוגה מקדימה"; 11 | "Full image" = "תמונה מלאה"; 12 | "Processing..." = "מעבד..."; 13 | "No Photos or Videos" = "אין תמונות או סרטונים"; 14 | "Synchronizing photos from iCloud" = "סנכרון תמונות מ - iCloud"; 15 | "Can not use camera" = "לא ניתן להשתמש במצלמה"; 16 | "Can not choose both video and photo" = "לא ניתן לבחור הן בסרטון והן בתמונה"; 17 | "Can not choose both photo and GIF" = "לא ניתן לבחור גם תמונה וגם קובץ GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "意大利语"; 2 | "OK" = "ok"; 3 | "Back" = "Indietro"; 4 | "Done" = "Fatto"; 5 | "Sorry" = "scusate"; 6 | "Cancel" = "Annulla"; 7 | "Setting" = "Ambientazione"; 8 | "Photos" = "Fotografie"; 9 | "Videos" = "video"; 10 | "Preview" = "Anteprima"; 11 | "Full image" = "Immagine completa"; 12 | "Processing..." = "In lavorazione..."; 13 | "No Photos or Videos" = "Nessuna foto o video"; 14 | "Synchronizing photos from iCloud" = "Sincronizzazione delle foto da iCloud"; 15 | "Can not use camera" = "Non è possibile utilizzare la fotocamera"; 16 | "Can not choose both video and photo" = "Non è possibile scegliere sia video che foto"; 17 | "Can not choose both photo and GIF" = "Non è possibile scegliere sia foto che GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "日语"; 2 | "OK" = "OK"; 3 | "Back" = "バック"; 4 | "Done" = "完了"; 5 | "Sorry" = "ごめんなさい"; 6 | "Cancel" = "キャンセル"; 7 | "Setting" = "設定"; 8 | "Photos" = "写真"; 9 | "Videos" = "動画"; 10 | "Preview" = "プレビュー"; 11 | "Full image" = "フルイメージ"; 12 | "Processing..." = "処理..."; 13 | "No Photos or Videos" = "写真やビデオはありません"; 14 | "Synchronizing photos from iCloud" = "iCloudから写真を同期する"; 15 | "Can not use camera" = "カメラが使えない"; 16 | "Can not choose both video and photo" = "ビデオと写真の両方を選択することはできません"; 17 | "Can not choose both photo and GIF" = "写真とGIFの両方を選択することはできません"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "多肢選択の状態で、ビデオを選択すると、ビデオをデフォルトに画像として送信します。"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "プライバシー設定画面にジャンプできません。手動で設定画面を表示してください。"; 20 | "Select a maximum of %zd photos" = "写真は多くとも%zd 枚選択できます。"; 21 | "Select a minimum of %zd photos" = "少なくとも %zd 枚の写真を選択してください。"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "iPhoneの「設定-プライバシー-写真」のオプションで、r%@の携帯電話のアルバムへのアクセス権限を許可してください。"; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "iPhoneの「設定-プライバシー-カメラ」で、%@のカメラへのアクセス権限を許可してください。"; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ko-KP.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "朝鲜语"; 2 | "OK" = "그래"; 3 | "Back" = "뒤로"; 4 | "Done" = "완료"; 5 | "Sorry" = "미안해요"; 6 | "Cancel" = "취소"; 7 | "Setting" = "설정"; 8 | "Photos" = "사진"; 9 | "Videos" = "동영상"; 10 | "Preview" = "미리 보기"; 11 | "Full image" = "전체 이미지"; 12 | "Processing..." = "처리..."; 13 | "No Photos or Videos" = "아무 사진이 나 동영상"; 14 | "Synchronizing photos from iCloud" = "ICloud에서 사진을 동기화"; 15 | "Can not use camera" = "카메라를 사용할 수 없습니다."; 16 | "Can not choose both video and photo" = "비디오와 사진 둘 다를 선택할 수 없습니다."; 17 | "Can not choose both photo and GIF" = "사진 및 GIF를 선택할 수 없습니다."; 18 | "Select the video when in multi state, we will handle the video as a photo" = "다중 선택 모드에서 비디오를 선택하면 비디오를 사진으로 처리합니다."; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "개인 정보 보호 설정 페이지로 바로 이동할 수 없습니다. 설정 페이지로 직접 이동해 주세요. 감사합니다."; 20 | "Select a maximum of %zd photos" = "최대 %zd장의 이미지만 선택할 수 있습니다."; 21 | "Select a minimum of %zd photos" = "최소 %zd장의 사진을 선택해 주세요."; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "\"설정 > 개인 정보 보호 > 사진\"에서 %@이(가) 앨범에 접근할 수 있도록 허용하세요."; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "\"설정 > 개인 정보 보호 > 카메라\"에서 %@이(가) 카메라에 접근할 수 있도록 허용하세요."; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "韩语"; 2 | "OK" = "승인"; 3 | "Back" = "뒤로"; 4 | "Done" = "끝난"; 5 | "Sorry" = "죄송합니다"; 6 | "Cancel" = "취소"; 7 | "Setting" = "환경"; 8 | "Photos" = "사진들"; 9 | "Videos" = "비디오"; 10 | "Preview" = "시사"; 11 | "Full image" = "전체 이미지"; 12 | "Processing..." = "처리 중 ..."; 13 | "No Photos or Videos" = "사진이나 동영상 없음"; 14 | "Synchronizing photos from iCloud" = "iCloud에서 사진 동기화"; 15 | "Can not use camera" = "카메라를 사용할 수 없습니다."; 16 | "Can not choose both video and photo" = "동영상과 사진을 모두 선택할 수 없습니다."; 17 | "Can not choose both photo and GIF" = "사진과 GIF를 모두 선택할 수 없습니다."; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/navi_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/navi_back@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/nl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "荷兰语"; 2 | "OK" = "OK"; 3 | "Back" = "Terug"; 4 | "Done" = "Gedaan"; 5 | "Sorry" = "Sorry"; 6 | "Cancel" = "annuleren"; 7 | "Setting" = "omgeving"; 8 | "Photos" = "foto's"; 9 | "Videos" = "Videos"; 10 | "Preview" = "Voorbeeld"; 11 | "Full image" = "Volledig beeld"; 12 | "Processing..." = "Verwerken..."; 13 | "No Photos or Videos" = "Geen foto's of video's"; 14 | "Synchronizing photos from iCloud" = "Foto's synchroniseren vanuit iCloud"; 15 | "Can not use camera" = "Kan de camera niet gebruiken"; 16 | "Can not choose both video and photo" = "Kan niet zowel video als foto kiezen"; 17 | "Can not choose both photo and GIF" = "Kan niet zowel foto als GIF kiezen"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_def_photoPickerVc@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_def_photoPickerVc@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_def_previewVc@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_def_previewVc@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_number_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_number_icon@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_original_def@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_original_def@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_original_sel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_original_sel@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_sel_photoPickerVc@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_sel_photoPickerVc@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/photo_sel_previewVc@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/photo_sel_previewVc@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "波兰语"; 2 | "OK" = "dobrze"; 3 | "Back" = "Z powrotem"; 4 | "Done" = "Gotowe"; 5 | "Sorry" = "Przepraszam"; 6 | "Cancel" = "Anuluj"; 7 | "Setting" = "Oprawa"; 8 | "Photos" = "Zdjęcia"; 9 | "Videos" = "Filmy"; 10 | "Preview" = "Zapowiedź"; 11 | "Full image" = "Pełny obraz"; 12 | "Processing..." = "Przetwarzanie..."; 13 | "No Photos or Videos" = "Brak zdjęć lub filmów"; 14 | "Synchronizing photos from iCloud" = "Synchronizowanie zdjęć z iCloud"; 15 | "Can not use camera" = "Nie można używać aparatu"; 16 | "Can not choose both video and photo" = "Nie można wybrać zarówno wideo,jak i zdjęcia"; 17 | "Can not choose both photo and GIF" = "Nie można wybrać zarówno zdjęcia,jak i GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/preview_number_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/preview_number_icon@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/preview_original_def@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/preview_original_def@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/pt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "葡萄牙语"; 2 | "OK" = "Está bem"; 3 | "Back" = "De volta"; 4 | "Done" = "Feito"; 5 | "Sorry" = "Desculpa"; 6 | "Cancel" = "Cancelar"; 7 | "Setting" = "Configuração"; 8 | "Photos" = "Fotos"; 9 | "Videos" = "Vídeos"; 10 | "Preview" = "Visualizar"; 11 | "Full image" = "Imagem Completa"; 12 | "Processing..." = "Em processamento..."; 13 | "No Photos or Videos" = "Sem fotos ou vídeos"; 14 | "Synchronizing photos from iCloud" = "Sincronizando fotos do iCloud"; 15 | "Can not use camera" = "Não pode usar a câmera"; 16 | "Can not choose both video and photo" = "Não é possível escolher vídeo e foto"; 17 | "Can not choose both photo and GIF" = "Não é possível escolher foto e GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "Se estiver em estado múltiplo, selecione a opção vídeo; iremos utilizar o vídeo como uma foto"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "Não é possível avançar para a página de definições de privacidade, aceda à página de definições você mesmo, obrigado"; 20 | "Select a maximum of %zd photos" = "Selecione apenas %zd imagens,no máximo"; 21 | "Select a minimum of %zd photos" = "Selecione %zd fotos,no mínimo"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Permita a %@ aceder ao seu álbum em “Definições > Privacidade > Fotos”"; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Permita a %@ aceder à sua câmara em “Definições > Privacidade > Câmara”"; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ro.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "罗马尼亚语"; 2 | "OK" = "O.K"; 3 | "Back" = "Înapoi"; 4 | "Done" = "Terminat"; 5 | "Sorry" = "scuze"; 6 | "Cancel" = "Anulare"; 7 | "Setting" = "reglaj"; 8 | "Photos" = "Fotografii"; 9 | "Videos" = "Videoclipuri"; 10 | "Preview" = "previzualizare"; 11 | "Full image" = "Imagine completă"; 12 | "Processing..." = "Prelucrare..."; 13 | "No Photos or Videos" = "Nu există fotografii sau videoclipuri"; 14 | "Synchronizing photos from iCloud" = "Sincronizarea fotografiilor cu iCloud"; 15 | "Can not use camera" = "Nu pot folosi camera"; 16 | "Can not choose both video and photo" = "Nu puteți alege atât videoclipul,cât și fotografia"; 17 | "Can not choose both photo and GIF" = "Nu puteți alege atât fotografia,cât și GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "俄语"; 2 | "OK" = "Хорошо"; 3 | "Back" = "назад"; 4 | "Done" = "Готово"; 5 | "Sorry" = "сожалею"; 6 | "Cancel" = "отменить"; 7 | "Setting" = "настройка"; 8 | "Photos" = "Фото"; 9 | "Videos" = "Видео"; 10 | "Preview" = "предварительный просмотр"; 11 | "Full image" = "Полное изображение"; 12 | "Processing..." = "Обработка ..."; 13 | "No Photos or Videos" = "Нет фото или видео"; 14 | "Synchronizing photos from iCloud" = "Синхронизация фотографий из iCloud"; 15 | "Can not use camera" = "Не могу использовать камеру"; 16 | "Can not choose both video and photo" = "Не могу выбрать как видео,так и фото"; 17 | "Can not choose both photo and GIF" = "Не могу выбрать фото и GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "В случае выбора видео при нахождении в мультирежиме видео будет обработано как фотография"; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "Не удается перейти на страницу настроек конфиденциальности. Перейдите на эту страницу самостоятельно"; 20 | "Select a maximum of %zd photos" = "Вы можете выбрать до %zd изображений"; 21 | "Select a minimum of %zd photos" = "Вы можете выбрать не менее %zd изображений"; 22 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Разрешите доступ %@ к вашему альбому,перейдя в Настройки > Конфиденциальность > Фото"; 23 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Разрешите доступ %@ к камере вашего устройства,перейдя в Настройки > Конфиденциальность > Камера"; 24 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/sk.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "斯洛伐克语"; 2 | "OK" = "OK"; 3 | "Back" = "späť"; 4 | "Done" = "hotový"; 5 | "Sorry" = "Prepáč"; 6 | "Cancel" = "Zrušiť"; 7 | "Setting" = "nastavenie"; 8 | "Photos" = "fotografie"; 9 | "Videos" = "videá"; 10 | "Preview" = "Náhľad"; 11 | "Full image" = "Celý obrázok"; 12 | "Processing..." = "Spracovanie ..."; 13 | "No Photos or Videos" = "Žiadne fotografie alebo videá"; 14 | "Synchronizing photos from iCloud" = "Synchronizácia fotografií z iCloud"; 15 | "Can not use camera" = "Fotoaparát nie je možné používať"; 16 | "Can not choose both video and photo" = "Nie je možné vybrať video aj fotografiu"; 17 | "Can not choose both photo and GIF" = "Nie je možné vybrať fotografie a obrázky GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/sv.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "瑞典语"; 2 | "OK" = "ok"; 3 | "Back" = "Tillbaka"; 4 | "Done" = "Gjort"; 5 | "Sorry" = "Förlåt"; 6 | "Cancel" = "Annullera"; 7 | "Setting" = "Miljö"; 8 | "Photos" = "foton"; 9 | "Videos" = "videoklipp"; 10 | "Preview" = "Förhandsvisning"; 11 | "Full image" = "Fullbild"; 12 | "Processing..." = "Bearbetning ..."; 13 | "No Photos or Videos" = "Inga foton eller videor"; 14 | "Synchronizing photos from iCloud" = "Synkronisera foton från iCloud"; 15 | "Can not use camera" = "Kan inte använda kamera"; 16 | "Can not choose both video and photo" = "Kan inte välja både video och foto"; 17 | "Can not choose both photo and GIF" = "Kan inte välja både foto och GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/takePicture80@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/takePicture80@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/takePicture@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/takePicture@2x.png -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/th.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "泰语"; 2 | "OK" = "ตกลง"; 3 | "Back" = "กลับ"; 4 | "Done" = "เสร็จสิ้น"; 5 | "Sorry" = "ขอโทษ"; 6 | "Cancel" = "ยกเลิก"; 7 | "Setting" = "การตั้งค่า"; 8 | "Photos" = "ภาพถ่าย"; 9 | "Videos" = "วิดีโอ"; 10 | "Preview" = "ดูตัวอย่าง"; 11 | "Full image" = "ภาพเต็ม"; 12 | "Processing..." = "กำลังประมวลผล ..."; 13 | "No Photos or Videos" = "ไม่มีรูปภาพหรือวิดีโอ"; 14 | "Synchronizing photos from iCloud" = "การซิงโครไนซ์ภาพถ่ายจาก iCloud"; 15 | "Can not use camera" = "ไม่สามารถใช้กล้องถ่ายรูป"; 16 | "Can not choose both video and photo" = "ไม่สามารถเลือกได้ทั้งวิดีโอและภาพถ่าย"; 17 | "Can not choose both photo and GIF" = "ไม่สามารถเลือกได้ทั้งภาพถ่ายและ GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "土耳其语"; 2 | "OK" = "tamam"; 3 | "Back" = "Geri"; 4 | "Done" = "tamam"; 5 | "Sorry" = "Afedersiniz"; 6 | "Cancel" = "İptal etmek"; 7 | "Setting" = "Ayar"; 8 | "Photos" = "Fotoğraflar"; 9 | "Videos" = "Videolar"; 10 | "Preview" = "Ön izleme"; 11 | "Full image" = "Tam görüntü"; 12 | "Processing..." = "İşleme..."; 13 | "No Photos or Videos" = "Fotoğraf veya Video Yok"; 14 | "Synchronizing photos from iCloud" = "Fotoğrafları iCloud'dan senkronize etme"; 15 | "Can not use camera" = "Kamera kullanılamaz"; 16 | "Can not choose both video and photo" = "Hem video hem de fotoğraf seçilemiyor"; 17 | "Can not choose both photo and GIF" = "Hem fotoğraf hem de GIF seçilemiyor"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/uk.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "乌克兰语"; 2 | "OK" = "в порядку"; 3 | "Back" = "Назад"; 4 | "Done" = "Виконано"; 5 | "Sorry" = "Вибачте"; 6 | "Cancel" = "Скасувати"; 7 | "Setting" = "Налаштування"; 8 | "Photos" = "Фотографії"; 9 | "Videos" = "Відео"; 10 | "Preview" = "Попередній перегляд"; 11 | "Full image" = "Повне зображення"; 12 | "Processing..." = "Обробка ..."; 13 | "No Photos or Videos" = "Немає фотографій або відео"; 14 | "Synchronizing photos from iCloud" = "Синхронізація фотографій з iCloud"; 15 | "Can not use camera" = "Не можна використовувати камеру"; 16 | "Can not choose both video and photo" = "Неможливо вибрати як відео,так і фото"; 17 | "Can not choose both photo and GIF" = "Неможливо вибрати як фото,так і GIF"; 18 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/vi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "KEY" = "越南语"; 2 | "OK" = "Xác nhận"; 3 | "Back" = "Quay lại"; 4 | "Done" = "Hoàn thành"; 5 | "Sorry" = "Xin lỗi"; 6 | "Cancel" = "Hủy"; 7 | "Setting" = "Cài đặt"; 8 | "Photos" = "Hình"; 9 | "Videos" = "Clip"; 10 | "Preview" = "Xem trước"; 11 | "Full image" = "Hình gốc"; 12 | "Processing..." = "Đang xử lý..."; 13 | "No Photos or Videos" = "Không có ảnh hoặc video"; 14 | "Can not use camera" = "Máy chụp hình không khả dụng"; 15 | "Synchronizing photos from iCloud" = "Đang đồng bộ hình ảnh từ ICloud"; 16 | "Can not choose both video and photo" = "Trong lúc chọn hình ảnh không cùng lúc chọn video"; 17 | "Can not choose both photo and GIF" = "Trong lúc chọn hình ảnh không cùng lúc chọn hình GIF"; 18 | "Select the video when in multi state, we will handle the video as a photo" = "Chọn hình ảnh cùng video, video sẽ bị mặc nhận thành hình ảnh và gửi đi."; 19 | "Can not jump to the privacy settings page, please go to the settings page by self, thank you" = "Không thể chuyển tự động qua trang cài đặt riêng tư, bạn hãy thoát ra cà điều chỉnh lại, cám ơn bạn."; 20 | 21 | "Select a maximum of %zd photos" = "Bạn chỉ được chọn nhiều nhất %zd tấm hình"; 22 | "Select a minimum of %zd photos" = "Chọn ít nhất %zd tấm hình"; 23 | "Allow %@ to access your album in \"Settings -> Privacy -> Photos\"" = "Vui lòng tại mục iPhone \" Cài đặt – quyền riêng tư - Ảnh\" mở quyền cho phép %@ truy cập ảnh."; 24 | "Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\"" = "Vui lòng tại mục iPhone \" Cài đặt – quyền riêng tư - Ảnh\" mở quyền cho phép %@ truy cập máy ảnh"; 25 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImagePickerController.bundle/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/TZImagePickerController/TZImagePickerController.bundle/zh-Hant.lproj/Localizable.strings -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZImageRequestOperation.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZImageRequestOperation.h 3 | // TZImagePickerControllerFramework 4 | // 5 | // Created by 谭真 on 2018/12/20. 6 | // Copyright © 2018 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface TZImageRequestOperation : NSOperation 15 | 16 | typedef void(^TZImageRequestCompletedBlock)(UIImage *photo, NSDictionary *info, BOOL isDegraded); 17 | typedef void(^TZImageRequestProgressBlock)(double progress, NSError *error, BOOL *stop, NSDictionary *info); 18 | 19 | @property (nonatomic, copy, nullable) TZImageRequestCompletedBlock completedBlock; 20 | @property (nonatomic, copy, nullable) TZImageRequestProgressBlock progressBlock; 21 | @property (nonatomic, strong, nullable) PHAsset *asset; 22 | 23 | @property (assign, nonatomic, getter = isExecuting) BOOL executing; 24 | @property (assign, nonatomic, getter = isFinished) BOOL finished; 25 | 26 | - (instancetype)initWithAsset:(PHAsset *)asset completion:(TZImageRequestCompletedBlock)completionBlock progressHandler:(TZImageRequestProgressBlock)progressHandler; 27 | - (void)done; 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZLocationManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZLocationManager.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 2017/06/03. 6 | // Copyright © 2017年 谭真. All rights reserved. 7 | // 定位管理类 8 | 9 | 10 | #import 11 | #import 12 | 13 | @interface TZLocationManager : NSObject 14 | 15 | + (instancetype)manager NS_SWIFT_NAME(default()); 16 | 17 | /// 开始定位 18 | - (void)startLocation; 19 | - (void)startLocationWithSuccessBlock:(void (^)(NSArray *))successBlock failureBlock:(void (^)(NSError *error))failureBlock; 20 | - (void)startLocationWithGeocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock; 21 | - (void)startLocationWithSuccessBlock:(void (^)(NSArray *))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock; 22 | 23 | /// 结束定位 24 | - (void)stopUpdatingLocation; 25 | 26 | @end 27 | 28 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZPhotoPickerController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZPhotoPickerController.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 15/12/24. 6 | // Copyright © 2015年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class TZAlbumModel; 12 | @interface TZPhotoPickerController : UIViewController 13 | 14 | @property (nonatomic, assign) BOOL isFirstAppear; 15 | @property (nonatomic, assign) NSInteger columnNumber; 16 | @property (nonatomic, strong) TZAlbumModel *model; 17 | @end 18 | 19 | 20 | @interface TZCollectionView : UICollectionView 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZPhotoPreviewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZPhotoPreviewController.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 15/12/24. 6 | // Copyright © 2015年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TZPhotoPreviewController : UIViewController 12 | 13 | @property (nonatomic, strong) NSMutableArray *models; ///< All photo models / 所有图片模型数组 14 | @property (nonatomic, strong) NSMutableArray *photos; ///< All photos / 所有图片数组 15 | @property (nonatomic, assign) NSInteger currentIndex; ///< Index of the photo user click / 用户点击的图片的索引 16 | @property (nonatomic, assign) BOOL isSelectOriginalPhoto; ///< If YES,return original photo / 是否返回原图 17 | @property (nonatomic, assign) BOOL isCropImage; 18 | 19 | /// Return the new selected photos / 返回最新的选中图片数组 20 | @property (nonatomic, copy) void (^backButtonClickBlock)(BOOL isSelectOriginalPhoto); 21 | @property (nonatomic, copy) void (^doneButtonClickBlock)(BOOL isSelectOriginalPhoto); 22 | @property (nonatomic, copy) void (^doneButtonClickBlockCropMode)(UIImage *cropedImage,id asset); 23 | @property (nonatomic, copy) void (^doneButtonClickBlockWithPreviewType)(NSArray *photos,NSArray *assets,BOOL isSelectOriginalPhoto); 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZProgressView.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZProgressView.h 3 | // TZImagePickerController 4 | // 5 | // Created by ttouch on 2016/12/6. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TZProgressView : UIView 12 | 13 | @property (nonatomic, assign) double progress; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZProgressView.m: -------------------------------------------------------------------------------- 1 | // 2 | // TZProgressView.m 3 | // TZImagePickerController 4 | // 5 | // Created by ttouch on 2016/12/6. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import "TZProgressView.h" 10 | 11 | @interface TZProgressView () 12 | @property (nonatomic, strong) CAShapeLayer *progressLayer; 13 | @end 14 | 15 | @implementation TZProgressView 16 | 17 | - (instancetype)init { 18 | self = [super init]; 19 | if (self) { 20 | self.backgroundColor = [UIColor clearColor]; 21 | 22 | _progressLayer = [CAShapeLayer layer]; 23 | _progressLayer.fillColor = [[UIColor clearColor] CGColor]; 24 | _progressLayer.strokeColor = [[UIColor whiteColor] CGColor]; 25 | _progressLayer.opacity = 1; 26 | _progressLayer.lineCap = kCALineCapRound; 27 | _progressLayer.lineWidth = 5; 28 | 29 | [_progressLayer setShadowColor:[UIColor blackColor].CGColor]; 30 | [_progressLayer setShadowOffset:CGSizeMake(1, 1)]; 31 | [_progressLayer setShadowOpacity:0.5]; 32 | [_progressLayer setShadowRadius:2]; 33 | } 34 | return self; 35 | } 36 | 37 | - (void)drawRect:(CGRect)rect { 38 | CGPoint center = CGPointMake(rect.size.width / 2, rect.size.height / 2); 39 | CGFloat radius = rect.size.width / 2; 40 | CGFloat startA = - M_PI_2; 41 | CGFloat endA = - M_PI_2 + M_PI * 2 * _progress; 42 | _progressLayer.frame = self.bounds; 43 | UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES]; 44 | _progressLayer.path =[path CGPath]; 45 | 46 | [_progressLayer removeFromSuperlayer]; 47 | [self.layer addSublayer:_progressLayer]; 48 | } 49 | 50 | - (void)setProgress:(double)progress { 51 | _progress = progress; 52 | [self setNeedsDisplay]; 53 | } 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /Library/TZImagePickerController/TZVideoPlayerController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TZVideoPlayerController.h 3 | // TZImagePickerController 4 | // 5 | // Created by 谭真 on 16/1/5. 6 | // Copyright © 2016年 谭真. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class TZAssetModel; 12 | @interface TZVideoPlayerController : UIViewController 13 | 14 | @property (nonatomic, strong) TZAssetModel *model; 15 | 16 | @end -------------------------------------------------------------------------------- /Library/TZImagePickerController/UIView+Layout.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Layout.h 3 | // 4 | // Created by 谭真 on 15/2/24. 5 | // Copyright © 2015年 谭真. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | typedef enum : NSUInteger { 11 | TZOscillatoryAnimationToBigger, 12 | TZOscillatoryAnimationToSmaller, 13 | } TZOscillatoryAnimationType; 14 | 15 | @interface UIView (Layout) 16 | 17 | @property (nonatomic) CGFloat tz_left; ///< Shortcut for frame.origin.x. 18 | @property (nonatomic) CGFloat tz_top; ///< Shortcut for frame.origin.y 19 | @property (nonatomic) CGFloat tz_right; ///< Shortcut for frame.origin.x + frame.size.width 20 | @property (nonatomic) CGFloat tz_bottom; ///< Shortcut for frame.origin.y + frame.size.height 21 | @property (nonatomic) CGFloat tz_width; ///< Shortcut for frame.size.width. 22 | @property (nonatomic) CGFloat tz_height; ///< Shortcut for frame.size.height. 23 | @property (nonatomic) CGFloat tz_centerX; ///< Shortcut for center.x 24 | @property (nonatomic) CGFloat tz_centerY; ///< Shortcut for center.y 25 | @property (nonatomic) CGPoint tz_origin; ///< Shortcut for frame.origin. 26 | @property (nonatomic) CGSize tz_size; ///< Shortcut for frame.size. 27 | 28 | + (void)showOscillatoryAnimationWithLayer:(CALayer *)layer type:(TZOscillatoryAnimationType)type; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Library/Tool/Singleton.h: -------------------------------------------------------------------------------- 1 | // 2 | // Singleton.h 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/7/18. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | #ifndef Singleton_h 10 | #define Singleton_h 11 | #define SingletonH 12 | // .m文件的实现 13 | #if __has_feature(objc_arc) // 是ARC 14 | #define SingletonM \ 15 | static id _instace = nil; \ 16 | + (id)allocWithZone:(struct _NSZone *)zone \ 17 | { \ 18 | if (_instace == nil) { \ 19 | static dispatch_once_t onceToken; \ 20 | dispatch_once(&onceToken, ^{ \ 21 | _instace = [super allocWithZone:zone]; \ 22 | }); \ 23 | } \ 24 | return _instace; \ 25 | } \ 26 | \ 27 | + (id)copyWithZone:(struct _NSZone *)zone \ 28 | { \ 29 | return _instace; \ 30 | } \ 31 | \ 32 | + (id)mutableCopyWithZone:(struct _NSZone *)zone \ 33 | { \ 34 | return _instace; \ 35 | } 36 | 37 | #else // 不是ARC 38 | 39 | #define SingletonM \ 40 | static id _instace = nil; \ 41 | + (id)allocWithZone:(struct _NSZone *)zone \ 42 | { \ 43 | if (_instace == nil) { \ 44 | static dispatch_once_t onceToken; \ 45 | dispatch_once(&onceToken, ^{ \ 46 | _instace = [super allocWithZone:zone]; \ 47 | }); \ 48 | } \ 49 | return _instace; \ 50 | } \ 51 | \ 52 | - (id)init \ 53 | { \ 54 | static dispatch_once_t onceToken; \ 55 | dispatch_once(&onceToken, ^{ \ 56 | _instace = [super init]; \ 57 | }); \ 58 | return _instace; \ 59 | } \ 60 | \ 61 | - (oneway void)release \ 62 | { \ 63 | \ 64 | } \ 65 | \ 66 | - (id)retain \ 67 | { \ 68 | return self; \ 69 | } \ 70 | \ 71 | - (NSUInteger)retainCount \ 72 | { \ 73 | return 1; \ 74 | } \ 75 | + (id)copyWithZone:(struct _NSZone *)zone \ 76 | { \ 77 | return _instace; \ 78 | } \ 79 | \ 80 | + (id)mutableCopyWithZone:(struct _NSZone *)zone \ 81 | { \ 82 | return _instace; \ 83 | } 84 | #endif 85 | 86 | #endif /* Singleton_h */ 87 | -------------------------------------------------------------------------------- /Library/Tool/Tool.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tool.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 14/9/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import IQKeyboardManagerSwift 11 | import Photos 12 | class Tool{ 13 | static func hiddenKeyboard(){ 14 | UIApplication.shared.keyWindow?.rootViewController?.view.endEditing(true) 15 | } 16 | 17 | static func ChineseToPinyin(chinese:String)->String{ 18 | let py = NSMutableString(string: chinese) 19 | CFStringTransform(py, nil, kCFStringTransformMandarinLatin, false) 20 | CFStringTransform(py, nil, kCFStringTransformStripCombiningMarks, false) 21 | return py as String 22 | } 23 | 24 | static func thumbnailImageForVideo(url:URL,time:Double = 0)->UIImage?{ 25 | let asset = AVAsset(url: url) 26 | let assetImageGenerator = AVAssetImageGenerator(asset: asset) 27 | assetImageGenerator.appliesPreferredTrackTransform = true 28 | assetImageGenerator.apertureMode = AVAssetImageGenerator.ApertureMode.encodedPixels 29 | let t = CMTime(seconds: time, preferredTimescale: 60) 30 | do{ 31 | let thumbnailImageRef = try assetImageGenerator.copyCGImage(at: t, actualTime: nil) 32 | return UIImage(cgImage: thumbnailImageRef) 33 | } 34 | catch{ 35 | print(error.localizedDescription) 36 | return nil 37 | } 38 | 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /Library/Tool/log4cplus.h: -------------------------------------------------------------------------------- 1 | // 2 | // log4cplus.h 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/7/9. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | #include 10 | #ifndef XDX_IOS 11 | #define XDX_IOS 12 | #endif 13 | 14 | #define kXDXDebugMode 15 | 16 | #ifdef kXDXDebugMode 17 | 18 | #define log4cplus_fatal(category, logFmt, ...) \ 19 | syslog(LOG_CRIT, "%s:" logFmt, category,##__VA_ARGS__); \ 20 | 21 | #define log4cplus_error(category, logFmt, ...) \ 22 | syslog(LOG_ERR, "%s:" logFmt, category,##__VA_ARGS__); \ 23 | 24 | #define log4cplus_warn(category, logFmt, ...) \ 25 | syslog(LOG_WARNING, "%s:" logFmt, category,##__VA_ARGS__); \ 26 | 27 | #define log4cplus_info(category, logFmt, ...) \ 28 | syslog(LOG_WARNING, "%s:" logFmt, category,##__VA_ARGS__); \ 29 | 30 | #define log4cplus_debug(category, logFmt, ...) \ 31 | syslog(LOG_WARNING, "%s:" logFmt, category,##__VA_ARGS__); \ 32 | 33 | 34 | #else 35 | 36 | #define log4cplus_fatal(category, logFmt, ...); \ 37 | 38 | #define log4cplus_error(category, logFmt, ...); \ 39 | 40 | #define log4cplus_warn(category, logFmt, ...); \ 41 | 42 | #define log4cplus_info(category, logFmt, ...); \ 43 | 44 | #define log4cplus_debug(category, logFmt, ...); \ 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /Library/View/BarSlider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarSlider.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/6/21. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BarSlider: UISlider { 12 | 13 | override func trackRect(forBounds bounds: CGRect) -> CGRect { 14 | return CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height) 15 | } 16 | 17 | 18 | override var value: Float{ 19 | didSet{ 20 | setNeedsDisplay() 21 | } 22 | } 23 | 24 | override func draw(_ rect: CGRect) { 25 | let ctx = UIGraphicsGetCurrentContext() 26 | ctx?.setFillColor(maximumTrackTintColor?.cgColor ?? UIColor.clear.cgColor) 27 | ctx?.fill(rect) 28 | ctx?.setFillColor(minimumTrackTintColor?.cgColor ?? tintColor.cgColor) 29 | let width = CGFloat(value / maximumValue) * rect.size.width 30 | ctx?.fill(CGRect(x: 0, y: 0, w: width, h: rect.size.height)) 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Library/View/JXLayoutButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // JXLayoutButton.h 3 | // JXLayoutButtonDemo 4 | // 5 | // Created by JiongXing on 16/9/24. 6 | // Copyright © 2016年 JiongXing. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSUInteger, JXLayoutButtonStyle) { 12 | JXLayoutButtonStyleLeftImageRightTitle, 13 | JXLayoutButtonStyleLeftTitleRightImage, 14 | JXLayoutButtonStyleUpImageDownTitle, 15 | JXLayoutButtonStyleUpTitleDownImage 16 | }; 17 | 18 | /// 重写layoutSubviews的方式实现布局,忽略imageEdgeInsets、titleEdgeInsets和contentEdgeInsets 19 | @interface JXLayoutButton : UIButton 20 | 21 | /// 布局方式 22 | @property (nonatomic, assign) JXLayoutButtonStyle layoutStyle; 23 | /// 图片和文字的间距,默认值8 24 | @property (nonatomic, assign) CGFloat midSpacing; 25 | /// 指定图片size 26 | @property (nonatomic, assign) CGSize imageSize; 27 | 28 | @property (nonatomic,assign) NSUInteger textLine; 29 | @end 30 | -------------------------------------------------------------------------------- /Library/View/ProgressButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgressButton.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2018/5/30. 6 | // Copyright © 2018 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | class ProgressButton: UIButton { 11 | 12 | var maxValue:Double = 1 13 | var minValue:Double = 0 14 | 15 | var value:Double = 0{ 16 | didSet{ 17 | setNeedsDisplay() 18 | } 19 | } 20 | 21 | var bgTintColor = UIColor.lightGray{ 22 | didSet{ 23 | setNeedsDisplay() 24 | } 25 | } 26 | 27 | override init(frame: CGRect) { 28 | super.init(frame: frame) 29 | } 30 | 31 | var lineWidth:CGFloat = 2{ 32 | didSet{ 33 | setNeedsDisplay() 34 | } 35 | } 36 | 37 | required init?(coder aDecoder: NSCoder) { 38 | fatalError("init(coder:) has not been implemented") 39 | } 40 | 41 | 42 | override func draw(_ rect: CGRect) { 43 | guard let context = UIGraphicsGetCurrentContext() else{ 44 | return 45 | } 46 | let newRect = CGRect(x: rect.origin.x + lineWidth, y: rect.origin.y + lineWidth, w: rect.size.width - lineWidth * 2, h: rect.size.width - lineWidth * 2) 47 | context.setStrokeColor(bgTintColor.cgColor) 48 | context.setLineWidth(lineWidth) 49 | context.strokeEllipse(in: newRect) 50 | context.addArc(center: CGPoint(x: rect.size.width / 2, y: rect.size.height / 2), radius: newRect.size.width / 2, startAngle: -CGFloat(Double.pi / 2), endAngle: CGFloat(Double.pi * 2 * value / (maxValue - minValue)) - CGFloat(Double.pi / 2), clockwise: false) 51 | context.setStrokeColor(tintColor.cgColor) 52 | context.strokePath() 53 | 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /Library/mars/Component/LogHelper.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // LogHelper.h 15 | // iOSDemo 16 | // 17 | // Created by caoshaokun on 16/11/30. 18 | // Copyright © 2016年 caoshaokun. All rights reserved. 19 | // 20 | 21 | #import 22 | 23 | #import 24 | 25 | @interface LogHelper : NSObject 26 | 27 | + (void)logWithLevel:(TLogLevel)logLevel moduleName:(const char*)moduleName fileName:(const char*)fileName lineNumber:(int)lineNumber funcName:(const char*)funcName message:(NSString *)message; 28 | + (void)logWithLevel:(TLogLevel)logLevel moduleName:(const char*)moduleName fileName:(const char*)fileName lineNumber:(int)lineNumber funcName:(const char*)funcName format:(NSString *)format, ...; 29 | 30 | + (BOOL)shouldLog:(int)level; 31 | 32 | @end 33 | 34 | #define LogInternal(level, module, file, line, func, prefix, format, ...) \ 35 | do { \ 36 | if ([LogHelper shouldLog:level]) { \ 37 | NSString *aMessage = [NSString stringWithFormat:@"%@%@", prefix, [NSString stringWithFormat:format, ##__VA_ARGS__, nil]]; \ 38 | [LogHelper logWithLevel:level moduleName:module fileName:file lineNumber:line funcName:func message:aMessage]; \ 39 | } \ 40 | } while(0) 41 | -------------------------------------------------------------------------------- /Library/mars/Component/LogUtil.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // LogUtil.h 15 | // iOSDemo 16 | // 17 | // Created by caoshaokun on 16/11/30. 18 | // Copyright © 2016年 caoshaokun. All rights reserved. 19 | // 20 | 21 | #import 22 | 23 | #import "LogHelper.h" 24 | 25 | @interface LogUtil : NSObject 26 | 27 | @end 28 | 29 | #define __FILENAME__ (strrchr(__FILE__,'/')+1) 30 | 31 | /** 32 | * Module Logging 33 | */ 34 | #define LOG_ERROR(module, format, ...) LogInternal(kLevelError, module, __FILENAME__, __LINE__, __FUNCTION__, @"Error:", format, ##__VA_ARGS__) 35 | #define LOG_WARNING(module, format, ...) LogInternal(kLevelWarn, module, __FILENAME__, __LINE__, __FUNCTION__, @"Warning:", format, ##__VA_ARGS__) 36 | #define LOG_INFO(module, format, ...) LogInternal(kLevelInfo, module, __FILENAME__, __LINE__, __FUNCTION__, @"Info:", format, ##__VA_ARGS__) 37 | #define LOG_DEBUG(module, format, ...) LogInternal(kLevelDebug, module, __FILENAME__, __LINE__, __FUNCTION__, @"Debug:", format, ##__VA_ARGS__) 38 | 39 | static const char *kModuleViewController = "ViewController"; 40 | static const char *kNetwork = "Network"; 41 | -------------------------------------------------------------------------------- /Library/mars/Component/LogUtil.m: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // LogUtil.m 15 | // iOSDemo 16 | // 17 | // Created by caoshaokun on 16/11/30. 18 | // Copyright © 2016年 caoshaokun. All rights reserved. 19 | // 20 | 21 | #import "LogUtil.h" 22 | 23 | @implementation LogUtil 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Library/mars/bridge/appender-swift-bridge.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. 3 | // Licensed under the MIT License (the "License"); you may not use this file except in 4 | // compliance with the License. You may obtain a copy of the License at 5 | // http://opensource.org/licenses/MIT 6 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 7 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 8 | // either express or implied. See the License for the specific language governing permissions and 9 | // limitations under the License. 10 | /* 11 | * appender-swift-bridge.h 12 | * 13 | * Created on: 2017-1-3 14 | * Author: Jinkey 15 | */ 16 | 17 | 18 | #include 19 | #import 20 | #import "LogUtil.h" 21 | 22 | typedef NS_ENUM(NSUInteger, XloggerType) { 23 | all = kLevelAll, 24 | verbose = kLevelVerbose, 25 | debug = kLevelDebug, 26 | info = kLevelInfo, 27 | warning = kLevelWarn, 28 | error = kLevelError, 29 | fatal = kLevelFatal, 30 | none = kLevelNone 31 | 32 | }; 33 | 34 | @interface JinkeyMarsBridge: NSObject 35 | 36 | - (void)initXlogger: (XloggerType)debugLevel releaseLevel: (XloggerType)releaseLevel path: (NSString*)path prefix: (const char*)prefix; 37 | - (void)deinitXlogger; 38 | 39 | - (void)log: (XloggerType) level tag: (const char*)tag content: (NSString*)content; 40 | 41 | @end 42 | 43 | 44 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/ThreadOperationQueue.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License 9 | // is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 10 | // or implied. See the License for the specific language governing permissions and limitations under 11 | // the License. 12 | 13 | // 14 | // ThreadOperationQueue.h 15 | // MicroMessenger 16 | // 17 | // Created by yerungui on 12-12-18. 18 | // 19 | 20 | #ifndef __MicroMessenger__ThreadOperationQueue__ 21 | #define __MicroMessenger__ThreadOperationQueue__ 22 | 23 | #import 24 | 25 | @interface ThreadQueue : NSObject { 26 | } 27 | 28 | + (BOOL)RunWithTarget:(id)target selector:(SEL)sel object:(id)arg; 29 | @end 30 | 31 | extern "C" BOOL RunWithTarget(void (*_funp)(void*), void* _arg); 32 | extern "C" BOOL RunWithTargetNoParam(void (*_fun)()); 33 | 34 | #endif /* defined(__MicroMessenger__ThreadOperationQueue__) */ 35 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/local_ipstack.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // IPv6_only.hpp 15 | // comm 16 | // 17 | // Created by yerungui on 16/1/14. 18 | // 19 | 20 | #ifndef __ip_type__ 21 | #define __ip_type__ 22 | 23 | #ifdef __cplusplus 24 | extern "C" { 25 | #endif 26 | 27 | enum TLocalIPStack { 28 | ELocalIPStack_None = 0, 29 | ELocalIPStack_IPv4 = 1, 30 | ELocalIPStack_IPv6 = 2, 31 | ELocalIPStack_Dual = 3, 32 | }; 33 | 34 | const char* const TLocalIPStackStr[] = { 35 | "ELocalIPStack_None", 36 | "ELocalIPStack_IPv4", 37 | "ELocalIPStack_IPv6", 38 | "ELocalIPStack_Dual", 39 | }; 40 | 41 | TLocalIPStack local_ipstack_detect(); 42 | 43 | #ifdef __cplusplus 44 | } 45 | #endif 46 | 47 | #include 48 | TLocalIPStack local_ipstack_detect_log(std::string& _log); 49 | 50 | #endif /* __ip_type__ */ 51 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/projdef.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // prjdef.h 15 | // comm 16 | // 17 | // Created by yerungui on 16/4/26. 18 | // Copyright © 2016年 Tencent. All rights reserved. 19 | // 20 | 21 | #ifndef prjdef_h 22 | #define prjdef_h 23 | 24 | #ifdef _WIN32 25 | #include "windows/projdef.h" 26 | #endif 27 | 28 | #endif /* prjdef_h */ 29 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/scope_autoreleasepool.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | // 14 | // scope_autoreleasepool.h 15 | // MicroMessenger 16 | // 17 | // Created by yerungui on 12-11-30. 18 | // 19 | 20 | #ifndef __MicroMessenger__scope_autoreleasepool__ 21 | #define __MicroMessenger__scope_autoreleasepool__ 22 | 23 | class Scope_AutoReleasePool { 24 | public: 25 | Scope_AutoReleasePool(); 26 | ~Scope_AutoReleasePool(); 27 | 28 | private: 29 | Scope_AutoReleasePool(const Scope_AutoReleasePool&); 30 | Scope_AutoReleasePool& operator=(const Scope_AutoReleasePool&); 31 | 32 | private: 33 | id m_pool; 34 | }; 35 | 36 | #define SCOPE_POOL() Scope_AutoReleasePool __pool__##__LINE__ 37 | 38 | #endif /* defined(__MicroMessenger__scope_autoreleasepool__) */ 39 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/time_utils.h: -------------------------------------------------------------------------------- 1 | // Tencent is pleased to support the open source community by making Mars available. 2 | // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 3 | 4 | // Licensed under the MIT License (the "License"); you may not use this file except in 5 | // compliance with the License. You may obtain a copy of the License at 6 | // http://opensource.org/licenses/MIT 7 | 8 | // Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 10 | // either express or implied. See the License for the specific language governing permissions and 11 | // limitations under the License. 12 | 13 | /* 14 | * utils.h 15 | * 16 | * Created on: 2012-7-18 17 | * Author: yerungui 18 | */ 19 | 20 | #ifndef COMM_UTILS_H_ 21 | #define COMM_UTILS_H_ 22 | 23 | // 本头文件会被.m文件引用,禁止使用cpp头文件 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #ifdef WIN32 30 | #include "mars/comm/windows/sys/time.h" 31 | #else 32 | #include 33 | #endif 34 | #ifdef __cplusplus 35 | extern "C" { 36 | #endif 37 | 38 | uint64_t gettickcount(); // ms 39 | int64_t gettickspan(uint64_t _old_tick); // ms 40 | uint64_t timeMs(); 41 | 42 | uint64_t clock_app_monotonic(); // ms 43 | 44 | // oc不能使用常引用,必须传值或者传指针 45 | inline uint64_t time_diff_abs_us(const struct timeval tv1, const struct timeval tv2) { 46 | return labs((tv1.tv_sec - tv2.tv_sec) * 1000000 + tv1.tv_usec - tv2.tv_usec); // labs:long abs 47 | } 48 | 49 | inline struct timeval get_timeval() { 50 | struct timeval tv; 51 | gettimeofday(&tv, NULL); 52 | return tv; 53 | } 54 | 55 | #ifdef __cplusplus 56 | } 57 | #endif 58 | 59 | #endif /* COMM_UTILS_H_ */ 60 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/Headers/comm/verinfo.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef Mars_verinfo_h 3 | #define Mars_verinfo_h 4 | 5 | #define MARS_REVISION "c5591594" 6 | #define MARS_PATH "master" 7 | #define MARS_URL "" 8 | #define MARS_BUILD_TIME "2024-07-12 11:03:47" 9 | #define MARS_TAG "" 10 | #define MARS_BUILD_TIMESTAMP 1720753427 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /Library/mars/mars.framework/mars: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/Library/mars/mars.framework/mars -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'iOSDemo' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | pod 'SnapKit', '~> 5.0.0' 8 | pod "KRProgressHUD" 9 | pod 'Alamofire', '~> 5.4' 10 | pod 'IQKeyboardManagerSwift' 11 | pod 'SwiftyJSON', '~> 4.0' 12 | pod 'Kingfisher', '~> 7.10' 13 | pod 'LookinServer', :configurations => ['Debug'] 14 | # Pods for iOSDemo 15 | 16 | end 17 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (5.4.4) 3 | - IQKeyboardManagerSwift (6.5.9) 4 | - Kingfisher (7.11.0) 5 | - KRActivityIndicatorView (3.0.7) 6 | - KRProgressHUD (3.4.7): 7 | - KRActivityIndicatorView (= 3.0.7) 8 | - LookinServer (1.0.4) 9 | - SnapKit (5.0.1) 10 | - SwiftyJSON (4.3.0) 11 | 12 | DEPENDENCIES: 13 | - Alamofire (~> 5.4) 14 | - IQKeyboardManagerSwift 15 | - Kingfisher (~> 7.10) 16 | - KRProgressHUD 17 | - LookinServer 18 | - SnapKit (~> 5.0.0) 19 | - SwiftyJSON (~> 4.0) 20 | 21 | SPEC REPOS: 22 | trunk: 23 | - Alamofire 24 | - IQKeyboardManagerSwift 25 | - Kingfisher 26 | - KRActivityIndicatorView 27 | - KRProgressHUD 28 | - LookinServer 29 | - SnapKit 30 | - SwiftyJSON 31 | 32 | SPEC CHECKSUMS: 33 | Alamofire: f3b09a368f1582ab751b3fff5460276e0d2cf5c9 34 | IQKeyboardManagerSwift: 6e839c575c4aa1078d58a596e41244e77abe918f 35 | Kingfisher: b9c985d864d43515f404f1ef4a8ce7d802ace3ac 36 | KRActivityIndicatorView: ad69e89c4ce40c986cf580595be4829dcad0e35a 37 | KRProgressHUD: a248f0bc6c9c2aed40a37b76e03ffecc7f85c887 38 | LookinServer: 743c1681771d0a8dcc38825325a080c3186404a5 39 | SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb 40 | SwiftyJSON: 6faa0040f8b59dead0ee07436cbf76b73c08fd08 41 | 42 | PODFILE CHECKSUM: 3dc5dc462c6d470e27c680d3adce8ce4aa57f99c 43 | 44 | COCOAPODS: 1.14.3 45 | -------------------------------------------------------------------------------- /demo.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /iOSDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOSDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOSDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOSDemo.xcodeproj/xcshareddata/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /iOSDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iOSDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/1.imageset/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/1.imageset/1.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "1.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/10.imageset/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/10.imageset/10.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "10.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/2.imageset/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/2.imageset/2.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "2.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/3.imageset/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/3.imageset/3.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "3.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/4.imageset/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/4.imageset/4.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "4.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/5.imageset/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/5.imageset/5.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "5.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/6.imageset/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/6.imageset/6.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "6.jpg", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/7.imageset/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/7.imageset/7.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "7.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_pause_recording_audio.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_pause_recording_audio.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_pause_recording_audio.imageset/btn_pause_recording_audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Audio/btn_pause_recording_audio.imageset/btn_pause_recording_audio.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_pause_small.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_pause_small.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_pause_small.imageset/btn_pause_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Audio/btn_pause_small.imageset/btn_pause_small.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_play_small.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_play_small.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_play_small.imageset/btn_play_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Audio/btn_play_small.imageset/btn_play_small.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_play_small_disable.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_play_small_disable.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_play_small_disable.imageset/btn_play_small_disable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Audio/btn_play_small_disable.imageset/btn_play_small_disable.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_recording_audio.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_recording_audio.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Audio/btn_recording_audio.imageset/btn_recording_audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Audio/btn_recording_audio.imageset/btn_recording_audio.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/full_screen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "full_screen@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/full_screen.imageset/full_screen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Player/full_screen.imageset/full_screen@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/knob.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "knob.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/knob.imageset/knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Player/knob.imageset/knob.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/pause.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "pause@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/pause.imageset/pause@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Player/pause.imageset/pause@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/play.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "play@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Player/play.imageset/play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Player/play.imageset/play@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_recording_video.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_recording_video.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_recording_video.imageset/btn_recording_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/btn_recording_video.imageset/btn_recording_video.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_start_record_video.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_start_record_video.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_start_record_video.imageset/btn_start_record_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/btn_start_record_video.imageset/btn_start_record_video.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_delete_confirm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_video_delete_confirm.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_delete_confirm.imageset/btn_video_delete_confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/btn_video_delete_confirm.imageset/btn_video_delete_confirm.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_delete_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_video_delete_normal.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_delete_normal.imageset/btn_video_delete_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/btn_video_delete_normal.imageset/btn_video_delete_normal.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_uploading.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_video_uploading.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/btn_video_uploading.imageset/btn_video_uploading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/btn_video_uploading.imageset/btn_video_uploading.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_beauty.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "camra_beauty@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_beauty.imageset/camra_beauty@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/camra_beauty.imageset/camra_beauty@3x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_beauty_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "camra_beauty_close@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_beauty_close.imageset/camra_beauty_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/camra_beauty_close.imageset/camra_beauty_close@3x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_preview.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "camra_preview@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/camra_preview.imageset/camra_preview@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/camra_preview.imageset/camra_preview@3x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/close_preview.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "close_preview@3x.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/Video/close_preview.imageset/close_preview@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/Video/close_preview.imageset/close_preview@3x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_flash_off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_flash_off.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_flash_off.imageset/btn_flash_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/btn_flash_off.imageset/btn_flash_off.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_flash_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_flash_on.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_flash_on.imageset/btn_flash_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/btn_flash_on.imageset/btn_flash_on.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_location.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "btn_location.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/btn_location.imageset/btn_location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/btn_location.imageset/btn_location.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/file_not_exist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "file_not_exist.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/file_not_exist.imageset/file_not_exist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/file_not_exist.imageset/file_not_exist.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a10.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a10.imageset/a10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a10.imageset/a10.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a11.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a11.imageset/a11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a11.imageset/a11.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a3.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a3.imageset/a3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a3.imageset/a3.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a4.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a4.imageset/a4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a4.imageset/a4.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a5.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a5.imageset/a5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a5.imageset/a5.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a6.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a6.imageset/a6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a6.imageset/a6.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a7.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a7.imageset/a7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a7.imageset/a7.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a8.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a8.imageset/a8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a8.imageset/a8.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "a9.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/header/a9.imageset/a9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/header/a9.imageset/a9.jpg -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "heart.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/heart.imageset/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/heart.imageset/heart.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/check.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "check.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/check.imageset/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/check.imageset/check.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/computer.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "computer.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/computer.imageset/computer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/computer.imageset/computer.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/filter.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "filter.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/filter.imageset/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/filter.imageset/filter.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/open_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "open_menu.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/open_menu.imageset/open_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/open_menu.imageset/open_menu.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/phone.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "phone.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/phone.imageset/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/phone.imageset/phone.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/star_full.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "star_full.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/star_full.imageset/star_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/star_full.imageset/star_full.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/star_hollow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "star_hollow.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/star_hollow.imageset/star_hollow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/star_hollow.imageset/star_hollow.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/tablet.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tablet.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon/tablet.imageset/tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon/tablet.imageset/tablet.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "icon_close.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon_close.imageset/icon_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon_close.imageset/icon_close.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon_error.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "icon_error.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/icon_error.imageset/icon_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/icon_error.imageset/icon_error.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "img_watermark.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark.imageset/img_watermark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/img_watermark.imageset/img_watermark.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark_a.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "img_watermark_a.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark_a.imageset/img_watermark_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/img_watermark_a.imageset/img_watermark_a.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark_b.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "img_watermark_b.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/img_watermark_b.imageset/img_watermark_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/img_watermark_b.imageset/img_watermark_b.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/info.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "filename" : "info.png", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/info.imageset/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/info.imageset/info.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_back_white_solid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "public_btn_back_white_solid@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_back_white_solid.imageset/public_btn_back_white_solid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/public_btn_back_white_solid.imageset/public_btn_back_white_solid@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_delete_white_solid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "public_btn_delete_white_solid@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_delete_white_solid.imageset/public_btn_delete_white_solid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/public_btn_delete_white_solid.imageset/public_btn_delete_white_solid@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_next_white_solid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "public_btn_next_white_solid@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_next_white_solid.imageset/public_btn_next_white_solid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/public_btn_next_white_solid.imageset/public_btn_next_white_solid@2x.png -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_setting_white_solid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "public_btn_setting_white_solid@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iOSDemo/Assets.xcassets/public_btn_setting_white_solid.imageset/public_btn_setting_white_solid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Assets.xcassets/public_btn_setting_white_solid.imageset/public_btn_setting_white_solid@2x.png -------------------------------------------------------------------------------- /iOSDemo/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 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /iOSDemo/Base/Log/LogTool.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogTool.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2021/11/17. 6 | // Copyright © 2021 Stan Hu. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | class LogTool{ 11 | // static let db = Database(withPath: "\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, .userDomainMask, true).first!)/log.db") 12 | 13 | init() { 14 | 15 | } 16 | 17 | 18 | } 19 | 20 | enum logLevel:Int{ 21 | case debug = 0 22 | case info 23 | case warn 24 | case error 25 | case fatal 26 | } 27 | 28 | 29 | struct log{ 30 | var time:Date = Date() 31 | var level = logLevel.info 32 | var content = "" 33 | 34 | } 35 | 36 | 37 | var logs = Logs() 38 | 39 | struct Logs{ 40 | static let mar = JinkeyMarsBridge() 41 | static func log(type:XloggerType, tag:String,content:String){ 42 | mar.log(type, tag: tag, content: content) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Documents/DB/common.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Documents/DB/common.sqlite3 -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db-shm -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/Cache.db-wal -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/GrandStoreGrandStore.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | userVideoStore 6 | 2147483647-05-07T17:00:00Z 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/GrandStoreuserVideoStore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/GrandStoreuserVideoStore -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/0A202D6D-0E9E-462F-8ABF-3C63300AE4CA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/0A202D6D-0E9E-462F-8ABF-3C63300AE4CA -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/A789C9A1-F71C-49AF-8D11-3A954CC54F51: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/A789C9A1-F71C-49AF-8D11-3A954CC54F51 -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/A845B740-6461-4C3E-818B-AC32D4DD58B5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/A845B740-6461-4C3E-818B-AC32D4DD58B5 -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/C9ACB54D-FE04-42A9-9B7B-A010A906AF72: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/StanHu.iOSDemo/fsCachedData/C9ACB54D-FE04-42A9-9B7B-A010A906AF72 -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/WebKit/NetworkCache/Version 16/Records/D1565B558C74E88CB4A6B765A2F1B767D91C3DF2/Resource/AE33E3019CD235305F4EC4EF29C54C3A8826DAF6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/WebKit/NetworkCache/Version 16/Records/D1565B558C74E88CB4A6B765A2F1B767D91C3DF2/Resource/AE33E3019CD235305F4EC4EF29C54C3A8826DAF6 -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/WebKit/NetworkCache/Version 16/salt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/WebKit/NetworkCache/Version 16/salt -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.WebKit.WebContent/com.apple.metal/functions.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.WebKit.WebContent/com.apple.metal/functions.data -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.WebKit.WebContent/com.apple.metal/functions.list: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.WebKit.WebContent/com.apple.metal/functions.list -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.dyld/iOSDemo.closure: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Caches/com.apple.dyld/iOSDemo.closure -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Cookies/Cookies.binarycookies: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Cookies/Cookies.binarycookies -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Preferences/StanHu.iOSDemo.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Preferences/StanHu.iOSDemo.plist -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Saved Application State/StanHu.iOSDemo.savedState/KnownSceneSessions/data.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/Saved Application State/StanHu.iOSDemo.savedState/KnownSceneSessions/data.data -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/54CF958A-C7CB-47CB-8E17-1961C5089A3A@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/54CF958A-C7CB-47CB-8E17-1961C5089A3A@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/5E63D984-94A4-4D75-B731-2A9A4D37F372@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/5E63D984-94A4-4D75-B731-2A9A4D37F372@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/BBA2B351-1CDF-4605-8FB4-90A748FEB171@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/BBA2B351-1CDF-4605-8FB4-90A748FEB171@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/BC2436C2-BF5C-4D1F-A258-D312148D1C01@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/StanHu.iOSDemo - {DEFAULT GROUP}/BC2436C2-BF5C-4D1F-A258-D312148D1C01@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/4821B647-25AE-429D-A45C-284F1A6167C9@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/4821B647-25AE-429D-A45C-284F1A6167C9@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/545DAF94-5537-479D-8168-C1833A9D3C30@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/545DAF94-5537-479D-8168-C1833A9D3C30@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/downscaled/9B3635E5-4FAC-4794-A98A-6DE8F58811C1@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/downscaled/9B3635E5-4FAC-4794-A98A-6DE8F58811C1@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/downscaled/A012DE26-B4E5-43D3-9E87-8807EB96E502@2x.ktx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/SplashBoard/Snapshots/sceneID:StanHu.iOSDemo-default/downscaled/A012DE26-B4E5-43D3-9E87-8807EB96E502@2x.ktx -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db-shm -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppData/Library/WebKit/WebsiteData/ResourceLoadStatistics/observations.db-wal -------------------------------------------------------------------------------- /iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppDataInfo.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DuckDeck/iOSDemo/ba22019821ff13042f04e70288cd0bb8688c2438/iOSDemo/Base/StanHu.iOSDemo 2021-06-03 11:53.50.xcappdata/AppDataInfo.plist -------------------------------------------------------------------------------- /iOSDemo/Base/Thread/Apply.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Apply.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 27/12/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | //是同步函数,会阻塞当前线程直到所有循环迭代执行完成。当提交到并发queue时,循环迭代的执行顺序是不确定的 11 | class Apply { 12 | 13 | static var i = 0 14 | static func TestGCDApply(){ 15 | 16 | DispatchQueue.concurrentPerform(iterations: 10) { (index) in 17 | printTest() 18 | } 19 | } 20 | 21 | static func printTest(){ 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /iOSDemo/Base/Thread/Group.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Group.swift 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 27/12/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Group { 12 | static func testGCDGroup() { 13 | //并发队列 14 | let group = DispatchGroup() 15 | for _ in 0...10 { 16 | group.enter() 17 | Engine.instanse.doAsyncWorkWithCompleted({ 18 | group.leave() 19 | }) 20 | } 21 | _ = group.wait(timeout: DispatchTime.distantFuture) 22 | print("testGCDGroup完成") 23 | } 24 | 25 | static func testGCDGroup2(){ 26 | let queue = DispatchQueue.global(qos: DispatchQoS.QoSClass.default) 27 | let group = DispatchGroup() 28 | queue.async(group: group) { 29 | Thread.sleep(forTimeInterval: 1) 30 | print("Group1") 31 | } 32 | queue.async(group: group) { 33 | Thread.sleep(forTimeInterval: 2) 34 | print("Group2") 35 | } 36 | 37 | queue.async(group: group) { 38 | Thread.sleep(forTimeInterval: 3) 39 | print("Group3") 40 | } 41 | 42 | group.notify(queue: DispatchQueue.main) { 43 | print("testGCDGroup2 完成") 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /iOSDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | NSCameraUsageDescription 29 | 用一下相机 30 | NSLocationAlwaysAndWhenInUseUsageDescription 31 | Demo需要通过您的地理位置来测试功能 32 | NSLocationWhenInUseUsageDescription 33 | Demo需要通过您的地理位置来测试功能 34 | NSMicrophoneUsageDescription 35 | 用一下麦克风 36 | NSPhotoLibraryAddUsageDescription 37 | 用一下相册 38 | NSPhotoLibraryUsageDescription 39 | 看一下相册 40 | UIFileSharingEnabled 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /iOSDemo/bridge.h: -------------------------------------------------------------------------------- 1 | // 2 | // bridge.h 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 13/9/2017. 6 | // Copyright © 2017 Stan Hu. All rights reserved. 7 | // 8 | 9 | #ifndef bridge_h 10 | #define bridge_h 11 | 12 | #import "JXLayoutButton.h" 13 | #import "MJRefresh.h" 14 | #import "TZImagePickerController.h" 15 | #endif /* bridge_h */ 16 | #import "appender-swift-bridge.h" 17 | -------------------------------------------------------------------------------- /iOSDemo/iOSDemo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.external-accessory.wireless-configuration 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOSDemo/iOSDemo.pch: -------------------------------------------------------------------------------- 1 | // 2 | // PrefixHeader.pch 3 | // iOSDemo 4 | // 5 | // Created by Stan Hu on 2019/10/8. 6 | // Copyright © 2019 Stan Hu. All rights reserved. 7 | // 8 | 9 | #ifndef PrefixHeader_pch 10 | #define PrefixHeader_pch 11 | 12 | // Include any system framework and library headers here that should be included in all compilation units. 13 | // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. 14 | 15 | #endif /* PrefixHeader_pch */ 16 | --------------------------------------------------------------------------------