├── .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 |
--------------------------------------------------------------------------------