├── .gitignore ├── GKDYVideo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ └── GKDYVideo.xcscheme ├── GKDYVideo.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── GKDYVideo ├── .DS_Store ├── Assets.xcassets │ ├── .DS_Store │ ├── AppIcon.appiconset │ │ ├── 1024_Normal.png │ │ ├── 20_Normal@2x.png │ │ ├── 20_Normal@3x.png │ │ ├── 29_Normal@2x.png │ │ ├── 29_Normal@3x.png │ │ ├── 38_Normal@2x.png │ │ ├── 38_Normal@3x.png │ │ ├── 40_Normal@2x.png │ │ ├── 40_Normal@3x.png │ │ ├── 60_Normal@2x.png │ │ ├── 60_Normal@3x.png │ │ ├── 64_Normal@2x.png │ │ ├── 64_Normal@3x.png │ │ ├── 68_Normal@2x.png │ │ ├── 76_Normal@2x.png │ │ ├── 83.5_Normal@2x.png │ │ └── Contents.json │ ├── Contents.json │ ├── Douyin │ │ ├── Contents.json │ │ ├── WechatIMG238.imageset │ │ │ ├── Contents.json │ │ │ └── WechatIMG238.jpeg │ │ ├── WechatIMG239.imageset │ │ │ ├── Contents.json │ │ │ └── WechatIMG239.jpeg │ │ ├── WechatIMG240.imageset │ │ │ ├── Contents.json │ │ │ └── WechatIMG240.jpeg │ │ ├── icTitlebarBackWhite_Normal.imageset │ │ │ ├── Contents.json │ │ │ ├── icTitlebarBackWhite_Normal@2x.png │ │ │ └── icTitlebarBackWhite_Normal@3x.png │ │ ├── ss_icon_comment.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_comment@2x.png │ │ │ └── ss_icon_comment@3x.png │ │ ├── ss_icon_like.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_like@2x.png │ │ │ └── ss_icon_like@3x.png │ │ ├── ss_icon_pause.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_pause@2x.png │ │ │ └── ss_icon_pause@3x.png │ │ ├── ss_icon_share.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_share@2x.png │ │ │ └── ss_icon_share@3x.png │ │ ├── ss_icon_star_normal.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_star_normal@2x.png │ │ │ └── ss_icon_star_normal@3x.png │ │ └── ss_icon_star_selected.imageset │ │ │ ├── Contents.json │ │ │ ├── ss_icon_star_selected@2x.png │ │ │ └── ss_icon_star_selected@3x.png │ ├── arrow_close.imageset │ │ ├── Contents.json │ │ └── arrow_close.png │ ├── arrow_open.imageset │ │ ├── Contents.json │ │ └── arrow_open.png │ ├── bg.imageset │ │ ├── Contents.json │ │ └── bg.png │ ├── btn_home_add.imageset │ │ ├── Contents.json │ │ ├── btn_home_add~iphone.png │ │ └── btn_home_add~iphone@2x.png │ ├── close.imageset │ │ ├── Contents.json │ │ ├── close@2x.png │ │ └── close@3x.png │ ├── icHomeSearchPure.imageset │ │ ├── Contents.json │ │ ├── icHomeSearchPure~iphone.png │ │ └── icHomeSearchPure~iphone@2x.png │ ├── ic_back_white.imageset │ │ ├── Contents.json │ │ ├── ic_back_white@2x.png │ │ └── ic_back_white@3x.png │ ├── ic_home_like_after.imageset │ │ ├── Contents.json │ │ └── ic_home_like_after.png │ ├── ic_home_like_before.imageset │ │ ├── Contents.json │ │ └── ic_home_like_before.png │ ├── ich_feed_search_Normal.imageset │ │ ├── Contents.json │ │ ├── ich_feed_search_Normal@2x.png │ │ └── ich_feed_search_Normal@3x.png │ ├── iconTitlebarSuipai.imageset │ │ ├── Contents.json │ │ ├── iconTitlebarSuipai~iphone.png │ │ └── iconTitlebarSuipai~iphone@2x.png │ ├── iconTitlebarSuipaiLight.imageset │ │ ├── Contents.json │ │ ├── iconTitlebarSuipaiLight~iphone.png │ │ └── iconTitlebarSuipaiLight~iphone@2x.png │ ├── icon_feedback_close_Normal.imageset │ │ ├── Contents.json │ │ ├── icon_feedback_close_Normal@2x.png │ │ └── icon_feedback_close_Normal@3x.png │ ├── icon_home_comment.imageset │ │ ├── Contents.json │ │ ├── icon_home_comment~iphone.png │ │ └── icon_home_comment~iphone@2x.png │ ├── icon_home_share.imageset │ │ ├── Contents.json │ │ ├── icon_home_share~iphone.png │ │ └── icon_home_share~iphone@2x.png │ ├── icon_modern_feed_play_Normal.imageset │ │ ├── Contents.json │ │ ├── icon_modern_feed_play_Normal@2x.png │ │ └── icon_modern_feed_play_Normal@3x.png │ ├── icon_music_pause_new_Normal.imageset │ │ ├── Contents.json │ │ ├── icon_music_pause_new_Normal@2x.png │ │ └── icon_music_pause_new_Normal@3x.png │ ├── icon_pause.imageset │ │ ├── Contents.json │ │ ├── icon_pause@2x.png │ │ └── icon_pause@3x.png │ ├── icon_play.imageset │ │ ├── Contents.json │ │ ├── icon_play@2x.png │ │ └── icon_play@3x.png │ ├── icon_slider.imageset │ │ ├── Contents.json │ │ ├── icon_slider@2x.png │ │ └── icon_slider@3x.png │ ├── icon_splash_logo_Normal.imageset │ │ ├── Contents.json │ │ ├── icon_splash_logo_Normal@2x.png │ │ └── icon_splash_logo_Normal@3x.png │ ├── icon_titlebar_addfriend.imageset │ │ ├── Contents.json │ │ ├── icon_titlebar_addfriend~iphone.png │ │ └── icon_titlebar_addfriend~iphone@2x.png │ ├── icon_titlebar_whitescan_off_cover.imageset │ │ ├── Contents.json │ │ ├── icon_titlebar_whitescan_off_cover~iphone.png │ │ └── icon_titlebar_whitescan_off_cover~iphone@2x.png │ ├── img_video_loading.imageset │ │ ├── Contents.json │ │ ├── img_video_loading~iphone.png │ │ └── img_video_loading~iphone@2x.png │ ├── img_video_loading_m.imageset │ │ ├── Contents.json │ │ ├── img_video_loading_m~iphone.png │ │ └── img_video_loading_m~iphone@2x.png │ ├── likeHeart.imageset │ │ ├── Contents.json │ │ ├── likeHeart~iphone.png │ │ └── likeHeart~iphone@2x.png │ ├── nav_search.imageset │ │ ├── Contents.json │ │ ├── nav_search.png │ │ ├── nav_search@2x.png │ │ └── nav_search@3x.png │ ├── placeholderimg.imageset │ │ ├── Contents.json │ │ ├── placeholderimg.png │ │ ├── placeholderimg@2x.png │ │ └── placeholderimg@3x.png │ └── ss_icon_shrinkscreen.imageset │ │ ├── Contents.json │ │ ├── ss_icon_shrinkscreen@2x.png │ │ └── ss_icon_shrinkscreen@3x.png ├── Base.lproj │ └── LaunchScreen.storyboard ├── Classes │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Attent │ │ └── Controller │ │ │ ├── GKDYAttentViewController.h │ │ │ └── GKDYAttentViewController.m │ ├── Base │ │ └── Controller │ │ │ ├── GKDYBaseViewController.h │ │ │ └── GKDYBaseViewController.m │ ├── Home │ │ ├── .DS_Store │ │ ├── Comment │ │ │ ├── Model │ │ │ │ ├── GKDYCommentModel.h │ │ │ │ └── GKDYCommentModel.m │ │ │ └── View │ │ │ │ ├── GKDYCommentCell.h │ │ │ │ ├── GKDYCommentCell.m │ │ │ │ ├── GKDYCommentControlView.h │ │ │ │ ├── GKDYCommentControlView.m │ │ │ │ ├── GKDYCommentView.h │ │ │ │ └── GKDYCommentView.m │ │ ├── GKDYHomeViewController.h │ │ ├── GKDYHomeViewController.m │ │ ├── GKDYSearchViewController.h │ │ ├── GKDYSearchViewController.m │ │ ├── GKDYShootViewController.h │ │ ├── GKDYShootViewController.m │ │ └── Video │ │ │ ├── Controller │ │ │ ├── GKDYListPlayerController.h │ │ │ ├── GKDYListPlayerController.m │ │ │ ├── GKDYPlayerViewController.h │ │ │ └── GKDYPlayerViewController.m │ │ │ ├── Manager │ │ │ ├── GKDYPlayerManager.h │ │ │ └── GKDYPlayerManager.m │ │ │ ├── Model │ │ │ ├── GKDYVideoModel.h │ │ │ └── GKDYVideoModel.m │ │ │ └── View │ │ │ ├── GKDYPanGestureRecognizer.h │ │ │ ├── GKDYPanGestureRecognizer.m │ │ │ ├── GKDYScrollView.h │ │ │ ├── GKDYScrollView.m │ │ │ ├── GKDYTitleView.h │ │ │ ├── GKDYTitleView.m │ │ │ ├── GKDYVideoCell.h │ │ │ ├── GKDYVideoCell.m │ │ │ ├── GKDYVideoControlView.h │ │ │ ├── GKDYVideoControlView.m │ │ │ ├── GKDYVideoFullscreenView.h │ │ │ ├── GKDYVideoFullscreenView.m │ │ │ ├── GKDYVideoItemButton.h │ │ │ ├── GKDYVideoItemButton.m │ │ │ ├── GKDYVideoLandscapeCell.h │ │ │ ├── GKDYVideoLandscapeCell.m │ │ │ ├── GKDYVideoLandscapeView.h │ │ │ ├── GKDYVideoLandscapeView.m │ │ │ ├── GKDYVideoMaskView.h │ │ │ ├── GKDYVideoMaskView.m │ │ │ ├── GKDYVideoPortraitCell.h │ │ │ ├── GKDYVideoPortraitCell.m │ │ │ ├── GKDYVideoPortraitView.h │ │ │ ├── GKDYVideoPortraitView.m │ │ │ ├── GKDYVideoPreviewView.h │ │ │ ├── GKDYVideoPreviewView.m │ │ │ ├── GKDYVideoScrollView.h │ │ │ ├── GKDYVideoScrollView.m │ │ │ ├── GKDYVideoSlider.h │ │ │ ├── GKDYVideoSlider.m │ │ │ ├── GKDYVideoStatusBar.h │ │ │ └── GKDYVideoStatusBar.m │ ├── Main │ │ ├── Controller │ │ │ ├── GKDYMainViewController.h │ │ │ ├── GKDYMainViewController.m │ │ │ ├── GKDYNavigationController.h │ │ │ └── GKDYNavigationController.m │ │ └── View │ │ │ ├── GKDYTabBar.h │ │ │ └── GKDYTabBar.m │ ├── Message │ │ └── Controller │ │ │ ├── GKDYMessageViewController.h │ │ │ └── GKDYMessageViewController.m │ ├── Mine │ │ ├── Controller │ │ │ ├── GKDYMineViewController.h │ │ │ ├── GKDYMineViewController.m │ │ │ ├── GKDYUserViewController.h │ │ │ ├── GKDYUserViewController.m │ │ │ ├── GKDYVideoListViewController.h │ │ │ └── GKDYVideoListViewController.m │ │ ├── Model │ │ │ ├── GKDYUserModel.h │ │ │ ├── GKDYUserModel.m │ │ │ ├── GKDYUserVideoModel.h │ │ │ └── GKDYUserVideoModel.m │ │ ├── View │ │ │ ├── GKDYScaleVideoView.h │ │ │ ├── GKDYScaleVideoView.m │ │ │ ├── GKDYUserHeaderView.h │ │ │ ├── GKDYUserHeaderView.m │ │ │ ├── GKDYVideoListCell.h │ │ │ └── GKDYVideoListCell.m │ │ └── ViewModel │ │ │ ├── GKDYUserVideoViewModel.h │ │ │ └── GKDYUserVideoViewModel.m │ └── Tools │ │ ├── .DS_Store │ │ ├── Category │ │ ├── NSMethodSignature+GKCategory.h │ │ ├── NSMethodSignature+GKCategory.m │ │ ├── NSString+GKCategory.h │ │ ├── NSString+GKCategory.m │ │ ├── UIButton+GKCategory.h │ │ ├── UIButton+GKCategory.m │ │ ├── UITabBar+GKCategory.h │ │ └── UITabBar+GKCategory.m │ │ ├── GKDYTools.h │ │ ├── GKDYTools.m │ │ ├── GKLikeView │ │ ├── GKDoubleLikeView.h │ │ ├── GKDoubleLikeView.m │ │ ├── GKLikeView.h │ │ └── GKLikeView.m │ │ ├── GKLoadingView │ │ ├── GKBallLoadingView.h │ │ └── GKBallLoadingView.m │ │ ├── GKNetworking │ │ ├── GKNetworking.h │ │ └── GKNetworking.m │ │ ├── GKRotationManager │ │ ├── GKLandscapeViewController.h │ │ ├── GKLandscapeViewController.m │ │ ├── GKLandscapeWindow.h │ │ ├── GKLandscapeWindow.m │ │ ├── GKRotationManager.h │ │ ├── GKRotationManager.m │ │ ├── GKRotationManager_iOS_16_Later.h │ │ ├── GKRotationManager_iOS_16_Later.m │ │ ├── GKRotationManager_iOS_9_15.h │ │ └── GKRotationManager_iOS_9_15.m │ │ └── GKScaleTransition │ │ ├── GKScaleAnimation.h │ │ ├── GKScaleAnimation.m │ │ ├── GKScaleTransition.h │ │ └── GKScaleTransition.m ├── Info.plist ├── PrefixHeader.pch └── main.m ├── LICENSE ├── Podfile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # macOs 2 | .DS_Store 3 | 4 | # Xcode 5 | # 6 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 7 | 8 | ## Build generated 9 | build/ 10 | DerivedData/ 11 | 12 | ## Various settings 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata/ 22 | 23 | ## Other 24 | *.moved-aside 25 | *.xccheckout 26 | *.xcscmblueprint 27 | 28 | ## Obj-C/Swift specific 29 | *.hmap 30 | *.ipa 31 | *.dSYM.zip 32 | *.dSYM 33 | 34 | # CocoaPods 35 | # 36 | # We recommend against adding the Pods directory to your .gitignore. However 37 | # you should judge for yourself, the pros and cons are mentioned at: 38 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 39 | # 40 | Pods/ 41 | 42 | # Carthage 43 | # 44 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 45 | # Carthage/Checkouts 46 | 47 | Carthage/Build 48 | 49 | # fastlane 50 | # 51 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 52 | # screenshots whenever they are needed. 53 | # For more information about the recommended setup visit: 54 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 55 | 56 | fastlane/report.xml 57 | fastlane/Preview.html 58 | fastlane/screenshots/**/*.png 59 | fastlane/test_output 60 | 61 | # Code Injection 62 | # 63 | # After new code Injection tools there's a generated folder /iOSInjectionProject 64 | # https://github.com/johnno1962/injectionforxcode 65 | 66 | iOSInjectionProject/ 67 | Podfile.lock 68 | -------------------------------------------------------------------------------- /GKDYVideo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GKDYVideo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GKDYVideo.xcodeproj/xcshareddata/xcschemes/GKDYVideo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 52 | 58 | 59 | 60 | 61 | 62 | 72 | 74 | 80 | 81 | 82 | 83 | 87 | 88 | 89 | 90 | 96 | 98 | 104 | 105 | 106 | 107 | 109 | 110 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /GKDYVideo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /GKDYVideo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GKDYVideo/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/.DS_Store -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/1024_Normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/1024_Normal.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/20_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/20_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/20_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/20_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/29_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/29_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/29_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/29_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/38_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/38_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/38_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/38_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/40_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/40_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/40_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/40_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/60_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/60_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/60_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/60_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/64_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/64_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/64_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/64_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/68_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/68_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/76_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/76_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/83.5_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/AppIcon.appiconset/83.5_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "20_Normal@2x.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "scale" : "2x", 8 | "size" : "20x20" 9 | }, 10 | { 11 | "filename" : "20_Normal@3x.png", 12 | "idiom" : "universal", 13 | "platform" : "ios", 14 | "scale" : "3x", 15 | "size" : "20x20" 16 | }, 17 | { 18 | "filename" : "29_Normal@2x.png", 19 | "idiom" : "universal", 20 | "platform" : "ios", 21 | "scale" : "2x", 22 | "size" : "29x29" 23 | }, 24 | { 25 | "filename" : "29_Normal@3x.png", 26 | "idiom" : "universal", 27 | "platform" : "ios", 28 | "scale" : "3x", 29 | "size" : "29x29" 30 | }, 31 | { 32 | "filename" : "38_Normal@2x.png", 33 | "idiom" : "universal", 34 | "platform" : "ios", 35 | "scale" : "2x", 36 | "size" : "38x38" 37 | }, 38 | { 39 | "filename" : "38_Normal@3x.png", 40 | "idiom" : "universal", 41 | "platform" : "ios", 42 | "scale" : "3x", 43 | "size" : "38x38" 44 | }, 45 | { 46 | "filename" : "40_Normal@2x.png", 47 | "idiom" : "universal", 48 | "platform" : "ios", 49 | "scale" : "2x", 50 | "size" : "40x40" 51 | }, 52 | { 53 | "filename" : "40_Normal@3x.png", 54 | "idiom" : "universal", 55 | "platform" : "ios", 56 | "scale" : "3x", 57 | "size" : "40x40" 58 | }, 59 | { 60 | "filename" : "60_Normal@2x.png", 61 | "idiom" : "universal", 62 | "platform" : "ios", 63 | "scale" : "2x", 64 | "size" : "60x60" 65 | }, 66 | { 67 | "filename" : "60_Normal@3x.png", 68 | "idiom" : "universal", 69 | "platform" : "ios", 70 | "scale" : "3x", 71 | "size" : "60x60" 72 | }, 73 | { 74 | "filename" : "64_Normal@2x.png", 75 | "idiom" : "universal", 76 | "platform" : "ios", 77 | "scale" : "2x", 78 | "size" : "64x64" 79 | }, 80 | { 81 | "filename" : "64_Normal@3x.png", 82 | "idiom" : "universal", 83 | "platform" : "ios", 84 | "scale" : "3x", 85 | "size" : "64x64" 86 | }, 87 | { 88 | "filename" : "68_Normal@2x.png", 89 | "idiom" : "universal", 90 | "platform" : "ios", 91 | "scale" : "2x", 92 | "size" : "68x68" 93 | }, 94 | { 95 | "filename" : "76_Normal@2x.png", 96 | "idiom" : "universal", 97 | "platform" : "ios", 98 | "scale" : "2x", 99 | "size" : "76x76" 100 | }, 101 | { 102 | "filename" : "83.5_Normal@2x.png", 103 | "idiom" : "universal", 104 | "platform" : "ios", 105 | "scale" : "2x", 106 | "size" : "83.5x83.5" 107 | }, 108 | { 109 | "filename" : "1024_Normal.png", 110 | "idiom" : "universal", 111 | "platform" : "ios", 112 | "size" : "1024x1024" 113 | } 114 | ], 115 | "info" : { 116 | "author" : "xcode", 117 | "version" : 1 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG238.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "WechatIMG238.jpeg", 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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG238.imageset/WechatIMG238.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/WechatIMG238.imageset/WechatIMG238.jpeg -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG239.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "WechatIMG239.jpeg", 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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG239.imageset/WechatIMG239.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/WechatIMG239.imageset/WechatIMG239.jpeg -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG240.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "WechatIMG240.jpeg", 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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/WechatIMG240.imageset/WechatIMG240.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/WechatIMG240.imageset/WechatIMG240.jpeg -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/icTitlebarBackWhite_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icTitlebarBackWhite_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icTitlebarBackWhite_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/icTitlebarBackWhite_Normal.imageset/icTitlebarBackWhite_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/icTitlebarBackWhite_Normal.imageset/icTitlebarBackWhite_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/icTitlebarBackWhite_Normal.imageset/icTitlebarBackWhite_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/icTitlebarBackWhite_Normal.imageset/icTitlebarBackWhite_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_comment.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_comment@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_comment@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_comment.imageset/ss_icon_comment@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_comment.imageset/ss_icon_comment@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_comment.imageset/ss_icon_comment@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_comment.imageset/ss_icon_comment@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_like.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_like@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_like@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_like.imageset/ss_icon_like@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_like.imageset/ss_icon_like@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_like.imageset/ss_icon_like@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_like.imageset/ss_icon_like@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_pause.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_pause@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_pause@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_pause.imageset/ss_icon_pause@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_pause.imageset/ss_icon_pause@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_pause.imageset/ss_icon_pause@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_pause.imageset/ss_icon_pause@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_share@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_share@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_share.imageset/ss_icon_share@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_share.imageset/ss_icon_share@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_share.imageset/ss_icon_share@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_share.imageset/ss_icon_share@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_star_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_star_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_normal.imageset/ss_icon_star_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_normal.imageset/ss_icon_star_normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_normal.imageset/ss_icon_star_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_normal.imageset/ss_icon_star_normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ss_icon_star_selected@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ss_icon_star_selected@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_selected.imageset/ss_icon_star_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_selected.imageset/ss_icon_star_selected@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_selected.imageset/ss_icon_star_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/Douyin/ss_icon_star_selected.imageset/ss_icon_star_selected@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/arrow_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "arrow_close.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/arrow_close.imageset/arrow_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/arrow_close.imageset/arrow_close.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/arrow_open.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "arrow_open.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/arrow_open.imageset/arrow_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/arrow_open.imageset/arrow_open.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bg.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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/bg.imageset/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/bg.imageset/bg.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/btn_home_add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "btn_home_add~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "btn_home_add~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/btn_home_add.imageset/btn_home_add~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/btn_home_add.imageset/btn_home_add~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/btn_home_add.imageset/btn_home_add~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/btn_home_add.imageset/btn_home_add~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "close@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "close@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/close.imageset/close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/close.imageset/close@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/close.imageset/close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/close.imageset/close@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icHomeSearchPure.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "icHomeSearchPure~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "icHomeSearchPure~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icHomeSearchPure.imageset/icHomeSearchPure~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icHomeSearchPure.imageset/icHomeSearchPure~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icHomeSearchPure.imageset/icHomeSearchPure~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icHomeSearchPure.imageset/icHomeSearchPure~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_back_white.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "ic_back_white@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "ic_back_white@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_back_white.imageset/ic_back_white@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ic_back_white.imageset/ic_back_white@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_back_white.imageset/ic_back_white@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ic_back_white.imageset/ic_back_white@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_home_like_after.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ic_home_like_after.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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_home_like_after.imageset/ic_home_like_after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ic_home_like_after.imageset/ic_home_like_after.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_home_like_before.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ic_home_like_before.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 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ic_home_like_before.imageset/ic_home_like_before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ic_home_like_before.imageset/ic_home_like_before.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ich_feed_search_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "ich_feed_search_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "ich_feed_search_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ich_feed_search_Normal.imageset/ich_feed_search_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ich_feed_search_Normal.imageset/ich_feed_search_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ich_feed_search_Normal.imageset/ich_feed_search_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ich_feed_search_Normal.imageset/ich_feed_search_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipai.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "iconTitlebarSuipai~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "iconTitlebarSuipai~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipai.imageset/iconTitlebarSuipai~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/iconTitlebarSuipai.imageset/iconTitlebarSuipai~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipai.imageset/iconTitlebarSuipai~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/iconTitlebarSuipai.imageset/iconTitlebarSuipai~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipaiLight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "iconTitlebarSuipaiLight~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "iconTitlebarSuipaiLight~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipaiLight.imageset/iconTitlebarSuipaiLight~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/iconTitlebarSuipaiLight.imageset/iconTitlebarSuipaiLight~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/iconTitlebarSuipaiLight.imageset/iconTitlebarSuipaiLight~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/iconTitlebarSuipaiLight.imageset/iconTitlebarSuipaiLight~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_feedback_close_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_feedback_close_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_feedback_close_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_feedback_close_Normal.imageset/icon_feedback_close_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_feedback_close_Normal.imageset/icon_feedback_close_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_feedback_close_Normal.imageset/icon_feedback_close_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_feedback_close_Normal.imageset/icon_feedback_close_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_comment.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "icon_home_comment~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "icon_home_comment~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_comment.imageset/icon_home_comment~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_home_comment.imageset/icon_home_comment~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_comment.imageset/icon_home_comment~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_home_comment.imageset/icon_home_comment~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "icon_home_share~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "icon_home_share~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_share.imageset/icon_home_share~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_home_share.imageset/icon_home_share~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_home_share.imageset/icon_home_share~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_home_share.imageset/icon_home_share~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_modern_feed_play_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_modern_feed_play_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_modern_feed_play_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_modern_feed_play_Normal.imageset/icon_modern_feed_play_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_modern_feed_play_Normal.imageset/icon_modern_feed_play_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_modern_feed_play_Normal.imageset/icon_modern_feed_play_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_modern_feed_play_Normal.imageset/icon_modern_feed_play_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_music_pause_new_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_music_pause_new_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_music_pause_new_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_music_pause_new_Normal.imageset/icon_music_pause_new_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_music_pause_new_Normal.imageset/icon_music_pause_new_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_music_pause_new_Normal.imageset/icon_music_pause_new_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_music_pause_new_Normal.imageset/icon_music_pause_new_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_pause.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_pause@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_pause@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_pause.imageset/icon_pause@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_pause.imageset/icon_pause@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_pause.imageset/icon_pause@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_pause.imageset/icon_pause@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_play.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_play@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_play@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_play.imageset/icon_play@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_play.imageset/icon_play@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_play.imageset/icon_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_play.imageset/icon_play@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_slider.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_slider@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_slider@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_slider.imageset/icon_slider@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_slider.imageset/icon_slider@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_slider.imageset/icon_slider@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_slider.imageset/icon_slider@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_splash_logo_Normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "icon_splash_logo_Normal@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "icon_splash_logo_Normal@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_splash_logo_Normal.imageset/icon_splash_logo_Normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_splash_logo_Normal.imageset/icon_splash_logo_Normal@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_splash_logo_Normal.imageset/icon_splash_logo_Normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_splash_logo_Normal.imageset/icon_splash_logo_Normal@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_addfriend.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "icon_titlebar_addfriend~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "icon_titlebar_addfriend~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_addfriend.imageset/icon_titlebar_addfriend~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_titlebar_addfriend.imageset/icon_titlebar_addfriend~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_addfriend.imageset/icon_titlebar_addfriend~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_titlebar_addfriend.imageset/icon_titlebar_addfriend~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_whitescan_off_cover.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "icon_titlebar_whitescan_off_cover~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "icon_titlebar_whitescan_off_cover~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_whitescan_off_cover.imageset/icon_titlebar_whitescan_off_cover~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_titlebar_whitescan_off_cover.imageset/icon_titlebar_whitescan_off_cover~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/icon_titlebar_whitescan_off_cover.imageset/icon_titlebar_whitescan_off_cover~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/icon_titlebar_whitescan_off_cover.imageset/icon_titlebar_whitescan_off_cover~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "img_video_loading~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "img_video_loading~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading.imageset/img_video_loading~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/img_video_loading.imageset/img_video_loading~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading.imageset/img_video_loading~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/img_video_loading.imageset/img_video_loading~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading_m.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "img_video_loading_m~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "img_video_loading_m~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading_m.imageset/img_video_loading_m~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/img_video_loading_m.imageset/img_video_loading_m~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/img_video_loading_m.imageset/img_video_loading_m~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/img_video_loading_m.imageset/img_video_loading_m~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/likeHeart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "filename" : "likeHeart~iphone.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "filename" : "likeHeart~iphone@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/likeHeart.imageset/likeHeart~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/likeHeart.imageset/likeHeart~iphone.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/likeHeart.imageset/likeHeart~iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/likeHeart.imageset/likeHeart~iphone@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/nav_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "nav_search.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "nav_search@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "nav_search@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/nav_search.imageset/nav_search@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/placeholderimg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "placeholderimg.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "placeholderimg@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "placeholderimg@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/placeholderimg.imageset/placeholderimg@3x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ss_icon_shrinkscreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "ss_icon_shrinkscreen@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "ss_icon_shrinkscreen@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ss_icon_shrinkscreen.imageset/ss_icon_shrinkscreen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ss_icon_shrinkscreen.imageset/ss_icon_shrinkscreen@2x.png -------------------------------------------------------------------------------- /GKDYVideo/Assets.xcassets/ss_icon_shrinkscreen.imageset/ss_icon_shrinkscreen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Assets.xcassets/ss_icon_shrinkscreen.imageset/ss_icon_shrinkscreen@3x.png -------------------------------------------------------------------------------- /GKDYVideo/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 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "GKDYHomeViewController.h" 11 | #import "GKDYShootViewController.h" 12 | #import "GKDYNavigationController.h" 13 | #import "GKDYMainViewController.h" 14 | #import 15 | #import 16 | #import 17 | #import "GKRotationManager.h" 18 | 19 | @interface AppDelegate () 20 | 21 | @end 22 | 23 | @implementation AppDelegate 24 | 25 | 26 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 27 | 28 | [self setupNavBarStyle]; 29 | 30 | [self setupKeyWindow]; 31 | 32 | [self setupWebpSupprot]; 33 | 34 | [self setupNetworkCheck]; 35 | 36 | return YES; 37 | } 38 | 39 | - (void)setupNavBarStyle { 40 | [GKConfigure setupCustomConfigure:^(GKNavigationBarConfigure *configure) { 41 | configure.backStyle = GKNavigationBarBackStyleWhite; 42 | configure.titleFont = [UIFont systemFontOfSize:18.0f]; 43 | configure.titleColor = [UIColor whiteColor]; 44 | configure.gk_navItemLeftSpace = 12.0f; 45 | configure.gk_navItemRightSpace = 12.0f; 46 | configure.statusBarStyle = UIStatusBarStyleLightContent; 47 | }]; 48 | 49 | [GKGestureConfigure setupCustomConfigure:^(GKGestureHandleConfigure * _Nonnull configure) { 50 | configure.gk_scaleX = 0.90f; 51 | configure.gk_scaleY = 0.95f; 52 | }]; 53 | } 54 | 55 | - (void)setupKeyWindow { 56 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 57 | self.window.backgroundColor = [UIColor whiteColor]; 58 | 59 | // GKDYNavigationController *nav = [GKDYNavigationController rootVC:[GKDYShootViewController new]]; 60 | // nav.gk_openScrollLeftPush = YES; // 开启左滑push功能 61 | 62 | GKDYNavigationController *nav = [GKDYNavigationController rootVC:[GKDYMainViewController new]]; 63 | self.window.rootViewController = nav; 64 | [self.window makeKeyAndVisible]; 65 | } 66 | 67 | - (void)setupWebpSupprot { 68 | // Add WebPCoder 69 | SDImageWebPCoder *webPCoder = [SDImageWebPCoder sharedCoder]; 70 | [[SDImageCodersManager sharedManager] addCoder:webPCoder]; 71 | 72 | // Modify HTTP Accept Header 73 | [[SDWebImageDownloader sharedDownloader] setValue:@"image/webp,image/*,*/*;q=0.8" forHTTPHeaderField:@"Accept"]; 74 | } 75 | 76 | - (void)setupNetworkCheck { 77 | AFNetworkReachabilityManager *networkManger = [AFNetworkReachabilityManager sharedManager]; 78 | [networkManger startMonitoring]; 79 | [networkManger setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 80 | if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) { 81 | [[NSNotificationCenter defaultCenter] postNotificationName:@"NetworkChange" object:nil]; 82 | }else { 83 | NSLog(@"无网络"); 84 | } 85 | }]; 86 | } 87 | 88 | - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 89 | GKInterfaceOrientationMask mask = [GKRotationManager supportedInterfaceOrientationsForWindow:window]; 90 | if (mask != GKInterfaceOrientationMaskUnknow) { 91 | return (UIInterfaceOrientationMask)mask; 92 | } 93 | 94 | ZFInterfaceOrientationMask orientationMask = [ZFLandscapeRotationManager supportedInterfaceOrientationsForWindow:window]; 95 | if (orientationMask != ZFInterfaceOrientationMaskUnknow) { 96 | return (UIInterfaceOrientationMask)orientationMask; 97 | } 98 | return UIInterfaceOrientationMaskPortrait; 99 | } 100 | 101 | @end 102 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Attent/Controller/GKDYAttentViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYAttentViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYAttentViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Attent/Controller/GKDYAttentViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYAttentViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYAttentViewController.h" 10 | 11 | @interface GKDYAttentViewController () 12 | 13 | @end 14 | 15 | @implementation GKDYAttentViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | self.gk_navBackgroundColor = [UIColor clearColor]; 21 | self.gk_navShadowColor = [UIColor colorWithWhite:1.0f alpha:0.2f]; 22 | self.gk_navTitle = @"关注"; 23 | 24 | self.view.backgroundColor = [UIColor blackColor]; 25 | 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Base/Controller/GKDYBaseViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYBaseViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYBaseViewController : UIViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Base/Controller/GKDYBaseViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYBaseViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | @interface GKDYBaseViewController () 12 | 13 | @end 14 | 15 | @implementation GKDYBaseViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | self.view.backgroundColor = [UIColor whiteColor]; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Classes/Home/.DS_Store -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/Model/GKDYCommentModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentModel.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/18. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYCommentInfoModel : NSObject 14 | 15 | @property (nonatomic, copy) NSString *reply_id; 16 | 17 | @property (nonatomic, copy) NSString *uname; 18 | 19 | @property (nonatomic, copy) NSString *avatar; 20 | 21 | @property (nonatomic, copy) NSString *content; 22 | 23 | @property (nonatomic, copy) NSString *create_time; 24 | 25 | @property (nonatomic, copy) NSString *create_time_text; 26 | 27 | @end 28 | 29 | @interface GKDYCommentModel : NSObject 30 | 31 | @property (nonatomic, copy) NSString *request_id; 32 | 33 | @property (nonatomic, copy) NSString *thread_id; 34 | 35 | @property (nonatomic, copy) NSString *vid; 36 | 37 | @property (nonatomic, copy) NSString *comment_count; 38 | 39 | @property (nonatomic, strong) NSArray *list; 40 | 41 | @property (nonatomic, assign) BOOL is_over; 42 | 43 | @end 44 | 45 | NS_ASSUME_NONNULL_END 46 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/Model/GKDYCommentModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentModel.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/18. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYCommentModel.h" 10 | 11 | @implementation GKDYCommentInfoModel 12 | 13 | @end 14 | 15 | @implementation GKDYCommentModel 16 | 17 | + (NSDictionary *)modelContainerPropertyGenericClass { 18 | return @{@"list" : GKDYCommentInfoModel.class}; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/View/GKDYCommentCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentCell.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/18. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYCommentModel.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYCommentCell : UITableViewCell 15 | 16 | - (void)loadData:(GKDYCommentInfoModel *)model; 17 | 18 | + (CGFloat)heightWithModel:(GKDYCommentInfoModel *)model; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/View/GKDYCommentCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentCell.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/18. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYCommentCell.h" 10 | 11 | @interface GKDYCommentCell() 12 | 13 | @property (nonatomic, strong) UIImageView *iconView; 14 | 15 | @property (nonatomic, strong) UILabel *nameLabel; 16 | 17 | @property (nonatomic, strong) UILabel *contentLabel; 18 | 19 | @end 20 | 21 | @implementation GKDYCommentCell 22 | 23 | - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 24 | if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 25 | [self initUI]; 26 | } 27 | return self; 28 | } 29 | 30 | - (void)initUI { 31 | self.selectionStyle = UITableViewCellSelectionStyleNone; 32 | self.backgroundColor = UIColor.clearColor; 33 | self.contentView.backgroundColor = UIColor.clearColor; 34 | 35 | [self.contentView addSubview:self.iconView]; 36 | [self.contentView addSubview:self.nameLabel]; 37 | [self.contentView addSubview:self.contentLabel]; 38 | 39 | [self.iconView mas_makeConstraints:^(MASConstraintMaker *make) { 40 | make.left.equalTo(self).offset(15); 41 | make.top.equalTo(self).offset(15); 42 | make.width.height.mas_equalTo(36); 43 | }]; 44 | 45 | [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { 46 | make.top.equalTo(self).offset(15); 47 | make.left.equalTo(self.iconView.mas_right).offset(8); 48 | make.right.equalTo(self).offset(-15); 49 | }]; 50 | 51 | [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { 52 | make.top.equalTo(self.nameLabel.mas_bottom).offset(6); 53 | make.left.right.equalTo(self.nameLabel); 54 | }]; 55 | } 56 | 57 | - (void)loadData:(GKDYCommentInfoModel *)model { 58 | [self.iconView sd_setImageWithURL:[NSURL URLWithString:model.avatar]]; 59 | self.nameLabel.text = model.uname; 60 | self.contentLabel.text = model.content; 61 | } 62 | 63 | + (CGFloat)heightWithModel:(GKDYCommentInfoModel *)model { 64 | return 15 + [UIFont systemFontOfSize:14].lineHeight + 6 + [self contentHeightWithText:model.content] + 4; 65 | } 66 | 67 | + (CGFloat)contentHeightWithText:(NSString *)text { 68 | 69 | CGFloat maxWidth = UIScreen.mainScreen.bounds.size.width - 15 - 15 - 36 - 8; 70 | 71 | NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:text]; 72 | [str addAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16]} range:NSMakeRange(0, text.length)]; 73 | 74 | CGSize size = [str boundingRectWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; 75 | 76 | return size.height; 77 | } 78 | 79 | #pragma mark - Lazy 80 | - (UIImageView *)iconView { 81 | if (!_iconView) { 82 | _iconView = [[UIImageView alloc] init]; 83 | _iconView.layer.cornerRadius = 18; 84 | _iconView.layer.masksToBounds = YES; 85 | } 86 | return _iconView; 87 | } 88 | 89 | - (UILabel *)nameLabel { 90 | if (!_nameLabel) { 91 | _nameLabel = [[UILabel alloc] init]; 92 | _nameLabel.font = [UIFont systemFontOfSize:14]; 93 | _nameLabel.textColor = UIColor.grayColor; 94 | } 95 | return _nameLabel; 96 | } 97 | 98 | - (UILabel *)contentLabel { 99 | if (!_contentLabel) { 100 | _contentLabel = [[UILabel alloc] init]; 101 | _contentLabel.font = [UIFont systemFontOfSize:16]; 102 | _contentLabel.textColor = UIColor.whiteColor; 103 | _contentLabel.numberOfLines = 0; 104 | } 105 | return _contentLabel; 106 | } 107 | 108 | @end 109 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/View/GKDYCommentControlView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentControlView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/19. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYCommentControlView : UIView 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/View/GKDYCommentControlView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentControlView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/1/19. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYCommentControlView.h" 10 | 11 | @implementation GKDYCommentControlView 12 | 13 | @synthesize player; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Comment/View/GKDYCommentView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYCommentView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/5/1. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYVideoModel.h" 11 | #import 12 | #import "GKDYVideoPortraitCell.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @class GKDYCommentView; 17 | 18 | @protocol GKDYCommentViewDelegate 19 | 20 | - (void)commentView:(GKDYCommentView *)commentView showOrHide:(BOOL)show; 21 | 22 | @end 23 | 24 | @interface GKDYCommentView : UIView 25 | 26 | @property (nonatomic, weak) id delegate; 27 | 28 | @property (nonatomic, weak) ZFPlayerController *player; 29 | 30 | @property (nonatomic, weak) UIView *containerView; 31 | 32 | @property (nonatomic, strong) GKDYVideoModel *videoModel; 33 | 34 | - (void)refreshDataWithModel:(GKDYVideoModel *)model; 35 | 36 | - (void)requestDataWithModel:(GKDYVideoModel *)model; 37 | 38 | - (void)showWithCell:(GKDYVideoPortraitCell *)cell containerView:(UIView *)containerView; 39 | 40 | @end 41 | 42 | NS_ASSUME_NONNULL_END 43 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/GKDYHomeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYHomeViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYHomeViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/GKDYSearchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYSearchViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYSearchViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/GKDYSearchViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYSearchViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYSearchViewController.h" 10 | 11 | @interface GKDYSearchViewController () 12 | 13 | @end 14 | 15 | @implementation GKDYSearchViewController 16 | 17 | - (void)loadView { 18 | self.view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WechatIMG240"]]; 19 | } 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.gk_navigationBar.hidden = YES; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/GKDYShootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYShootViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/5/4. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYShootViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/GKDYShootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYShootViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/5/4. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYShootViewController.h" 10 | #import "GKDYMainViewController.h" 11 | #import 12 | 13 | @interface GKDYShootViewController () 14 | 15 | @property (nonatomic, strong) GKDYMainViewController *mainVC; 16 | 17 | // 负责输入和输出设备之间的数据传输 18 | @property (nonatomic, strong) AVCaptureSession *captureSession; 19 | // 负责从AVCaptureDevice获取输入数据 20 | @property (nonatomic, strong) AVCaptureDeviceInput *captureDeviceInput; 21 | // 照片输出流 22 | //@property (nonatomic, strong) AVCaptureStillImageOutput *imageOutput; 23 | // 视频输出流 24 | @property (nonatomic, strong) AVCaptureMovieFileOutput *videoOutput; 25 | 26 | // 相机拍摄预览图层 27 | @property (nonatomic, strong) AVCaptureVideoPreviewLayer *capturePreviewLayer; 28 | 29 | @property (nonatomic, strong) UIView *coverView; 30 | @property (nonatomic, strong) UILabel *topLabel; 31 | @property (nonatomic, strong) UILabel *descLabel; 32 | @property (nonatomic, strong) UIButton *cameraAuthBtn; // 相机授权按钮 33 | @property (nonatomic, strong) UIButton *microAuthBtn; // 麦克风授权按钮 34 | 35 | @end 36 | 37 | @implementation GKDYShootViewController 38 | 39 | - (void)viewDidLoad { 40 | [super viewDidLoad]; 41 | 42 | self.view.backgroundColor = [UIColor clearColor]; 43 | 44 | // self.gk_statusBarHidden = YES; 45 | self.gk_navBackgroundColor = [UIColor clearColor]; 46 | 47 | self.gk_navLeftBarButtonItem = [UIBarButtonItem gk_itemWithImage:[UIImage gk_changeImage:[UIImage imageNamed:@"close"] color:UIColor.whiteColor] target:self action:@selector(closeAction)]; 48 | 49 | [self.view addSubview:self.coverView]; 50 | [self.view addSubview:self.topLabel]; 51 | [self.view addSubview:self.descLabel]; 52 | [self.view addSubview:self.cameraAuthBtn]; 53 | [self.view addSubview:self.microAuthBtn]; 54 | 55 | [self.coverView mas_makeConstraints:^(MASConstraintMaker *make) { 56 | make.edges.equalTo(self.view); 57 | }]; 58 | 59 | [self.topLabel mas_makeConstraints:^(MASConstraintMaker *make) { 60 | make.top.equalTo(self.view).offset(ADAPTATIONRATIO * 456.0f); 61 | make.centerX.equalTo(self.view); 62 | }]; 63 | 64 | [self.descLabel mas_makeConstraints:^(MASConstraintMaker *make) { 65 | make.top.equalTo(self.topLabel.mas_bottom).offset(ADAPTATIONRATIO * 24.0f); 66 | make.centerX.equalTo(self.view); 67 | }]; 68 | 69 | [self.cameraAuthBtn mas_makeConstraints:^(MASConstraintMaker *make) { 70 | make.top.equalTo(self.descLabel.mas_bottom).offset(ADAPTATIONRATIO * 120.0f); 71 | make.centerX.equalTo(self.view); 72 | }]; 73 | 74 | [self.microAuthBtn mas_makeConstraints:^(MASConstraintMaker *make) { 75 | make.top.equalTo(self.cameraAuthBtn.mas_bottom).offset(ADAPTATIONRATIO * 90.0f); 76 | make.centerX.equalTo(self.view); 77 | }]; 78 | 79 | // 默认显示mainVC 80 | self.mainVC = [GKDYMainViewController new]; 81 | [self.navigationController pushViewController:self.mainVC animated:NO]; 82 | } 83 | 84 | - (void)viewWillAppear:(BOOL)animated { 85 | [super viewWillAppear:animated]; 86 | } 87 | 88 | - (void)viewDidAppear:(BOOL)animated { 89 | [super viewDidAppear:animated]; 90 | 91 | self.gk_pushDelegate = self; 92 | } 93 | 94 | - (void)viewWillDisappear:(BOOL)animated { 95 | [super viewWillDisappear:animated]; 96 | 97 | self.gk_pushDelegate = nil; 98 | } 99 | 100 | - (void)closeAction { 101 | [self pushToNextViewController]; 102 | } 103 | 104 | #pragma mark - GKViewControllerPushDelegate 105 | - (void)pushToNextViewController { 106 | [self.navigationController pushViewController:self.mainVC animated:YES]; 107 | } 108 | 109 | #pragma mark - 懒加载 110 | - (UIView *)coverView { 111 | if (!_coverView) { 112 | _coverView = [UIView new]; 113 | _coverView.backgroundColor = [UIColor blackColor]; 114 | _coverView.alpha = 0.5f; 115 | } 116 | return _coverView; 117 | } 118 | 119 | - (UILabel *)topLabel { 120 | if (!_topLabel) { 121 | _topLabel = [UILabel new]; 122 | _topLabel.textColor = [UIColor whiteColor]; 123 | _topLabel.text = @"发一个随拍"; 124 | _topLabel.font = [UIFont systemFontOfSize:25]; 125 | } 126 | return _topLabel; 127 | } 128 | 129 | - (UILabel *)descLabel { 130 | if (!_descLabel) { 131 | _descLabel = [UILabel new]; 132 | _descLabel.textColor = GKColorGray(90); 133 | _descLabel.text = @"允许访问即可进入拍摄"; 134 | _descLabel.font = [UIFont systemFontOfSize:15.0f]; 135 | } 136 | return _descLabel; 137 | } 138 | 139 | - (UIButton *)cameraAuthBtn { 140 | if (!_cameraAuthBtn) { 141 | _cameraAuthBtn = [UIButton new]; 142 | [_cameraAuthBtn setTitle:@"启用相机访问权限" forState:UIControlStateNormal]; 143 | [_cameraAuthBtn setTitleColor:GKColorRGB(25, 126, 143) forState:UIControlStateNormal]; 144 | } 145 | return _cameraAuthBtn; 146 | } 147 | 148 | - (UIButton *)microAuthBtn { 149 | if (!_microAuthBtn) { 150 | _microAuthBtn = [UIButton new]; 151 | [_microAuthBtn setTitle:@"启用麦克风访问权限" forState:UIControlStateNormal]; 152 | [_microAuthBtn setTitleColor:GKColorRGB(25, 126, 143) forState:UIControlStateNormal]; 153 | } 154 | return _microAuthBtn; 155 | } 156 | 157 | @end 158 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/Controller/GKDYListPlayerController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYListPlayerController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/9/9. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | #import "GKDYVideoScrollView.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYPlayerNavigationController : UINavigationController 15 | 16 | @end 17 | 18 | @protocol GKDYListPlayerControllerDelegate 19 | 20 | - (UIView *)sourceViewWithIndex:(NSInteger)index; 21 | 22 | @end 23 | 24 | @interface GKDYListPlayerController : GKDYBaseViewController 25 | 26 | @property (nonatomic, weak) id delegate; 27 | 28 | @property (nonatomic, strong) GKDYVideoScrollView *scrollView; 29 | 30 | @property (nonatomic, strong) NSMutableArray *videoList; 31 | @property (nonatomic, assign) NSInteger index; 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/Controller/GKDYPlayerViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYPlayerViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | #import "GKDYVideoModel.h" 11 | #import 12 | #import "GKDYVideoScrollView.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @class GKDYPlayerViewController; 17 | 18 | @protocol GKDYPlayerViewControllerDelegate 19 | 20 | @optional; 21 | 22 | - (void)playerVCDidClickShoot:(GKDYPlayerViewController *)playerVC; 23 | 24 | //- (void)playerVC:(GKDYPlayerViewController *)playerVC controlView:(GKDYVideoControlView *)controlView isCritical:(BOOL)isCritical; 25 | 26 | - (void)playerVC:(GKDYPlayerViewController *)playerVC didDragDistance:(CGFloat)distance isEnd:(BOOL)isEnd; 27 | 28 | - (void)playerVC:(GKDYPlayerViewController *)playerVC cellZoomBegan:(GKDYVideoModel *)model; 29 | 30 | - (void)playerVC:(GKDYPlayerViewController *)playerVC cellZoomEnded:(GKDYVideoModel *)model isFullscreen:(BOOL)isFullscreen; 31 | 32 | - (void)playerVC:(GKDYPlayerViewController *)playerVC commentShowOrHide:(BOOL)show; 33 | 34 | @end 35 | 36 | @interface GKDYPlayerViewController : GKDYBaseViewController 37 | 38 | @property (nonatomic, weak) id delegate; 39 | 40 | @property (nonatomic, copy) NSString *tab; 41 | 42 | @property (nonatomic, strong) GKDYVideoModel *model; 43 | 44 | - (void)refreshData:(nullable void(^)(void))completion; 45 | 46 | @end 47 | 48 | NS_ASSUME_NONNULL_END 49 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/Manager/GKDYPlayerManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYPlayerManager.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYVideoScrollView.h" 11 | #import "GKDYVideoPortraitView.h" 12 | #import "GKDYVideoLandscapeView.h" 13 | #import "GKDYPlayerViewController.h" 14 | #import 15 | 16 | NS_ASSUME_NONNULL_BEGIN 17 | 18 | @class GKDYVideoCell, GKDYVideoPortraitCell, GKDYVideoLandscapeCell; 19 | 20 | @protocol GKDYPlayerManagerDelegate 21 | 22 | - (void)scrollViewShouldLoadMore; 23 | 24 | - (void)scrollViewDidPanDistance:(CGFloat)distance isEnd:(BOOL)isEnd; 25 | 26 | - (void)cellDidClickIcon:(GKDYVideoModel *)model; 27 | 28 | - (void)cellDidClickComment:(GKDYVideoModel *)model cell:(GKDYVideoPortraitCell *)cell; 29 | 30 | - (void)cellZoomBegan:(GKDYVideoModel *)model; 31 | 32 | - (void)cellZoomEnded:(GKDYVideoModel *)model isFullscreen:(BOOL)isFullscreen; 33 | 34 | @end 35 | 36 | @interface GKDYPlayerManager : NSObject 37 | 38 | @property (nonatomic, strong, readonly) ZFPlayerController *player; 39 | 40 | @property (nonatomic, weak) id delegate; 41 | 42 | // 竖屏滑动容器 43 | @property (nonatomic, strong) GKDYVideoScrollView *scrollView; 44 | 45 | // 横屏滑动容器 46 | @property (nonatomic, strong, nullable) GKDYVideoScrollView *landscapeScrollView; 47 | 48 | @property (nonatomic, weak) GKDYVideoPortraitCell *currentCell; 49 | 50 | @property (nonatomic, weak) GKDYVideoLandscapeCell *landscapeCell; 51 | 52 | // 竖屏控制层 53 | @property (nonatomic, weak) GKDYVideoPortraitView *portraitView; 54 | 55 | // 横屏控制层 56 | @property (nonatomic, strong) GKDYVideoLandscapeView *landscapeView; 57 | 58 | @property (nonatomic, assign) CGSize videoSize; 59 | 60 | /// 页码 61 | @property (nonatomic, assign) NSInteger page; 62 | 63 | /// 数据源 64 | @property (nonatomic, strong) NSMutableArray *dataSources; 65 | 66 | @property (nonatomic, assign) BOOL isPlaying; 67 | 68 | @property (nonatomic, assign) BOOL isAppeared; 69 | 70 | /// 请求播放地址 71 | - (void)requestPlayUrlWithModel:(GKDYVideoModel *)model completion:(nullable void(^)(void))completion; 72 | 73 | /// 播放视频 74 | - (void)playVideoWithCell:(GKDYVideoCell *)cell index:(NSInteger)index; 75 | 76 | /// 停止播放 77 | - (void)stopPlayWithCell:(GKDYVideoCell *)cell index:(NSInteger)index; 78 | 79 | /// 旋转 80 | - (void)rotate; 81 | 82 | - (void)play; 83 | - (void)pause; 84 | 85 | @end 86 | 87 | NS_ASSUME_NONNULL_END 88 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/Model/GKDYVideoModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoModel.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYUserVideoModel.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYVideoModel : NSObject 15 | 16 | @property (nonatomic, copy) NSString *video_id; 17 | @property (nonatomic, copy) NSString *title; 18 | @property (nonatomic, copy) NSString *poster_small; 19 | @property (nonatomic, copy) NSString *poster_big; 20 | @property (nonatomic, copy) NSString *poster_pc; 21 | @property (nonatomic, copy) NSString *source_name; 22 | @property (nonatomic, copy) NSString *play_url; 23 | @property (nonatomic, copy) NSString *duration; 24 | @property (nonatomic, copy) NSString *url; 25 | @property (nonatomic, copy) NSString *show_tag; 26 | @property (nonatomic, copy) NSString *publish_time; 27 | @property (nonatomic, copy) NSString *is_pay_column; 28 | @property (nonatomic, copy) NSString *like; 29 | @property (nonatomic, copy) NSString *comment; 30 | @property (nonatomic, copy) NSString *playcnt; 31 | @property (nonatomic, copy) NSString *fmplaycnt; 32 | @property (nonatomic, copy) NSString *fmplaycnt_2; 33 | @property (nonatomic, copy) NSString *outstand_tag; 34 | @property (nonatomic, copy) NSString *previewUrlHttp; 35 | @property (nonatomic, copy) NSString *third_id; 36 | @property (nonatomic, copy) NSString *vip; 37 | @property (nonatomic, copy) NSString *author_avatar; 38 | 39 | @property (nonatomic, assign) BOOL isLike; 40 | @property (nonatomic, strong, nullable) NSURLSessionDataTask *task; 41 | 42 | @property (nonatomic, assign) BOOL isRequest; 43 | @property (nonatomic, assign) BOOL requested; 44 | 45 | - (instancetype)initWithModel:(GKDYUserVideoModel *)model; 46 | 47 | @end 48 | 49 | NS_ASSUME_NONNULL_END 50 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/Model/GKDYVideoModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoModel.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoModel.h" 10 | 11 | @implementation GKDYVideoModel 12 | 13 | - (instancetype)initWithModel:(GKDYUserVideoModel *)model { 14 | if (self = [super init]) { 15 | self.video_id = model.vid; 16 | self.title = model.title; 17 | self.poster_small = model.poster; 18 | self.poster_big = model.cover_src; 19 | self.poster_pc = model.cover_src_pc; 20 | self.duration = model.duration; 21 | self.publish_time = model.publish_time; 22 | self.playcnt = model.playcnt; 23 | self.fmplaycnt = model.playcntText; 24 | } 25 | return self; 26 | } 27 | 28 | + (NSDictionary *)modelCustomPropertyMapper { 29 | return @{@"video_id" : @"id"}; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYPanGestureRecognizer.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYPanGestureRecognizer.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/7/31. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, GKDYPanGestureRecognizerDirection) { 14 | GKDYPanGestureRecognizerDirectionVertical, 15 | GKDYPanGestureRecognizerDirectionHorizontal 16 | }; 17 | 18 | @interface GKDYPanGestureRecognizer : UIPanGestureRecognizer 19 | 20 | @property (nonatomic, assign) GKDYPanGestureRecognizerDirection direction; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYPanGestureRecognizer.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYPanGestureRecognizer.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/7/31. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYPanGestureRecognizer.h" 10 | 11 | int const static kDirectionPanThreshold = 5; 12 | 13 | @interface GKDYPanGestureRecognizer() 14 | 15 | @property (nonatomic, assign) BOOL drag; 16 | @property (nonatomic, assign) int moveX; 17 | @property (nonatomic, assign) int moveY; 18 | 19 | @end 20 | 21 | @implementation GKDYPanGestureRecognizer 22 | 23 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 24 | [super touchesMoved:touches withEvent:event]; 25 | if (self.state == UIGestureRecognizerStateFailed) return; 26 | CGPoint nowPoint = [[touches anyObject] locationInView:self.view]; 27 | CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view]; 28 | _moveX += prevPoint.x - nowPoint.x; 29 | _moveY += prevPoint.y - nowPoint.y; 30 | if (!_drag) { 31 | if (abs(_moveX) > kDirectionPanThreshold) { 32 | if (_direction == GKDYPanGestureRecognizerDirectionVertical) { 33 | self.state = UIGestureRecognizerStateFailed; 34 | }else { 35 | _drag = YES; 36 | } 37 | }else if (abs(_moveY) > kDirectionPanThreshold) { 38 | if (_direction == GKDYPanGestureRecognizerDirectionHorizontal) { 39 | self.state = UIGestureRecognizerStateFailed; 40 | }else { 41 | _drag = YES; 42 | } 43 | } 44 | } 45 | } 46 | 47 | - (void)reset { 48 | [super reset]; 49 | _drag = NO; 50 | _moveX = 0; 51 | _moveY = 0; 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYScrollView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYScrollView : UIScrollView 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYScrollView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYScrollView.h" 10 | 11 | @implementation GKDYScrollView 12 | 13 | #pragma mark - 解决全屏滑动时的手势冲突 与 左滑push手势冲突 14 | // 当UIScrollView在水平方向滑动到第一个时,默认是不能全屏滑动返回的,通过下面的方法可实现其滑动返回。 15 | - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 16 | if ([self panBack:gestureRecognizer]) { 17 | return NO; 18 | } 19 | return YES; 20 | } 21 | 22 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 23 | { 24 | if ([self panBack:gestureRecognizer]) { 25 | return YES; 26 | } 27 | 28 | return NO; 29 | } 30 | 31 | - (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer { 32 | if (gestureRecognizer == self.panGestureRecognizer) { 33 | CGPoint point = [self.panGestureRecognizer translationInView:self]; 34 | UIGestureRecognizerState state = gestureRecognizer.state; 35 | 36 | // 设置手势滑动的位置距屏幕左边的区域 37 | CGFloat locationDistance = self.bounds.size.width; 38 | 39 | if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStatePossible) { 40 | CGPoint location = [gestureRecognizer locationInView:self]; 41 | if (point.x > 0 && location.x < locationDistance && self.contentOffset.x <= 0) { 42 | return YES; 43 | } 44 | 45 | // 临界点:scrollView滑动到最后一屏时的x轴位置,可根据需求改变 46 | CGFloat criticalPoint = self.frame.size.width; 47 | 48 | // point.x < 0 代表左滑即手指从屏幕右边向左移动 49 | // 当UIScrollview滑动到临界点时,则不再相应UIScrollview的滑动左滑手势,防止与左滑手势冲突 50 | if (point.x < 0 && self.contentOffset.x + criticalPoint >= self.contentSize.width) { 51 | return YES; 52 | } 53 | } 54 | } 55 | return NO; 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYTitleView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYTitleView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYTitleView : UIView 15 | 16 | @property (nonatomic, strong) JXCategoryTitleView *categoryView; 17 | 18 | @property (nonatomic, copy) void(^loadingBlock)(void); 19 | 20 | - (void)changeAlphaWithDistance:(CGFloat)distance isEnd:(BOOL)isEnd; 21 | 22 | - (void)loadingEnd; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoCell.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "GKDYVideoModel.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface GKDYVideoCell : GKVideoViewCell 16 | 17 | @property (nonatomic, strong) GKDYVideoModel *model; 18 | 19 | @property (nonatomic, strong) UIImageView *coverImgView; 20 | 21 | - (void)initUI; 22 | 23 | - (void)loadData:(GKDYVideoModel *)model; 24 | 25 | - (void)resetView; 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoCell.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoCell.h" 10 | 11 | @interface GKDYVideoCell() 12 | 13 | @end 14 | 15 | @implementation GKDYVideoCell 16 | 17 | - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier { 18 | if (self = [super initWithReuseIdentifier:reuseIdentifier]) { 19 | [self initUI]; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)initUI { 25 | [self addSubview:self.coverImgView]; 26 | [self.coverImgView mas_makeConstraints:^(MASConstraintMaker *make) { 27 | make.edges.equalTo(self); 28 | }]; 29 | } 30 | 31 | - (void)loadData:(GKDYVideoModel *)model { 32 | self.model = model; 33 | 34 | [self.coverImgView sd_setImageWithURL:[NSURL URLWithString:model.poster_small]]; 35 | } 36 | 37 | - (void)setModel:(GKDYVideoModel *)model { 38 | _model = model; 39 | 40 | [self.coverImgView sd_setImageWithURL:[NSURL URLWithString:model.poster_small]]; 41 | 42 | } 43 | 44 | - (void)resetView { 45 | 46 | } 47 | 48 | #pragma mark - Lazy 49 | - (UIImageView *)coverImgView { 50 | if (!_coverImgView) { 51 | _coverImgView = [[UIImageView alloc] init]; 52 | _coverImgView.contentMode = UIViewContentModeScaleAspectFit; 53 | _coverImgView.userInteractionEnabled = YES; 54 | } 55 | return _coverImgView; 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoControlView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoControlView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 播放器视图控制层 8 | 9 | #import 10 | //#import "GKAWEModel.h" 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @class GKDYVideoControlView; 16 | 17 | @protocol GKDYVideoControlViewDelegate 18 | 19 | - (void)controlViewDidClickSelf:(GKDYVideoControlView *)controlView; 20 | 21 | - (void)controlViewDidClickIcon:(GKDYVideoControlView *)controlView; 22 | 23 | - (void)controlViewDidClickPriase:(GKDYVideoControlView *)controlView; 24 | 25 | - (void)controlViewDidClickComment:(GKDYVideoControlView *)controlView; 26 | 27 | - (void)controlViewDidClickShare:(GKDYVideoControlView *)controlView; 28 | 29 | - (void)controlView:(GKDYVideoControlView *)controlView touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 30 | 31 | @end 32 | 33 | @interface GKDYVideoControlView : UIView 34 | 35 | @property (nonatomic, weak) id delegate; 36 | 37 | // 视频封面图:显示封面并播放视频 38 | @property (nonatomic, strong) UIImageView *coverImgView; 39 | 40 | @property (nonatomic, strong) id model; 41 | 42 | @property (nonatomic, strong) GKSliderView *sliderView; 43 | 44 | - (void)setProgress:(float)progress; 45 | 46 | - (void)startLoading; 47 | - (void)stopLoading; 48 | 49 | - (void)showPlayBtn; 50 | - (void)hidePlayBtn; 51 | 52 | - (void)showLikeAnimation; 53 | - (void)showUnLikeAnimation; 54 | 55 | @end 56 | 57 | NS_ASSUME_NONNULL_END 58 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoFullscreenView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoFullscreenView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/5/8. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYVideoFullscreenView : UIView 15 | 16 | @property (nonatomic, copy) void(^closeFullscreenBlock)(void); 17 | @property (nonatomic, copy) void(^likeBlock)(void); 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoItemButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoItemButton.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYVideoItemButton : UIButton 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoItemButton.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoItemButton.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoItemButton.h" 10 | 11 | @implementation GKDYVideoItemButton 12 | 13 | - (void)layoutSubviews { 14 | [super layoutSubviews]; 15 | 16 | [self.imageView sizeToFit]; 17 | [self.titleLabel sizeToFit]; 18 | 19 | CGFloat width = self.frame.size.width; 20 | CGFloat height = self.frame.size.height; 21 | 22 | CGFloat imgW = self.imageView.frame.size.width; 23 | CGFloat imgH = self.imageView.frame.size.height; 24 | 25 | self.imageView.frame = CGRectMake((width - imgH) / 2, 0, imgW, imgH); 26 | 27 | CGFloat titleW = self.titleLabel.frame.size.width; 28 | CGFloat titleH = self.titleLabel.frame.size.height; 29 | 30 | self.titleLabel.frame = CGRectMake((width - titleW) / 2, height - titleH, titleW, titleH); 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoLandscapeCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoLandscapeCell.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/5/5. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoCell.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYVideoLandscapeCell : GKDYVideoCell 14 | 15 | @property (nonatomic, assign) BOOL isShowTop; 16 | 17 | @property (nonatomic, copy) void(^backClickBlock)(void); 18 | 19 | - (void)hideTopView; 20 | - (void)showTopView; 21 | 22 | - (void)autoHide; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoLandscapeCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoLandscapeCell.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/5/5. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoLandscapeCell.h" 10 | #import "GKDYVideoMaskView.h" 11 | #import "UIButton+GKCategory.h" 12 | 13 | @interface GKDYVideoLandscapeCell() 14 | 15 | @property (nonatomic, strong) GKDYVideoMaskView *topContainerView; 16 | 17 | @property (nonatomic, strong) UIButton *backBtn; 18 | 19 | @property (nonatomic, strong) UILabel *titleLabel; 20 | 21 | @end 22 | 23 | @implementation GKDYVideoLandscapeCell 24 | 25 | - (void)initUI { 26 | [super initUI]; 27 | 28 | [self addSubview:self.topContainerView]; 29 | [self.topContainerView addSubview:self.backBtn]; 30 | [self.topContainerView addSubview:self.titleLabel]; 31 | 32 | [self.topContainerView mas_makeConstraints:^(MASConstraintMaker *make) { 33 | make.top.left.right.equalTo(self); 34 | make.height.mas_equalTo(80); 35 | }]; 36 | 37 | [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { 38 | make.top.equalTo(self).offset(25); 39 | make.left.equalTo(self.topContainerView.mas_safeAreaLayoutGuideLeft).offset(12); 40 | }]; 41 | 42 | [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { 43 | make.top.equalTo(self.backBtn).offset(3); 44 | make.left.equalTo(self.backBtn.mas_right).offset(5); 45 | make.right.equalTo(self.topContainerView.mas_safeAreaLayoutGuideRight).offset(-30); 46 | }]; 47 | 48 | self.topContainerView.hidden = YES; 49 | self.isShowTop = NO; 50 | } 51 | 52 | - (void)loadData:(GKDYVideoModel *)model { 53 | [super loadData:model]; 54 | 55 | self.titleLabel.text = model.title; 56 | } 57 | 58 | - (void)hideTopView { 59 | self.topContainerView.hidden = YES; 60 | self.isShowTop = NO; 61 | } 62 | 63 | - (void)showTopView { 64 | self.topContainerView.hidden = NO; 65 | self.isShowTop = YES; 66 | } 67 | 68 | - (void)autoHide { 69 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hideTopView) object:nil]; 70 | [self performSelector:@selector(hideTopView) withObject:nil afterDelay:3.0f]; 71 | } 72 | 73 | - (void)resetView { 74 | [super resetView]; 75 | [self showTopView]; 76 | } 77 | 78 | - (void)backAction { 79 | !self.backClickBlock ?: self.backClickBlock(); 80 | } 81 | 82 | #pragma mark - Lazy 83 | - (GKDYVideoMaskView *)topContainerView { 84 | if (!_topContainerView) { 85 | _topContainerView = [[GKDYVideoMaskView alloc] initWithStyle:GKDYVideoMaskViewStyle_Top]; 86 | } 87 | return _topContainerView; 88 | } 89 | 90 | - (UIButton *)backBtn { 91 | if (!_backBtn) { 92 | _backBtn = [[UIButton alloc] init]; 93 | [_backBtn setEnlargeEdge:10]; 94 | [_backBtn setImage:[UIImage imageNamed:@"ic_back_white"] forState:UIControlStateNormal]; 95 | [_backBtn addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; 96 | } 97 | return _backBtn; 98 | } 99 | 100 | - (UILabel *)titleLabel { 101 | if (!_titleLabel) { 102 | _titleLabel = [[UILabel alloc] init]; 103 | _titleLabel.font = [UIFont boldSystemFontOfSize:15]; 104 | _titleLabel.textColor = UIColor.whiteColor; 105 | _titleLabel.numberOfLines = 0; 106 | } 107 | return _titleLabel; 108 | } 109 | 110 | @end 111 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoLandscapeView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoLandscapeView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "GKDYVideoModel.h" 12 | #import "GKRotationManager.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface GKDYVideoLandscapeView : UIView 17 | 18 | @property (nonatomic, strong) GKDYVideoModel *model; 19 | 20 | @property (nonatomic, weak) GKRotationManager *rotationManager; 21 | 22 | @property (nonatomic, copy) void(^likeBlock)(GKDYVideoModel *model); 23 | 24 | @property (nonatomic, copy) void(^singleTapBlock)(void); 25 | 26 | - (void)startTimer; 27 | - (void)destoryTimer; 28 | 29 | @property (nonatomic, assign) BOOL isContainerShow; 30 | - (void)showContainerView:(BOOL)animated; 31 | - (void)hideContainerView:(BOOL)animated; 32 | 33 | - (void)autoHide; 34 | 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoMaskView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoMaskView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, GKDYVideoMaskViewStyle) { 14 | GKDYVideoMaskViewStyle_Top, // 顶部,(上->下)从深到浅 15 | GKDYVideoMaskViewStyle_Bottom // 底部,(上->下)从浅到深 16 | }; 17 | 18 | @interface GKDYVideoMaskView : UIView 19 | 20 | - (instancetype)initWithStyle:(GKDYVideoMaskViewStyle)style; 21 | 22 | - (void)clearColors; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoMaskView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoMaskView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoMaskView.h" 10 | 11 | @interface GKDYVideoMaskView() 12 | 13 | @property (nonatomic, assign) GKDYVideoMaskViewStyle style; 14 | 15 | @end 16 | 17 | @implementation GKDYVideoMaskView 18 | 19 | + (Class)layerClass { 20 | return CAGradientLayer.class; 21 | } 22 | 23 | - (instancetype)initWithStyle:(GKDYVideoMaskViewStyle)style { 24 | if (self = [super init]) { 25 | self.style = style; 26 | CAGradientLayer *maskGradientLayer = (id)self.layer; 27 | switch (self.style) { 28 | case GKDYVideoMaskViewStyle_Top: { 29 | maskGradientLayer.colors = @[(__bridge id)[UIColor colorWithWhite:0 alpha:0.8].CGColor, 30 | (__bridge id)[UIColor clearColor].CGColor]; 31 | } 32 | break; 33 | case GKDYVideoMaskViewStyle_Bottom: { 34 | maskGradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor, 35 | (__bridge id)[UIColor colorWithWhite:0 alpha:0.8].CGColor]; 36 | } 37 | break; 38 | } 39 | } 40 | return self; 41 | } 42 | 43 | - (void)clearColors { 44 | CAGradientLayer *maskGradientLayer = (id)self.layer; 45 | maskGradientLayer.colors = nil; 46 | } 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoPortraitCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoPortraitCell.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/5/5. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoCell.h" 10 | #import "GKDYPlayerManager.h" 11 | #import "GKDYVideoPortraitView.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @class GKDYVideoPortraitCell; 16 | 17 | @protocol GKDYVideoPortraitCellDelegate 18 | 19 | @optional; 20 | 21 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickIcon:(GKDYVideoModel *)model; 22 | 23 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickLike:(GKDYVideoModel *)model; 24 | 25 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickComment:(GKDYVideoModel *)model; 26 | 27 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickShare:(GKDYVideoModel *)model; 28 | 29 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickDanmu:(GKDYVideoModel *)model; 30 | 31 | - (void)videoCell:(GKDYVideoPortraitCell *)cell didClickFullscreen:(GKDYVideoModel *)model; 32 | 33 | - (void)videoCell:(GKDYVideoPortraitCell *)cell zoomBegan:(GKDYVideoModel *)model; 34 | 35 | - (void)videoCell:(GKDYVideoPortraitCell *)cell zoomEnded:(GKDYVideoModel *)model isFullscreen:(BOOL)isFullscreen; 36 | 37 | @end 38 | 39 | @interface GKDYVideoPortraitCell : GKDYVideoCell 40 | 41 | @property (nonatomic, weak) id delegate; 42 | 43 | @property (nonatomic, strong) GKDYVideoPortraitView *portraitView; 44 | 45 | @property (nonatomic, weak) GKDYPlayerManager *manager; 46 | 47 | - (void)closeFullscreen; 48 | 49 | @end 50 | 51 | NS_ASSUME_NONNULL_END 52 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoPortraitView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoPortraitView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "GKDYVideoModel.h" 12 | #import "GKDYVideoSlider.h" 13 | #import "GKLikeView.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @protocol GKDYVideoPortraitViewDelegate 18 | 19 | - (void)didClickIcon:(GKDYVideoModel *)model; 20 | - (void)didClickLike:(GKDYVideoModel *)model; 21 | - (void)didClickComment:(GKDYVideoModel *)model; 22 | - (void)didClickShare:(GKDYVideoModel *)model; 23 | - (void)didClickDanmu:(GKDYVideoModel *)model; 24 | - (void)didClickFullscreen:(GKDYVideoModel *)model; 25 | 26 | @end 27 | 28 | @interface GKDYVideoPortraitView : UIView 29 | 30 | @property (nonatomic, weak) id delegate; 31 | 32 | @property (nonatomic, strong) GKDYVideoModel *model; 33 | 34 | @property (nonatomic, strong) UIView *bottomView; 35 | 36 | @property (nonatomic, strong) GKDYVideoSlider *slider; 37 | 38 | @property (nonatomic, strong) GKLikeView *likeView; 39 | 40 | @property (nonatomic, strong) UIButton *playBtn; 41 | 42 | - (void)willBeginDragging; 43 | - (void)didEndDragging; 44 | 45 | @end 46 | 47 | NS_ASSUME_NONNULL_END 48 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoPreviewView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoPreviewView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYVideoPreviewView : UIView 15 | 16 | @property (nonatomic, weak) ZFPlayerController *player; 17 | 18 | - (void)setPreviewValue:(float)value; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoPreviewView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoPreviewView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoPreviewView.h" 10 | #import "GKDYTools.h" 11 | #import 12 | 13 | @interface ZFAVPlayerManager (GKCategory) 14 | 15 | - (void)thumbnailImageAtTime:(NSTimeInterval)time completion:(void(^)(UIImage *_Nullable image))completion; 16 | 17 | @end 18 | 19 | @implementation ZFAVPlayerManager (GKCategory) 20 | 21 | - (void)thumbnailImageAtTime:(NSTimeInterval)time completion:(void (^)(UIImage * _Nullable))completion { 22 | CMTime expectedTime = CMTimeMakeWithSeconds(time, NSEC_PER_SEC); 23 | 24 | AVAssetImageGenerator *imageGenerator = [self valueForKey:@"imageGenerator"]; 25 | 26 | [imageGenerator generateCGImagesAsynchronouslyForTimes:@[[NSValue valueWithCMTime:expectedTime]] completionHandler:^(CMTime requestedTime, CGImageRef _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) { 27 | if (image) { 28 | UIImage *finalImage = [UIImage imageWithCGImage:image]; 29 | !completion ?: completion(finalImage); 30 | }else { 31 | !completion ?: completion(nil); 32 | } 33 | }]; 34 | } 35 | 36 | @end 37 | 38 | @interface GKDYVideoPreviewView() 39 | 40 | @property (nonatomic, strong) UIImageView *imageView; 41 | 42 | @property (nonatomic, strong) UILabel *timeLabel; 43 | 44 | @end 45 | 46 | @implementation GKDYVideoPreviewView 47 | 48 | - (instancetype)init { 49 | if (self = [super init]) { 50 | [self initUI]; 51 | } 52 | return self; 53 | } 54 | 55 | - (void)initUI { 56 | [self addSubview:self.imageView]; 57 | [self addSubview:self.timeLabel]; 58 | 59 | [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) { 60 | make.left.top.right.equalTo(self); 61 | make.height.mas_equalTo(120*9/16); 62 | }]; 63 | 64 | [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { 65 | make.top.equalTo(self.imageView.mas_bottom).offset(20); 66 | make.centerX.equalTo(self); 67 | }]; 68 | } 69 | 70 | - (void)setPreviewValue:(float)value { 71 | NSString *currentTime = [GKDYTools convertTimeSecond:self.player.totalTime * value]; 72 | NSString *totalTime = [GKDYTools convertTimeSecond:self.player.totalTime]; 73 | self.timeLabel.text = [NSString stringWithFormat:@"%@ / %@", currentTime, totalTime]; 74 | 75 | ZFAVPlayerManager *manager = (ZFAVPlayerManager *)self.player.currentPlayerManager; 76 | 77 | @weakify(self); 78 | [manager thumbnailImageAtTime:self.player.totalTime * value completion:^(UIImage * _Nullable image) { 79 | if (image) { 80 | @strongify(self); 81 | dispatch_async(dispatch_get_main_queue(), ^{ 82 | self.imageView.image = image; 83 | }); 84 | } 85 | }]; 86 | } 87 | 88 | #pragma mark - Lazy 89 | - (UIImageView *)imageView { 90 | if (!_imageView) { 91 | _imageView = [[UIImageView alloc] init]; 92 | _imageView.contentMode = UIViewContentModeScaleAspectFill; 93 | _imageView.layer.cornerRadius = 5; 94 | _imageView.layer.masksToBounds = YES; 95 | } 96 | return _imageView; 97 | } 98 | 99 | - (UILabel *)timeLabel { 100 | if (!_timeLabel) { 101 | _timeLabel = [[UILabel alloc] init]; 102 | _timeLabel.font = [UIFont systemFontOfSize:15]; 103 | _timeLabel.textColor = UIColor.whiteColor; 104 | } 105 | return _timeLabel; 106 | } 107 | 108 | @end 109 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoScrollView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class GKDYVideoScrollView; 14 | 15 | @protocol GKDYVideoScrollViewDelegate 16 | 17 | @optional 18 | 19 | - (void)scrollView:(GKDYVideoScrollView *)scrollView didPanWithDistance:(CGFloat)distance isEnd:(BOOL)isEnd; 20 | 21 | @end 22 | 23 | @interface GKDYVideoScrollView : GKVideoScrollView 24 | 25 | @property (nonatomic, weak) id delegate; 26 | 27 | - (void)addPanGesture; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoScrollView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/17. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoScrollView.h" 10 | #import "GKDYPanGestureRecognizer.h" 11 | 12 | @interface GKDYVideoScrollView() 13 | 14 | @property (nonatomic, strong) GKDYPanGestureRecognizer *panGesture; 15 | 16 | // 开始移动时的位置 17 | @property (nonatomic, assign) CGFloat startLocationY; 18 | 19 | @property (nonatomic, weak) id userDelegate; 20 | 21 | @end 22 | 23 | @implementation GKDYVideoScrollView 24 | 25 | @dynamic delegate; 26 | 27 | - (instancetype)initWithFrame:(CGRect)frame { 28 | if (self = [super initWithFrame:frame]) { 29 | if (CGRectEqualToRect(frame, CGRectZero)) { 30 | self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 31 | } 32 | self.contentSize = CGSizeMake(0, self.frame.size.height); 33 | } 34 | return self; 35 | } 36 | 37 | - (void)layoutSubviews { 38 | [super layoutSubviews]; 39 | 40 | if (self.contentSize.height == 0) { 41 | self.contentSize = CGSizeMake(self.bounds.size.width, self.bounds.size.height); 42 | } 43 | } 44 | 45 | - (void)addPanGesture { 46 | [self addGestureRecognizer:self.panGesture]; 47 | } 48 | 49 | - (void)setDelegate:(id)delegate { 50 | [super setDelegate:delegate]; 51 | 52 | if (delegate) { 53 | self.userDelegate = delegate; 54 | }else { 55 | self.userDelegate = nil; 56 | } 57 | } 58 | 59 | #pragma mark - Gesture 60 | - (void)handlePanGesture:(GKDYPanGestureRecognizer *)panGesture { 61 | if (self.currentIndex == 0) { 62 | CGPoint location = [panGesture locationInView:panGesture.view]; 63 | 64 | switch (panGesture.state) { 65 | case UIGestureRecognizerStateBegan: { 66 | self.startLocationY = location.y; 67 | } 68 | break; 69 | case UIGestureRecognizerStateChanged: { 70 | if (panGesture.direction == GKDYPanGestureRecognizerDirectionVertical) { 71 | // 这里取整是解决上滑时可能出现的distance > 0的情况 72 | CGFloat distance = ceil(location.y) - ceil(self.startLocationY); 73 | if (distance > 0) { // 只要distance>0且没松手 就认为是下滑 74 | self.panGestureRecognizer.enabled = NO; 75 | } 76 | 77 | if (self.panGestureRecognizer.enabled == NO) { 78 | [self didPanWithDistance:distance isEnd:NO]; 79 | } 80 | } 81 | } 82 | break; 83 | case UIGestureRecognizerStateFailed: 84 | case UIGestureRecognizerStateCancelled: 85 | case UIGestureRecognizerStateEnded: { 86 | if (self.panGestureRecognizer.enabled == NO) { 87 | CGFloat distance = location.y - self.startLocationY; 88 | [self didPanWithDistance:distance isEnd:YES]; 89 | self.panGestureRecognizer.enabled = YES; 90 | } 91 | } 92 | break; 93 | 94 | default: 95 | break; 96 | } 97 | 98 | [panGesture setTranslation:CGPointZero inView:panGesture.view]; 99 | } 100 | } 101 | 102 | // 允许多个手势响应 103 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 104 | if (otherGestureRecognizer.view == self) { 105 | return YES; 106 | } 107 | return NO; 108 | } 109 | 110 | - (void)didPanWithDistance:(CGFloat)distance isEnd:(BOOL)isEnd { 111 | if ([self.userDelegate respondsToSelector:@selector(scrollView:didPanWithDistance:isEnd:)]) { 112 | [self.userDelegate scrollView:self didPanWithDistance:distance isEnd:isEnd]; 113 | } 114 | } 115 | 116 | #pragma mark - Lazy 117 | - (GKDYPanGestureRecognizer *)panGesture { 118 | if (!_panGesture) { 119 | _panGesture = [[GKDYPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 120 | _panGesture.delegate = self; 121 | _panGesture.direction = GKDYPanGestureRecognizerDirectionVertical; 122 | } 123 | return _panGesture; 124 | } 125 | 126 | @end 127 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoSlider.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoSlider.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface GKDYVideoSlider : UIView 16 | 17 | @property (nonatomic, strong) GKSliderView *sliderView; 18 | 19 | @property (nonatomic, copy) void(^slideBlock)(BOOL isDragging); 20 | 21 | @property (nonatomic, weak) ZFPlayerController *player; 22 | 23 | - (void)updateCurrentTime:(NSTimeInterval)currentTime totalTime:(NSTimeInterval)totalTime; 24 | 25 | - (void)showSmallSlider; 26 | - (void)showLargeSlider; 27 | 28 | - (void)showLoading; 29 | - (void)hideLoading; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Home/Video/View/GKDYVideoStatusBar.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoStatusBar.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYVideoStatusBar : UIView 14 | 15 | // 刷新时间,默认3s 16 | @property (nonatomic, assign) NSTimeInterval refreshTime; 17 | 18 | // 网络状态 19 | @property (nonatomic, copy) NSString *network; 20 | 21 | - (void)startTimer; 22 | 23 | - (void)destoryTimer; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/Controller/GKDYMainViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMainViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2018/12/12. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYPlayerViewController.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYMainViewController : UITabBarController 15 | 16 | @property (nonatomic, strong) GKDYPlayerViewController *playerVC; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/Controller/GKDYMainViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMainViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2018/12/12. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYMainViewController.h" 10 | #import "GKDYNavigationController.h" 11 | #import "GKDYAttentViewController.h" 12 | #import "GKDYMessageViewController.h" 13 | #import "GKDYMineViewController.h" 14 | #import "GKDYTabBar.h" 15 | #import "UITabBar+GKCategory.h" 16 | #import "GKDYHomeViewController.h" 17 | 18 | @interface GKDYMainViewController () 19 | 20 | @property (nonatomic, strong) GKDYTabBar *dyTabBar; 21 | 22 | @end 23 | 24 | @implementation GKDYMainViewController 25 | 26 | - (void)viewDidLoad { 27 | [super viewDidLoad]; 28 | 29 | self.delegate = self; 30 | 31 | // 替换系统tabbar 32 | self.dyTabBar = [GKDYTabBar new]; 33 | self.dyTabBar.translucent = NO; 34 | [self setValue:self.dyTabBar forKey:@"tabBar"]; 35 | 36 | self.playerVC = [GKDYPlayerViewController new]; 37 | self.playerVC.delegate = self; 38 | 39 | // [self addChildVC:self.playerVC title:@"首页"]; 40 | [self addChildVC:[GKDYHomeViewController new] title:@"首页"]; 41 | [self addChildVC:[GKDYAttentViewController new] title:@"关注"]; 42 | [self addChildVC:[GKDYMessageViewController new] title:@"消息"]; 43 | [self addChildVC:[GKDYMineViewController new] title:@"我"]; 44 | } 45 | 46 | - (void)viewWillAppear:(BOOL)animated { 47 | [super viewWillAppear:animated]; 48 | 49 | [self.navigationController setNavigationBarHidden:YES]; 50 | } 51 | 52 | - (void)addChildVC:(UIViewController *)childVC title:(NSString *)title { 53 | childVC.tabBarItem.title = title; 54 | [self setTabbarStyle:GKDYTabBarStyleTranslucent vc:childVC]; 55 | 56 | childVC.tabBarItem.titlePositionAdjustment = UIOffsetMake(0, -100); 57 | childVC.tabBarItem.imageInsets = UIEdgeInsetsMake(28, 0, -28, 0); 58 | 59 | GKDYNavigationController *nav = [GKDYNavigationController rootVC:childVC]; 60 | nav.gk_openScrollLeftPush = YES; 61 | [self addChildViewController:nav]; 62 | } 63 | 64 | - (void)setTabbarStyle:(GKDYTabBarStyle)style vc:(UIViewController *)vc { 65 | self.dyTabBar.style = style; 66 | 67 | UIImage *normalImage = [UIImage gk_imageWithColor:UIColor.clearColor size:CGSizeMake(1, 1)];; 68 | UIImage *selectImage = [UIImage gk_imageWithColor:[UIColor whiteColor] size:CGSizeMake(36, 3)]; 69 | UIColor *normalTitleColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 70 | UIColor *selectTitleColor = UIColor.whiteColor; 71 | UIFont *normalTitleFont = [UIFont boldSystemFontOfSize:15]; 72 | UIFont *selectTitleFont = [UIFont boldSystemFontOfSize:16]; 73 | UIImage *backgroundImage = nil; 74 | UIImage *shadowImage = [UIImage gk_imageWithColor:[UIColor colorWithWhite:1.0f alpha:0.2f] size:CGSizeMake(SCREEN_WIDTH, 0.5f)];; 75 | 76 | if (style == GKDYTabBarStyleTransparent) { 77 | backgroundImage = [UIImage gk_imageWithColor:UIColor.clearColor size:CGSizeMake(SCREEN_WIDTH, TABBAR_HEIGHT)]; 78 | }else if (style == GKDYTabBarStyleTranslucent) { 79 | backgroundImage = [UIImage gk_imageWithColor:[UIColor colorWithWhite:0 alpha:0.8] size:CGSizeMake(SCREEN_WIDTH, TABBAR_HEIGHT)]; 80 | } 81 | vc.tabBarItem.image = [normalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 82 | vc.tabBarItem.selectedImage = [selectImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 83 | 84 | NSDictionary *normalTitleAttr = @{NSFontAttributeName: normalTitleFont, NSForegroundColorAttributeName: normalTitleColor}; 85 | NSDictionary *selectTitleAttr = @{NSFontAttributeName: selectTitleFont, NSForegroundColorAttributeName: selectTitleColor}; 86 | if (@available(iOS 13.0, *)) { 87 | UITabBarAppearance *appearance = [UITabBarAppearance new]; 88 | [appearance ay_applyItemAppearanceWithBlock:^(UITabBarItemAppearance * _Nullable itemAppearance) { 89 | itemAppearance.normal.titleTextAttributes = normalTitleAttr; 90 | itemAppearance.selected.titleTextAttributes = selectTitleAttr; 91 | }]; 92 | appearance.backgroundEffect = nil; 93 | appearance.shadowImage = shadowImage; 94 | appearance.backgroundImage = backgroundImage; 95 | vc.tabBarItem.standardAppearance = appearance; 96 | }else { 97 | [vc.tabBarItem setTitleTextAttributes:normalTitleAttr forState:UIControlStateNormal]; 98 | [vc.tabBarItem setTitleTextAttributes:selectTitleAttr forState:UIControlStateSelected]; 99 | } 100 | } 101 | 102 | #pragma mark - GKDYPlayerViewControllerDelegate 103 | - (void)playerVCDidClickShoot:(GKDYPlayerViewController *)playerVC { 104 | // 随拍按钮点击 105 | [self.navigationController popViewControllerAnimated:YES]; 106 | } 107 | 108 | //- (void)playerVC:(GKDYPlayerViewController *)playerVC controlView:(nonnull GKDYVideoControlView *)controlView isCritical:(BOOL)isCritical { 109 | // 110 | // GKSliderView *sliderView = controlView.sliderView; 111 | // 112 | // if (isCritical) { // 到达临界点,隐藏分割线 113 | // sliderView.maximumTrackTintColor = [UIColor colorWithWhite:1.0f alpha:0.2f]; 114 | // [self.dyTabBar hideLine]; 115 | // }else { 116 | // sliderView.maximumTrackTintColor = [UIColor clearColor]; 117 | // [self.dyTabBar showLine]; 118 | // } 119 | //} 120 | 121 | #pragma mark - UITabBarControllerDelegate 122 | - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 123 | if (tabBarController.selectedIndex == 2 || tabBarController.selectedIndex == 3) { 124 | self.gk_popDelegate = self; 125 | }else { 126 | self.gk_popDelegate = nil; 127 | } 128 | } 129 | 130 | @end 131 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/Controller/GKDYNavigationController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYNavigationController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/4/21. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYNavigationController : UINavigationController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/Controller/GKDYNavigationController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYNavigationController.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/4/21. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYNavigationController.h" 10 | 11 | @interface GKDYNavigationController () 12 | 13 | @end 14 | 15 | @implementation GKDYNavigationController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | 21 | } 22 | 23 | - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { 24 | if (self.childViewControllers.count > 0) { 25 | UIViewController *root = self.childViewControllers[0]; 26 | if (viewController != root) { 27 | viewController.hidesBottomBarWhenPushed = YES; 28 | } 29 | } 30 | [super pushViewController:viewController animated:animated]; 31 | } 32 | 33 | - (UIViewController *)childViewControllerForStatusBarStyle { 34 | UIViewController *topVC = self.topViewController; 35 | if ([topVC isKindOfClass:[UITabBarController class]]) { 36 | return ((UITabBarController *)topVC).selectedViewController; 37 | } 38 | return topVC; 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/View/GKDYTabBar.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYTabBar.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, GKDYTabBarStyle) { 14 | GKDYTabBarStyleTransparent, // 全透明样式 15 | GKDYTabBarStyleTranslucent // 半透明样式 16 | }; 17 | 18 | @interface GKDYTabBar : UITabBar 19 | 20 | @property (nonatomic, assign) GKDYTabBarStyle style; 21 | 22 | - (void)showLine; 23 | - (void)hideLine; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Main/View/GKDYTabBar.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYTabBar.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYTabBar.h" 10 | #import 11 | 12 | @interface GKDYTabBar() 13 | 14 | @property (nonatomic, strong) UIButton *publishBtn; 15 | 16 | @end 17 | 18 | @implementation GKDYTabBar 19 | 20 | - (instancetype)init { 21 | if (self = [super init]) { 22 | [self addSubview:self.publishBtn]; 23 | [self showLine]; 24 | } 25 | return self; 26 | } 27 | 28 | - (void)setStyle:(GKDYTabBarStyle)style { 29 | _style = style; 30 | 31 | if (style == GKDYTabBarStyleTransparent) { 32 | [self setBackgroundImage:[UIImage gk_imageWithColor:UIColor.clearColor size:CGSizeMake(SCREEN_WIDTH, TABBAR_HEIGHT)]]; 33 | }else if (style == GKDYTabBarStyleTranslucent) { 34 | [self setBackgroundImage:[UIImage gk_imageWithColor:[UIColor colorWithWhite:0 alpha:0.8] size:CGSizeMake(SCREEN_WIDTH, TABBAR_HEIGHT)]]; 35 | } 36 | } 37 | 38 | - (void)showLine { 39 | self.shadowImage = [UIImage gk_imageWithColor:[UIColor colorWithWhite:1.0f alpha:0.2f] size:CGSizeMake(SCREEN_WIDTH, 0.5f)]; 40 | } 41 | 42 | - (void)hideLine { 43 | self.shadowImage = [UIImage gk_imageWithColor:[UIColor clearColor] size:CGSizeMake(SCREEN_WIDTH, 0.5f)]; 44 | } 45 | 46 | - (void)layoutSubviews { 47 | [super layoutSubviews]; 48 | 49 | CGFloat width = CGRectGetWidth(self.bounds); 50 | 51 | CGFloat btnX = 0; 52 | CGFloat btnY = 0; 53 | CGFloat btnW = width / 5; 54 | CGFloat btnH = 0; 55 | 56 | self.publishBtn.frame = CGRectMake(0, 0, btnW, 49); 57 | self.publishBtn.center = CGPointMake(width * 0.5f, 49 * 0.5f); 58 | 59 | NSInteger index = 0; 60 | for (UIControl *button in self.subviews) { 61 | if (![button isKindOfClass:[UIControl class]] || button == self.publishBtn) { 62 | continue; 63 | } 64 | 65 | // 计算btnX 66 | btnX = btnW * (index > 1 ? index + 1 : index); 67 | // 这里高度不能设置为tabbar的高度,因为iOS11 tabbar高度变化了 68 | btnH = button.frame.size.height; 69 | 70 | // 设置frame 71 | button.frame = CGRectMake(btnX, btnY, btnW, btnH); 72 | 73 | // 增加索引 74 | index ++; 75 | } 76 | } 77 | 78 | #pragma mark - 懒加载 79 | - (UIButton *)publishBtn { 80 | if (!_publishBtn) { 81 | _publishBtn = [UIButton new]; 82 | [_publishBtn setImage:[UIImage imageNamed:@"btn_home_add"] forState:UIControlStateNormal]; 83 | } 84 | return _publishBtn; 85 | } 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Message/Controller/GKDYMessageViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMessageViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYMessageViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Message/Controller/GKDYMessageViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMessageViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYMessageViewController.h" 10 | 11 | @interface GKDYMessageViewController () 12 | 13 | @end 14 | 15 | @implementation GKDYMessageViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | self.gk_navBackgroundColor = [UIColor clearColor]; 21 | self.gk_navShadowColor = [UIColor colorWithWhite:1.0f alpha:0.2f]; 22 | self.gk_navTitle = @"消息"; 23 | 24 | self.view.backgroundColor = [UIColor blackColor]; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Controller/GKDYMineViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMineViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYMineViewController : GKDYBaseViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Controller/GKDYMineViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYMineViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/8. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYMineViewController.h" 10 | 11 | @interface GKDYMineViewController () 12 | 13 | @end 14 | 15 | @implementation GKDYMineViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | self.gk_navBackgroundColor = [UIColor clearColor]; 21 | self.gk_navShadowColor = [UIColor colorWithWhite:1.0f alpha:0.2f]; 22 | self.gk_navTitle = @"我"; 23 | 24 | self.view.backgroundColor = [UIColor blackColor]; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Controller/GKDYUserViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | #import "GKDYVideoModel.h" 11 | #import "GKDYVideoListViewController.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface GKDYUserViewController : GKDYBaseViewController 16 | 17 | @property (nonatomic, strong) GKDYVideoModel *model; 18 | 19 | @property (nonatomic, weak) GKDYVideoListViewController *currentListVC; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Controller/GKDYVideoListViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoListViewController.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYBaseViewController.h" 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GKDYVideoListViewController : GKDYBaseViewController 15 | 16 | @property (nonatomic, strong) UICollectionView *collectionView; 17 | 18 | @property (nonatomic, copy) NSString *uid; 19 | 20 | @property (nonatomic, assign) NSInteger selectedIndex; 21 | 22 | @property (nonatomic, copy) void(^cellClickBlock)(NSArray *list, NSInteger index); 23 | 24 | - (void)scrollItemToIndexPath:(NSIndexPath *)indexPath; 25 | 26 | - (void)requestMoreCompletion:(void(^)(NSArray *list))completion; 27 | 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Controller/GKDYVideoListViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoListViewController.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoListViewController.h" 10 | #import "GKDYVideoListCell.h" 11 | #import "GKDYUserVideoViewModel.h" 12 | #import "GKBallLoadingView.h" 13 | 14 | @interface GKDYVideoListViewController () 15 | 16 | @property (nonatomic, strong) GKDYUserVideoViewModel *viewModel; 17 | 18 | @property (nonatomic, strong) UIView *loadingBgView; 19 | @property (nonatomic, strong) GKBallLoadingView *loadingView; 20 | 21 | @end 22 | 23 | @implementation GKDYVideoListViewController 24 | 25 | - (void)viewDidLoad { 26 | [super viewDidLoad]; 27 | 28 | [self initUI]; 29 | [self setupRefresh]; 30 | } 31 | 32 | - (void)initUI { 33 | [self.view addSubview:self.collectionView]; 34 | [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { 35 | make.edges.equalTo(self.view); 36 | }]; 37 | 38 | [self.collectionView addSubview:self.loadingBgView]; 39 | self.loadingBgView.frame = CGRectMake(0, 0, self.view.frame.size.width, 200); 40 | } 41 | 42 | - (void)viewWillLayoutSubviews { 43 | [super viewWillLayoutSubviews]; 44 | 45 | self.view.frame = self.view.superview.bounds; 46 | } 47 | 48 | - (void)setupRefresh { 49 | @weakify(self); 50 | self.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ 51 | @strongify(self); 52 | [self.viewModel requestData]; 53 | }]; 54 | } 55 | 56 | - (void)requestData { 57 | self.loadingView = [GKBallLoadingView loadingViewInView:self.loadingBgView]; 58 | [self.loadingView startLoading]; 59 | [self.viewModel requestData]; 60 | } 61 | 62 | - (void)reloadData { 63 | [self.collectionView.mj_footer endRefreshing]; 64 | if (!self.viewModel.hasMore) { 65 | [self.collectionView.mj_footer endRefreshingWithNoMoreData]; 66 | } 67 | [self.collectionView reloadData]; 68 | } 69 | 70 | - (void)scrollItemToIndexPath:(NSIndexPath *)indexPath { 71 | if (indexPath.item > self.viewModel.dataList.count - 1) return; 72 | 73 | // GKDYVideoListCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath]; 74 | // if ([self.collectionView.visibleCells containsObject:cell]) { 75 | // return; 76 | // } 77 | 78 | [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:YES]; 79 | // if (indexPath.row >= self.viewModel.dataList.count - 3) { 80 | // [self.viewModel requestData]; 81 | // } 82 | } 83 | 84 | - (void)requestMoreCompletion:(void (^)(NSArray * _Nonnull))completion { 85 | [self.viewModel requestDataCompletion:^(BOOL success, NSArray * _Nullable list) { 86 | [self reloadData]; 87 | !completion ?: completion(list); 88 | }]; 89 | } 90 | 91 | #pragma mark - GKPageSmoothListViewDelegate 92 | - (UIView *)listView { 93 | return self.view; 94 | } 95 | 96 | - (UIScrollView *)listScrollView { 97 | return self.collectionView; 98 | } 99 | 100 | - (void)listViewDidAppear { 101 | if ([self.viewModel.ctime isEqualToString:@""]) { 102 | [self requestData]; 103 | } 104 | } 105 | 106 | #pragma mark - UICollectionViewDataSource 107 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 108 | return self.viewModel.dataList.count; 109 | } 110 | 111 | - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 112 | GKDYVideoListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GKDYVideoListCell" forIndexPath:indexPath]; 113 | cell.model = self.viewModel.dataList[indexPath.row]; 114 | return cell; 115 | } 116 | 117 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 118 | self.selectedIndex = indexPath.item; 119 | !self.cellClickBlock ?: self.cellClickBlock(self.viewModel.dataList, indexPath.item); 120 | } 121 | 122 | #pragma mark - Lazy 123 | - (UICollectionView *)collectionView { 124 | if (!_collectionView) { 125 | CGFloat width = (self.view.bounds.size.width - 2) / 3; 126 | CGFloat height = width * 16 / 9; 127 | UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 128 | layout.itemSize = CGSizeMake(width, height); 129 | layout.minimumLineSpacing = 1.0f; 130 | layout.minimumInteritemSpacing = 1.0f; 131 | 132 | _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; 133 | _collectionView.dataSource = self; 134 | _collectionView.delegate = self; 135 | _collectionView.backgroundColor = UIColor.blackColor; 136 | [_collectionView registerClass:GKDYVideoListCell.class forCellWithReuseIdentifier:@"GKDYVideoListCell"]; 137 | _collectionView.alwaysBounceVertical = YES; 138 | _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; 139 | } 140 | return _collectionView; 141 | } 142 | 143 | - (GKDYUserVideoViewModel *)viewModel { 144 | if (!_viewModel) { 145 | _viewModel = [[GKDYUserVideoViewModel alloc] init]; 146 | _viewModel.uid = self.uid; 147 | 148 | @weakify(self); 149 | [_viewModel setRequestBlock:^(BOOL success) { 150 | @strongify(self); 151 | [self reloadData]; 152 | if (self.loadingView) { 153 | [self.loadingView stopLoading]; 154 | [self.loadingView removeFromSuperview]; 155 | } 156 | self.loadingBgView.hidden = YES; 157 | }]; 158 | } 159 | return _viewModel; 160 | } 161 | 162 | - (UIView *)loadingBgView { 163 | if (!_loadingBgView) { 164 | _loadingBgView = [[UIView alloc] init]; 165 | } 166 | return _loadingBgView; 167 | } 168 | 169 | @end 170 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Model/GKDYUserModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserModel.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/28. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYUserModel : NSObject 14 | 15 | @property (nonatomic, copy) NSString *author; 16 | @property (nonatomic, copy) NSString *author_icon; 17 | @property (nonatomic, copy) NSString *mthid; 18 | @property (nonatomic, copy) NSString *authentication_content; 19 | @property (nonatomic, copy) NSString *fansCnt; 20 | @property (nonatomic, copy) NSString *fansCntText; 21 | @property (nonatomic, copy) NSString *videoCount; 22 | @property (nonatomic, copy) NSString *videoCntText; 23 | @property (nonatomic, copy) NSString *totalPlaycnt; 24 | @property (nonatomic, copy) NSString *totalPlaycntText; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Model/GKDYUserModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserModel.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/28. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYUserModel.h" 10 | 11 | @implementation GKDYUserModel 12 | 13 | + (NSDictionary *)modelCustomPropertyMapper { 14 | return @{@"author" : @"author.author", 15 | @"author_icon": @"author.author_icon", 16 | @"mthid": @"author.mthid", 17 | @"authentication_content": @"author.authentication_content", 18 | @"fansCnt": @"cnt.fansCnt", 19 | @"fansCntText": @"cnt.fansCntText", 20 | @"videoCount": @"cnt.videoCount", 21 | @"videoCntText": @"cnt.videoCntText", 22 | @"totalPlaycnt": @"cnt.totalPlaycnt", 23 | @"totalPlaycntText": @"cnt.totalPlaycntText" 24 | }; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Model/GKDYUserVideoModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserVideoModel.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYUserVideoModel : NSObject 14 | 15 | @property (nonatomic, copy) NSString *vid; 16 | 17 | @property (nonatomic, copy) NSString *publish_time; 18 | 19 | @property (nonatomic, copy) NSString *title; 20 | 21 | @property (nonatomic, copy) NSString *cover_src; 22 | 23 | @property (nonatomic, copy) NSString *cover_src_pc; 24 | 25 | @property (nonatomic, copy) NSString *thumbnails; 26 | 27 | @property (nonatomic, copy) NSString *duration; 28 | 29 | @property (nonatomic, copy) NSString *poster; 30 | 31 | @property (nonatomic, copy) NSString *playcnt; 32 | 33 | @property (nonatomic, copy) NSString *playcntText; 34 | 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/Model/GKDYUserVideoModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserVideoModel.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYUserVideoModel.h" 10 | 11 | @implementation GKDYUserVideoModel 12 | 13 | + (NSDictionary *)modelCustomPropertyMapper { 14 | return @{@"vid" : @"content.vid", 15 | @"publish_time": @"content.publish_time", 16 | @"title": @"content.title", 17 | @"cover_src": @"content.cover_src", 18 | @"cover_src_pc": @"content.cover_src_pc", 19 | @"thumbnails": @"content.thumbnails", 20 | @"duration": @"content.duration", 21 | @"poster": @"content.poster", 22 | @"playcnt": @"content.playcnt", 23 | @"playcntText": @"content.playcntText" 24 | }; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/View/GKDYScaleVideoView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYScaleVideoView.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/7/30. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYUserViewController.h" 11 | #import "GKDYVideoScrollView.h" 12 | #import "GKDYPlayerManager.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface GKDYScaleVideoView : UIView 17 | 18 | @property (nonatomic, strong) GKDYVideoScrollView *scrollView; 19 | 20 | @property (nonatomic, strong) GKDYPlayerManager *manager; 21 | 22 | @property (nonatomic, weak) GKDYUserViewController *vc; 23 | 24 | @property (nonatomic, strong) NSMutableArray *videoList; 25 | 26 | @property (nonatomic, assign) NSInteger index; 27 | 28 | @property (nonatomic, copy) void(^requestBlock)(void); 29 | 30 | - (void)show; 31 | - (void)reloadData; 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/View/GKDYUserHeaderView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserHeaderView.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYUserModel.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | #define kDYUserHeaderHeight (SCREEN_WIDTH * 260.0 / 345.0) 15 | #define kDYUserHeaderBgHeight (SCREEN_WIDTH * 110.0 / 345.0) 16 | 17 | @interface GKDYUserHeaderView : UIView 18 | 19 | @property (nonatomic, strong) GKDYUserModel *model; 20 | 21 | - (void)scrollViewDidScroll:(CGFloat)offsetY; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/View/GKDYUserHeaderView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserHeaderView.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYUserHeaderView.h" 10 | 11 | @interface GKDYUserHeaderView() 12 | 13 | @property (nonatomic, strong) UIImageView *bgImgView; 14 | @property (nonatomic, assign) CGRect bgImgFrame; 15 | 16 | @property (nonatomic, strong) UIView *contentView; 17 | @property (nonatomic, strong) UIImageView *iconView; 18 | @property (nonatomic, strong) UILabel *nameLabel; 19 | @property (nonatomic, strong) UILabel *dyIdLabel; 20 | 21 | @end 22 | 23 | @implementation GKDYUserHeaderView 24 | 25 | - (instancetype)initWithFrame:(CGRect)frame { 26 | if (self = [super initWithFrame:frame]) { 27 | [self initUI]; 28 | self.bgImgView.frame = CGRectMake(0, 0, frame.size.width, kDYUserHeaderBgHeight); 29 | self.bgImgFrame = self.bgImgView.frame; 30 | } 31 | return self; 32 | } 33 | 34 | - (void)initUI { 35 | [self addSubview:self.bgImgView]; 36 | [self addSubview:self.contentView]; 37 | [self.contentView addSubview:self.iconView]; 38 | [self.contentView addSubview:self.nameLabel]; 39 | [self.contentView addSubview:self.dyIdLabel]; 40 | 41 | [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { 42 | make.edges.equalTo(self).insets(UIEdgeInsetsMake(kDYUserHeaderBgHeight, 0, 0, 0)); 43 | }]; 44 | 45 | [self.iconView mas_makeConstraints:^(MASConstraintMaker *make) { 46 | make.left.equalTo(self.contentView).offset(15); 47 | make.top.equalTo(self.contentView).offset(-15); 48 | make.width.height.mas_equalTo(96); 49 | }]; 50 | 51 | [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { 52 | make.left.equalTo(self.iconView); 53 | make.top.equalTo(self.iconView.mas_bottom).offset(20); 54 | }]; 55 | 56 | [self.dyIdLabel mas_makeConstraints:^(MASConstraintMaker *make) { 57 | make.left.equalTo(self.nameLabel); 58 | make.top.equalTo(self.nameLabel.mas_bottom).offset(10); 59 | }]; 60 | } 61 | 62 | - (void)setModel:(GKDYUserModel *)model { 63 | _model = model; 64 | 65 | self.nameLabel.text = model.author; 66 | 67 | [self.iconView sd_setImageWithURL:[NSURL URLWithString:model.author_icon]]; 68 | 69 | self.dyIdLabel.text = [NSString stringWithFormat:@"%@ %@", model.fansCntText, model.videoCntText]; 70 | } 71 | 72 | - (void)scrollViewDidScroll:(CGFloat)offsetY { 73 | CGRect frame = self.bgImgFrame; 74 | // 上下放大 75 | frame.size.height -= offsetY; 76 | frame.origin.y = offsetY; 77 | 78 | // 左右放大 79 | if (offsetY <= 0) { 80 | frame.size.width = frame.size.height * self.bgImgFrame.size.width / self.bgImgFrame.size.height; 81 | frame.origin.x = (self.frame.size.width - frame.size.width) / 2; 82 | } 83 | 84 | self.bgImgView.frame = frame; 85 | } 86 | 87 | #pragma mark - 懒加载 88 | - (UIImageView *)bgImgView { 89 | if (!_bgImgView) { 90 | _bgImgView = [UIImageView new]; 91 | _bgImgView.image = [UIImage imageNamed:@"bg"]; 92 | _bgImgView.contentMode = UIViewContentModeScaleAspectFill; 93 | _bgImgView.clipsToBounds = YES; 94 | } 95 | return _bgImgView; 96 | } 97 | 98 | - (UIView *)contentView { 99 | if (!_contentView) { 100 | _contentView = [UIView new]; 101 | _contentView.backgroundColor = GKColorRGB(34, 33, 37); 102 | } 103 | return _contentView; 104 | } 105 | 106 | - (UIImageView *)iconView { 107 | if (!_iconView) { 108 | _iconView = [UIImageView new]; 109 | _iconView.image = [UIImage imageNamed:@"dy_icon"]; 110 | _iconView.layer.cornerRadius = 48.0f; 111 | _iconView.layer.masksToBounds = YES; 112 | _iconView.layer.borderColor = GKColorRGB(34, 33, 37).CGColor; 113 | _iconView.layer.borderWidth = 3; 114 | } 115 | return _iconView; 116 | } 117 | 118 | - (UILabel *)nameLabel { 119 | if (!_nameLabel) { 120 | _nameLabel = [UILabel new]; 121 | _nameLabel.textColor = [UIColor whiteColor]; 122 | _nameLabel.font = [UIFont systemFontOfSize:16.0f]; 123 | } 124 | return _nameLabel; 125 | } 126 | 127 | - (UILabel *)dyIdLabel { 128 | if (!_dyIdLabel) { 129 | _dyIdLabel = [UILabel new]; 130 | _dyIdLabel.textColor = [UIColor whiteColor]; 131 | _dyIdLabel.font = [UIFont systemFontOfSize:14.0f]; 132 | } 133 | return _dyIdLabel; 134 | } 135 | 136 | @end 137 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/View/GKDYVideoListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoListCell.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "GKDYUserVideoModel.h" 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface GKDYVideoListCell : UICollectionViewCell 16 | 17 | @property (nonatomic, strong) GKDYUserVideoModel *model; 18 | 19 | @property (nonatomic, strong) SDAnimatedImageView *coverImgView; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/View/GKDYVideoListCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYVideoListCell.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYVideoListCell.h" 10 | 11 | @interface GKDYVideoListCell() 12 | 13 | @property (nonatomic, strong) UIButton *starBtn; 14 | 15 | @end 16 | 17 | @implementation GKDYVideoListCell 18 | 19 | - (instancetype)initWithFrame:(CGRect)frame { 20 | if (self = [super initWithFrame:frame]) { 21 | [self.contentView addSubview:self.coverImgView]; 22 | [self.contentView addSubview:self.starBtn]; 23 | 24 | [self.coverImgView mas_makeConstraints:^(MASConstraintMaker *make) { 25 | make.edges.equalTo(self.contentView); 26 | }]; 27 | 28 | [self.starBtn mas_makeConstraints:^(MASConstraintMaker *make) { 29 | make.left.equalTo(self.contentView).offset(12.0f); 30 | make.bottom.equalTo(self.contentView).offset(-12.0f); 31 | }]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)setModel:(GKDYUserVideoModel *)model { 37 | _model = model; 38 | 39 | [self.coverImgView sd_setImageWithURL:[NSURL URLWithString:model.cover_src]]; 40 | 41 | [self.starBtn setTitle:model.playcntText forState:UIControlStateNormal]; 42 | } 43 | 44 | #pragma mark - 懒加载 45 | - (SDAnimatedImageView *)coverImgView { 46 | if (!_coverImgView) { 47 | _coverImgView = [SDAnimatedImageView new]; 48 | _coverImgView.contentMode = UIViewContentModeScaleAspectFill; 49 | _coverImgView.clipsToBounds = YES; 50 | } 51 | return _coverImgView; 52 | } 53 | 54 | - (UIButton *)starBtn { 55 | if (!_starBtn) { 56 | _starBtn = [UIButton new]; 57 | [_starBtn setImage:[UIImage imageNamed:@"ss_icon_like"] forState:UIControlStateNormal]; 58 | _starBtn.titleLabel.font = [UIFont systemFontOfSize:14.0f]; 59 | [_starBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 60 | } 61 | return _starBtn; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/ViewModel/GKDYUserVideoViewModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserVideoViewModel.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYUserVideoViewModel : NSObject 14 | 15 | @property (nonatomic, copy) NSString *uid; 16 | 17 | @property (nonatomic, copy) NSString *ctime; 18 | 19 | @property (nonatomic, assign) BOOL hasMore; 20 | 21 | @property (nonatomic, strong) NSMutableArray *dataList; 22 | 23 | @property (nonatomic, copy) void(^requestBlock)(BOOL success); 24 | 25 | - (void)requestData; 26 | - (void)requestDataCompletion:(void(^)(BOOL success, NSArray *_Nullable list))completion; 27 | 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Mine/ViewModel/GKDYUserVideoViewModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYUserVideoViewModel.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/27. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYUserVideoViewModel.h" 10 | #import 11 | #import "GKDYUserVideoModel.h" 12 | 13 | @implementation GKDYUserVideoViewModel 14 | 15 | - (instancetype)init { 16 | if (self = [super init]) { 17 | self.ctime = @""; 18 | } 19 | return self; 20 | } 21 | 22 | - (void)requestData { 23 | @weakify(self); 24 | [self requestDataCompletion:^(BOOL success, NSArray * _Nullable list) { 25 | @strongify(self); 26 | !self.requestBlock ?: self.requestBlock(success); 27 | }]; 28 | } 29 | 30 | - (void)requestDataCompletion:(void (^)(BOOL, NSArray * _Nullable))completion { 31 | AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 32 | 33 | NSString *url = [NSString stringWithFormat:@"https://haokan.baidu.com/web/author/listall?app_id=%@&ctime=%@&rn=10&searchAfter=&_api=1", self.uid, self.ctime]; 34 | 35 | [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 36 | if ([responseObject[@"errno"] integerValue] == 0) { 37 | NSDictionary *data = responseObject[@"data"]; 38 | 39 | if ([self.ctime isEqualToString:@""]) { 40 | [self.dataList removeAllObjects]; 41 | } 42 | 43 | self.ctime = [NSString stringWithFormat:@"%@", data[@"ctime"]]; 44 | self.hasMore = [data[@"has_more"] boolValue]; 45 | NSArray *results = data[@"results"]; 46 | NSMutableArray *list = [NSMutableArray array]; 47 | [results enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 48 | GKDYUserVideoModel *model = [GKDYUserVideoModel yy_modelWithDictionary:obj]; 49 | [list addObject:model]; 50 | }]; 51 | [self.dataList addObjectsFromArray:list]; 52 | !completion ?: completion(YES, list); 53 | }else { 54 | !completion ?: completion(NO, nil); 55 | } 56 | } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 57 | !completion ?: completion(NO, nil); 58 | }]; 59 | } 60 | 61 | - (NSMutableArray *)dataList { 62 | if (!_dataList) { 63 | _dataList = [NSMutableArray array]; 64 | } 65 | return _dataList; 66 | } 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuintGao/GKDYVideo/c7bfef43600623c0412f43b95b80c4c69aa601d9/GKDYVideo/Classes/Tools/.DS_Store -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/NSMethodSignature+GKCategory.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSMethodSignature+GKCategory.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/10/24. 6 | // Copyright © 2019 GKVideo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSMethodSignature (GKCategory) 14 | 15 | /** 16 | 以 NSString 格式返回当前 NSMethodSignature 的 typeEncoding,例如 v@: 17 | */ 18 | @property(nullable, nonatomic, copy, readonly) NSString *ay_typeString; 19 | 20 | /** 21 | 以 const char 格式返回当前 NSMethodSignature 的 typeEncoding,例如 v@: 22 | */ 23 | @property(nullable, nonatomic, readonly) const char *ay_typeEncoding; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/NSMethodSignature+GKCategory.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSMethodSignature+GKCategory.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/10/24. 6 | // Copyright © 2019 GKDYVideo. All rights reserved. 7 | // 8 | 9 | #import "NSMethodSignature+GKCategory.h" 10 | 11 | #define AYArgumentToString(macro) #macro 12 | #define AYClangWarningConcat(warning_name) AYArgumentToString(clang diagnostic ignored warning_name) 13 | 14 | /// 参数可直接传入 clang 的 warning 名,warning 列表参考:https://clang.llvm.org/docs/DiagnosticsReference.html 15 | #define AYBeginIgnoreClangWarning(warningName) _Pragma("clang diagnostic push") _Pragma(AYClangWarningConcat(#warningName)) 16 | #define AYEndIgnoreClangWarning _Pragma("clang diagnostic pop") 17 | 18 | #define AYBeginIgnorePerformSelectorLeaksWarning AYBeginIgnoreClangWarning(-Warc-performSelector-leaks) 19 | #define AYEndIgnorePerformSelectorLeaksWarning AYEndIgnoreClangWarning 20 | 21 | #define AYBeginIgnoreAvailabilityWarning AYBeginIgnoreClangWarning(-Wpartial-availability) 22 | #define AYEndIgnoreAvailabilityWarning AYEndIgnoreClangWarning 23 | 24 | #define AYBeginIgnoreDeprecatedWarning AYBeginIgnoreClangWarning(-Wdeprecated-declarations) 25 | #define AYEndIgnoreDeprecatedWarning AYEndIgnoreClangWarning 26 | 27 | @implementation NSMethodSignature (GKCategory) 28 | 29 | - (NSString *)ay_typeString { 30 | AYBeginIgnorePerformSelectorLeaksWarning 31 | NSString *typeString = [self performSelector:NSSelectorFromString([NSString stringWithFormat:@"_%@String", @"type"])]; 32 | AYEndIgnorePerformSelectorLeaksWarning 33 | return typeString; 34 | } 35 | 36 | - (const char *)ay_typeEncoding { 37 | return self.ay_typeString.UTF8String; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/NSString+GKCategory.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+GKCategory.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2021/4/22. 6 | // Copyright © 2021 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSString (GKCategory) 14 | 15 | - (NSString *)gk_unitConvert; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/NSString+GKCategory.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+GKCategory.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2021/4/22. 6 | // Copyright © 2021 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "NSString+GKCategory.h" 10 | 11 | @implementation NSString (GKCategory) 12 | 13 | - (NSString *)gk_unitConvert { 14 | float value = self.floatValue; 15 | 16 | if (value < 0) value = 0; 17 | 18 | if (value >= 10000) { 19 | if (value >= 100000000) { 20 | return [NSString stringWithFormat:@"%.1f亿",value / 100000000.0f]; 21 | } 22 | return [NSString stringWithFormat:@"%.1fw",value / 10000.0f]; 23 | } 24 | 25 | return [self isEqualToString:@""] ? @"0" : self; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/UIButton+GKCategory.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIButton+GKCategory.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UIButton (GKCategory) 14 | 15 | /* 16 | 扩大UIButton响应区域 17 | 18 | 使用 19 | [enlargeButton setEnlargeEdge:20.0]; 20 | 或者 21 | [enlargeButton setEnlargeEdgeWithTop:20 right:20 bottom:20 left:10]; 22 | */ 23 | 24 | - (void)setEnlargeEdge:(CGFloat)size; 25 | - (void)setEnlargeEdgeWithTop:(CGFloat)top left:(CGFloat)left bottom:(CGFloat)bottom right:(CGFloat)right; 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/UIButton+GKCategory.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIButton+GKCategory.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/22. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "UIButton+GKCategory.h" 10 | #import 11 | 12 | @implementation UIButton (GKCategory) 13 | 14 | static char topNameKey; 15 | static char rightNameKey; 16 | static char bottomNameKey; 17 | static char leftNameKey; 18 | 19 | - (void)setEnlargeEdge:(CGFloat)size 20 | { 21 | objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC); 22 | objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC); 23 | objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC); 24 | objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC); 25 | } 26 | 27 | - (void)setEnlargeEdgeWithTop:(CGFloat)top left:(CGFloat)left bottom:(CGFloat)bottom right:(CGFloat)right 28 | { 29 | objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC); 30 | objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC); 31 | objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC); 32 | objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC); 33 | } 34 | 35 | - (CGRect)enlargedRect 36 | { 37 | NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey); 38 | NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey); 39 | NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey); 40 | NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey); 41 | if (topEdge && rightEdge && bottomEdge && leftEdge) 42 | { 43 | return CGRectMake(self.bounds.origin.x - leftEdge.floatValue, 44 | self.bounds.origin.y - topEdge.floatValue, 45 | self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue, 46 | self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue); 47 | } 48 | else 49 | { 50 | return self.bounds; 51 | } 52 | } 53 | 54 | - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 55 | { 56 | CGRect rect = [self enlargedRect]; 57 | if (CGRectEqualToRect(rect, self.bounds)) 58 | { 59 | return [super pointInside:point withEvent:event]; 60 | } 61 | return CGRectContainsPoint(rect, point) ? YES : NO; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/Category/UITabBar+GKCategory.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITabBar+GKCategory.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2019/10/24. 6 | // Copyright © 2019 GKDYVideo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UITabBar (GKCategory) 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | 19 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 20 | 21 | UIKIT_EXTERN API_AVAILABLE(ios(13.0), tvos(13.0)) @interface UITabBarAppearance (QMUI) 22 | 23 | /** 24 | 同时设置 stackedLayoutAppearance、inlineLayoutAppearance、compactInlineLayoutAppearance 三个状态下的 itemAppearance 25 | */ 26 | - (void)ay_applyItemAppearanceWithBlock:(void (^ _Nullable)(UITabBarItemAppearance * _Nullable itemAppearance))block; 27 | @end 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKDYTools.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYTools.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/20. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDYTools : NSObject 14 | 15 | + (NSString *)convertTimeSecond:(NSInteger)timeSecond; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKDYTools.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDYTools.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2023/3/20. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDYTools.h" 10 | 11 | @implementation GKDYTools 12 | 13 | + (NSString *)convertTimeSecond:(NSInteger)timeSecond { 14 | NSString *theLastTime = nil; 15 | long second = timeSecond; 16 | if (timeSecond < 60) { 17 | theLastTime = [NSString stringWithFormat:@"00:%02zd", second]; 18 | }else if (timeSecond >= 60 && timeSecond < 3600) { 19 | theLastTime = [NSString stringWithFormat:@"%02zd:%02zd", second/60, second%60]; 20 | }else if (timeSecond >= 3600) { 21 | theLastTime = [NSString stringWithFormat:@"%02zd:%02zd:%02zd", second/3600, second%3600/60, second%60]; 22 | } 23 | return theLastTime; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKLikeView/GKDoubleLikeView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKDoubleLikeView.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/6/19. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKDoubleLikeView : NSObject 14 | 15 | - (void)createAnimationWithPoint:(CGPoint)point view:(UIView *)view completion:(nullable void(^)(void))completion; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKLikeView/GKDoubleLikeView.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKDoubleLikeView.m 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/6/19. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKDoubleLikeView.h" 10 | 11 | @interface GKDoubleLikeView() 12 | 13 | @property (nonatomic, copy) void(^completion)(void); 14 | 15 | @end 16 | 17 | @implementation GKDoubleLikeView 18 | 19 | - (void)createAnimationWithPoint:(CGPoint)point view:(UIView *)view completion:(void (^)(void))completion { 20 | UIImage *image = [UIImage imageNamed:@"likeHeart"]; 21 | UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, ADAPTATIONRATIO * 160.0f, ADAPTATIONRATIO * 160.0f)]; 22 | imgView.image = image; 23 | imgView.contentMode = UIViewContentModeScaleAspectFill; 24 | imgView.center = point; 25 | 26 | // 随机左右显示 27 | int leftOrRight = arc4random() % 2; 28 | leftOrRight = leftOrRight ? leftOrRight : -1; 29 | imgView.transform = CGAffineTransformRotate(imgView.transform, M_PI / 9.0f * leftOrRight); 30 | [view addSubview:imgView]; 31 | 32 | // 出现的时候回弹一下 33 | __block UIImageView *blockImgV = imgView; 34 | __block UIImage *blockImage = image; 35 | 36 | [UIView animateWithDuration:0.1 animations:^{ 37 | blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 1.2f, 1.2f); 38 | } completion:^(BOOL finished) { 39 | blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 0.8f, 0.8f); 40 | 41 | // 向上飘,放大,透明 42 | [self performSelector:@selector(animationToTop:) withObject:@[blockImgV, blockImage] afterDelay:0.3f]; 43 | }]; 44 | } 45 | 46 | - (void)animationToTop:(NSArray *)imgObjects { 47 | if (imgObjects && imgObjects.count > 0) { 48 | __block UIImageView *imgView = (UIImageView *)imgObjects.firstObject; 49 | __block UIImage *image = (UIImage *)imgObjects.lastObject; 50 | [UIView animateWithDuration:1.0f animations:^{ 51 | CGRect imgViewFrame = imgView.frame; 52 | imgViewFrame.origin.y -= 100.0f; 53 | imgView.frame = imgViewFrame; 54 | imgView.transform = CGAffineTransformScale(imgView.transform, 1.8f, 1.8f); 55 | imgView.alpha = 0.0f; 56 | } completion:^(BOOL finished) { 57 | [imgView removeFromSuperview]; 58 | imgView = nil; 59 | image = nil; 60 | !self.completion ?: self.completion(); 61 | }]; 62 | } 63 | } 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKLikeView/GKLikeView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKLikeView.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/27. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKLikeView : UIView 14 | 15 | @property (nonatomic, assign) BOOL isLike; 16 | 17 | @property (nonatomic, copy) void(^likeBlock)(void); 18 | 19 | - (void)startAnimationWithIsLike:(BOOL)isLike; 20 | 21 | - (void)setupLikeState:(BOOL)isLike; 22 | 23 | - (void)setupLikeCount:(NSString *)count; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKLoadingView/GKBallLoadingView.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKBallLoadingView.h 3 | // GKDYVideo 4 | // 5 | // Created by gaokun on 2019/5/7. 6 | // Copyright © 2019 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKBallLoadingView : UIView 14 | 15 | + (instancetype)loadingViewInView:(UIView *)view; 16 | 17 | - (void)startLoadingWithProgress:(CGFloat)progress; 18 | 19 | - (void)startLoading; 20 | - (void)stopLoading; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKNetworking/GKNetworking.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKNetworking.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/24. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, GKNetworkingType) { 14 | GKNetworkingTypeGet, 15 | GKNetworkingTypePost 16 | }; 17 | 18 | @interface GKNetworking : NSObject 19 | 20 | + (void)get:(NSString *)url params:(NSDictionary *)params success:(void(^)(id responseObject))success failure:(void (^)(NSError *error))failure; 21 | 22 | + (void)post:(NSString *)url params:(NSDictionary *)params success:(void(^)(id responseObject))success failure:(void (^)(NSError *error))failure; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKNetworking/GKNetworking.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKNetworking.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/24. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKNetworking.h" 10 | 11 | @implementation GKNetworking 12 | 13 | + (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id _Nonnull))success failure:(void (^)(NSError * _Nonnull))failure { 14 | [self requestWithType:GKNetworkingTypeGet url:url params:params success:success failure:failure]; 15 | } 16 | 17 | + (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id _Nonnull))success failure:(void (^)(NSError * _Nonnull))failure { 18 | [self requestWithType:GKNetworkingTypePost url:url params:params success:success failure:failure]; 19 | } 20 | 21 | + (void)requestWithType:(GKNetworkingType)type url:(NSString *)url params:(NSDictionary *)params success:(void(^)(id responseObject))success failure:(void (^)(NSError *error))failure { 22 | AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 23 | [manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 24 | [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/javascript", @"application/x-javascript", nil]]; 25 | 26 | NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:params]; 27 | dic[@"_client_type"] = @"1"; 28 | dic[@"_client_version"] = @"2.2.4"; 29 | dic[@"_os_version"] = @"12.1"; 30 | dic[@"_phone_imei"] = @"3230B368FC82012CA6C6E6B5CFC829EA|com.baidu.nani"; 31 | dic[@"_phone_newimei"] = @"3230B368FC82012CA6C6E6B5CFC829EA|com.baidu.nani"; 32 | 33 | dic[@"brand"] = @"iPhone"; 34 | dic[@"brand_type"] = @"iPhone 7 Plus"; 35 | dic[@"cuid"] = @"3230B368FC82012CA6C6E6B5CFC829EA|com.baidu.nani"; 36 | dic[@"diuc"] = @"1EA854F6332A764F436C48C069D5102C01A475EB7FHRPHGSJHA"; 37 | dic[@"from"] = @"AppStore"; 38 | dic[@"model"] = @"iPhone 7 Plus"; 39 | dic[@"nani_idfa"] = @"D3993E61-276E-40E2-850A-50308E018015"; 40 | dic[@"subapp_type"] = @"nani"; 41 | // 42 | // dic[@"z_id"] = @"FWUSehM4YgkAAAACVAEAAG8Ba0plAAAQAAAAAAAAAAA8OfwlgbRLLLw6XQUnvgx0Zj0GMglnRRgjOWAYewAyClV3VyNCSQZjA0AUT1MsfCA"; 43 | // dic[@"dl"] = @"B650D852850FD5D326774B621C25ECCE"; 44 | // dic[@"sign"] = @"602DB4C8DF0203B34DBB69B3A1E1F0AC"; 45 | 46 | dic[@"z_id"] = @"QalvgJaNt6mIjT6pGBD1sdxZ2aBNkPoxA9RSgEaHiHWGKC-tA7u-cCgGMAp7iQPZSknfXHa6Whwf6LQGX438_fw"; 47 | // dic[@"tbs"] = @"73254f0d29744cbf1537693822"; 48 | 49 | if (type == GKNetworkingTypeGet) { 50 | [manager GET:url parameters:dic headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 51 | !success ? : success(responseObject); 52 | } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 53 | !failure ? : failure(error); 54 | }]; 55 | }else { 56 | [manager POST:url parameters:dic headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 57 | !success ? : success(responseObject); 58 | } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 59 | !failure ? : success(error); 60 | }]; 61 | } 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKLandscapeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKLandscapeViewController.h 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol GKLandscapeViewControllerDelegate; 14 | 15 | @interface GKLandscapeViewController : UIViewController 16 | 17 | @property (nonatomic, weak, nullable) id delegate; 18 | 19 | @property (nonatomic, assign) BOOL disableAnimations; 20 | 21 | @property (nonatomic, assign) BOOL statusBarHidden; 22 | 23 | @property (nonatomic, assign) UIStatusBarStyle statusBarStyle; 24 | 25 | @property (nonatomic, assign) UIStatusBarAnimation statusBarAnimation; 26 | 27 | @end 28 | 29 | @protocol GKLandscapeViewControllerDelegate 30 | 31 | @optional 32 | - (BOOL)viewControllerShouldAutorotate:(GKLandscapeViewController *)viewController; 33 | - (void)viewController:(GKLandscapeViewController *)viewController viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator; 34 | 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKLandscapeViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKLandscapeViewController.m 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKLandscapeViewController.h" 10 | 11 | @implementation GKLandscapeViewController 12 | 13 | - (instancetype)init { 14 | if (self = [super init]) { 15 | _statusBarStyle = UIStatusBarStyleLightContent; 16 | _statusBarAnimation = UIStatusBarAnimationSlide; 17 | } 18 | return self; 19 | } 20 | 21 | - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { 22 | if ([self.delegate respondsToSelector:@selector(viewController:viewWillTransitionToSize:withTransitionCoordinator:)]) { 23 | [self.delegate viewController:self viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 24 | } 25 | } 26 | 27 | - (UIInterfaceOrientationMask)supportedInterfaceOrientations { 28 | return UIInterfaceOrientationMaskAllButUpsideDown; 29 | } 30 | 31 | - (BOOL)prefersHomeIndicatorAutoHidden { 32 | return YES; 33 | } 34 | 35 | - (UIStatusBarStyle)preferredStatusBarStyle { 36 | return self.statusBarHidden; 37 | } 38 | 39 | - (BOOL)prefersStatusBarHidden { 40 | return self.statusBarStyle; 41 | } 42 | 43 | - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { 44 | return self.statusBarAnimation; 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKLandscapeWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKLandscapeWindow.h 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class GKRotationManager; 14 | 15 | @interface GKLandscapeWindow : UIWindow 16 | 17 | @property (nonatomic, weak, nullable) GKRotationManager *rotationManager; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKLandscapeWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // GKLandscapeWindow.m 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKLandscapeWindow.h" 10 | 11 | @implementation GKLandscapeWindow { 12 | CGRect _old_bounds; 13 | } 14 | 15 | - (instancetype)initWithFrame:(CGRect)frame { 16 | if (self = [super initWithFrame:frame]) { 17 | self.windowLevel = UIWindowLevelStatusBar - 1; 18 | if (@available(iOS 13.0, *)) { 19 | if (self.windowScene == nil) { 20 | self.windowScene = UIApplication.sharedApplication.keyWindow.windowScene; 21 | } 22 | if (self.windowScene == nil) { 23 | self.windowScene = (UIWindowScene *) UIApplication.sharedApplication.connectedScenes.anyObject; 24 | } 25 | } 26 | self.hidden = YES; 27 | } 28 | return self; 29 | } 30 | 31 | #ifdef DEBUG 32 | - (void)dealloc { 33 | NSLog(@"%d \t %s", (int)__LINE__, __func__); 34 | } 35 | #endif 36 | 37 | - (void)setRootViewController:(UIViewController *)rootViewController { 38 | [super setRootViewController:rootViewController]; 39 | rootViewController.view.frame = self.bounds; 40 | rootViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 41 | } 42 | 43 | - (void)setBackgroundColor:(UIColor *)backgroundColor {} 44 | 45 | - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 46 | return YES; 47 | } 48 | 49 | - (void)layoutSubviews { 50 | [super layoutSubviews]; 51 | 52 | // 如果是大屏转大屏 就不需要修改了 53 | if (!CGRectEqualToRect(_old_bounds, self.bounds)) { 54 | _old_bounds = self.bounds; 55 | 56 | UIView *superview = self; 57 | if (@available(iOS 13.0, *)) { 58 | superview = self.subviews.firstObject; 59 | } 60 | 61 | [UIView performWithoutAnimation:^{ 62 | for (UIView *view in superview.subviews) { 63 | if (view != self.rootViewController.view && [view isMemberOfClass:UIView.class]) { 64 | view.backgroundColor = UIColor.clearColor; 65 | for (UIView *subview in view.subviews) { 66 | subview.backgroundColor = UIColor.clearColor; 67 | } 68 | } 69 | } 70 | }]; 71 | } 72 | self.rootViewController.view.frame = self.bounds; 73 | } 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKRotationManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKRotationManager.h 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKLandscapeWindow.h" 10 | #import "GKLandscapeViewController.h" 11 | 12 | typedef NS_OPTIONS(NSUInteger, GKInterfaceOrientationMask) { 13 | GKInterfaceOrientationMaskUnknow = 0, 14 | GKInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait), 15 | GKInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft), 16 | GKInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight), 17 | GKInterfaceOrientationMaskPortraitUpsideDown = ( 1 << UIInterfaceOrientationPortraitUpsideDown), 18 | GKInterfaceOrientationMaskLandscape = (GKInterfaceOrientationMaskLandscapeLeft | GKInterfaceOrientationMaskLandscapeRight), 19 | GKInterfaceOrientationMaskAll = (GKInterfaceOrientationMaskPortrait | GKInterfaceOrientationMaskLandscapeLeft | GKInterfaceOrientationMaskLandscapeRight | GKInterfaceOrientationMaskPortraitUpsideDown), 20 | GKInterfaceOrientationMaskAllButUpsideDown = (GKInterfaceOrientationMaskPortrait | GKInterfaceOrientationMaskLandscapeLeft | GKInterfaceOrientationMaskLandscapeRight) 21 | }; 22 | 23 | NS_ASSUME_NONNULL_BEGIN 24 | 25 | @interface GKRotationManager : NSObject 26 | 27 | + (GKInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window; 28 | + (instancetype)rotationManager; 29 | - (instancetype)init NS_UNAVAILABLE; 30 | - (instancetype)new NS_UNAVAILABLE; 31 | 32 | /// 横屏时的window 33 | @property (nonatomic, strong, nullable) GKLandscapeWindow *window; 34 | 35 | /// 需要旋转的内容视图 36 | @property (nonatomic, weak) UIView *contentView; 37 | 38 | /// 旋转内容原来的父视图 39 | @property (nonatomic, weak) UIView *containerView; 40 | 41 | /// 是否允许自动旋转 42 | @property (nonatomic, assign) BOOL allowOrientationRotation; 43 | 44 | /// 自动旋转支持的方向 45 | @property (nonatomic, assign) GKInterfaceOrientationMask supportInterfaceOrientation; 46 | 47 | /// 当前的方向 48 | @property (nonatomic, assign) UIInterfaceOrientation currentOrientation; 49 | 50 | /// 是否全屏 51 | @property (nonatomic, assign, readonly) BOOL isFullscreen; 52 | 53 | /// 动画时长 54 | @property (nonatomic, assign) NSTimeInterval animationDuration; 55 | 56 | /// 即将旋转回调 57 | @property (nonatomic, copy, nullable) void(^orientationWillChange)(BOOL isFullscreen); 58 | 59 | /// 结束旋转回调 60 | @property (nonatomic, copy, nullable) void(^orientationDidChanged)(BOOL isFullscreen); 61 | 62 | /// 旋转 63 | - (void)rotate; 64 | 65 | /// 旋转到指定方向 66 | - (void)rotateToOrientation:(UIInterfaceOrientation)orientation animated:(BOOL)animated; 67 | 68 | /// 旋转到指定方向 69 | - (void)rotateToOrientation:(UIInterfaceOrientation)orientation animated:(BOOL)animated completion:(void(^ __nullable)(void))completion; 70 | 71 | @end 72 | 73 | @interface GKRotationManager (Internal) 74 | 75 | /// 当前设备方向 76 | @property (nonatomic, assign, readonly) UIInterfaceOrientation currentDeviceOrientation; 77 | 78 | /// 旋转时是否禁止动画 79 | @property (nonatomic, assign) BOOL disableAnimations; 80 | 81 | - (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window; 82 | 83 | - (UIInterfaceOrientation)getCurrentOrientation; 84 | 85 | - (__kindof GKLandscapeViewController *)landscapeViewController; 86 | 87 | - (void)interfaceOrientation:(UIInterfaceOrientation)orientation completion:(void (^ __nullable)(void))completion; 88 | 89 | - (void)handleDeviceOrientationChange; 90 | 91 | - (BOOL)isSupportInterfaceOrientation:(UIInterfaceOrientation)orientation; 92 | 93 | - (void)willChangeOrientation:(UIInterfaceOrientation)orientation; 94 | 95 | - (void)didChangeOrientation:(UIInterfaceOrientation)orientation; 96 | 97 | @end 98 | 99 | NS_ASSUME_NONNULL_END 100 | 101 | #pragma mark - fix safe area 102 | 103 | NS_ASSUME_NONNULL_BEGIN 104 | typedef NS_OPTIONS(NSUInteger, GKSafeAreaInsetsMask) { 105 | GKSafeAreaInsetsMaskNone = 0, 106 | GKSafeAreaInsetsMaskTop = 1 << 0, 107 | GKSafeAreaInsetsMaskLeft = 1 << 1, 108 | GKSafeAreaInsetsMaskBottom = 1 << 2, 109 | GKSafeAreaInsetsMaskRight = 1 << 3, 110 | 111 | GKSafeAreaInsetsMaskHorizontal = GKSafeAreaInsetsMaskLeft | GKSafeAreaInsetsMaskRight, 112 | GKSafeAreaInsetsMaskVertical = GKSafeAreaInsetsMaskTop | GKSafeAreaInsetsMaskBottom, 113 | GKSafeAreaInsetsMaskAll = GKSafeAreaInsetsMaskHorizontal | GKSafeAreaInsetsMaskVertical 114 | }API_DEPRECATED("deprecated!", ios(13.0, 16.0)); 115 | 116 | API_DEPRECATED("deprecated!", ios(13.0, 16.0)) @interface UIViewController (GKRotationSafeAreaFixing) 117 | /// 禁止调整哪些方向的安全区域 118 | @property (nonatomic) GKSafeAreaInsetsMask disabledAdjustSafeAreaInsetsMask; 119 | @end 120 | 121 | NS_ASSUME_NONNULL_END 122 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKRotationManager_iOS_16_Later.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKRotationManager_iOS_16_Later.h 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKRotationManager.h" 10 | 11 | API_AVAILABLE(ios(16.0)) NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GKRotationManager_iOS_16_Later : GKRotationManager 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKRotationManager/GKRotationManager_iOS_9_15.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKRotationManager_iOS_9_15.h 3 | // Example 4 | // 5 | // Created by QuintGao on 2023/3/31. 6 | // Copyright © 2023 QuintGao. All rights reserved. 7 | // 8 | 9 | #import "GKRotationManager.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | API_DEPRECATED("deprecated!", ios(9.0, 16.0)) @interface GKRotationManager_iOS_9_15 : GKRotationManager 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKScaleTransition/GKScaleAnimation.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKScaleAnimation.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/9/12. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, GKScaleType) { 14 | GKScaleType_Present, 15 | GKScaleType_Dismiss 16 | }; 17 | 18 | @class GKScaleTransition; 19 | 20 | @interface GKScaleAnimation : NSObject 21 | 22 | - (instancetype)initWithType:(GKScaleType)type transition:(GKScaleTransition *)transition; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /GKDYVideo/Classes/Tools/GKScaleTransition/GKScaleTransition.h: -------------------------------------------------------------------------------- 1 | // 2 | // GKScaleTransition.h 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2024/9/12. 6 | // Copyright © 2024 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol GKScaleTransitionDelegate 14 | 15 | @optional 16 | 17 | /// 来源视图,用于显示及恢复 18 | @property (nonatomic, weak, nullable) UIView *sourceView; 19 | 20 | /// 横向滑动的scrollView,解决滑动冲突 21 | @property (nonatomic, weak, nullable) UIScrollView *horizontalScrollView; 22 | 23 | /// 滑动开始 24 | - (void)transitionPanBegan; 25 | 26 | /// 滑动改变 27 | - (void)transitionPanChange; 28 | 29 | /// 滑动结束 30 | - (void)transitionPanEnded:(BOOL)isDismiss; 31 | 32 | @end 33 | 34 | @interface GKScaleTransition : UIPercentDrivenInteractiveTransition 35 | 36 | @property (nonatomic, weak) id delegate; 37 | 38 | + (void)connectToViewController:(UIViewController *)viewController; 39 | - (void)connectToViewController:(UIViewController *)viewController; 40 | 41 | - (void)dismiss; 42 | 43 | @end 44 | 45 | NS_ASSUME_NONNULL_END 46 | -------------------------------------------------------------------------------- /GKDYVideo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | NSPhotoLibraryAddUsageDescription 29 | 保存图片 30 | NSPhotoLibraryUsageDescription 31 | 访问 32 | UILaunchStoryboardName 33 | LaunchScreen 34 | UIRequiredDeviceCapabilities 35 | 36 | armv7 37 | 38 | UIStatusBarHidden 39 | 40 | UISupportedInterfaceOrientations 41 | 42 | UIInterfaceOrientationPortrait 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /GKDYVideo/PrefixHeader.pch: -------------------------------------------------------------------------------- 1 | // 2 | // PrefixHeader.pch 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #ifndef PrefixHeader_pch 10 | #define PrefixHeader_pch 11 | 12 | #import 13 | #import 14 | #import 15 | #import 16 | #import 17 | #import 18 | #import "GKDYTools.h" 19 | 20 | #pragma mark - UI 21 | // 屏幕宽高 22 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 23 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 24 | 25 | // 适配比例 26 | #define ADAPTATIONRATIO SCREEN_WIDTH / 750.0f 27 | 28 | // 导航栏高度与tabbar高度 29 | #define NAVBAR_HEIGHT (IS_iPhoneX ? 88.0f : 64.0f) 30 | #define TABBAR_HEIGHT (IS_iPhoneX ? 83.0f : 49.0f) 31 | 32 | // 状态栏高度 33 | #define STATUSBAR_HEIGHT (IS_iPhoneX ? 44.0f : 20.0f) 34 | 35 | // 安全区域(不包含状态栏) 36 | #define SAFE_TOP (IS_iPhoneX ? 24.0f : 0.0f) 37 | #define SAFE_BTM (IS_iPhoneX ? 34.0f : 0.0f) 38 | 39 | // 判断是否是iPhone X系列 40 | #define IS_iPhoneX GK_NOTCHED_SCREEN 41 | 42 | // 颜色 43 | #define GKColorRGBA(r, g, b, a) [UIColor colorWithRed:(r / 255.0) green:(g / 255.0) blue:(b / 255.0) alpha:a] 44 | #define GKColorRGB(r, g, b) GKColorRGBA(r, g, b, 1.0) 45 | #define GKColorGray(v) GKColorRGB(v, v, v) 46 | 47 | #define GKColorHEX(hexValue, a) GKColorRGBA(((float)((hexValue & 0xFF0000) >> 16)), ((float)((hexValue & 0xFF00) >> 8)), ((float)(hexValue & 0xFF)), a) 48 | 49 | #define GKColorRandom GKColorRGB(arc4random() % 255, arc4random() % 255, arc4random() % 255) 50 | 51 | #define HEXCOLOR(hexValue,a) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:a] 52 | 53 | // 来自YYKit 54 | #ifndef weakify 55 | #if DEBUG 56 | #if __has_feature(objc_arc) 57 | #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; 58 | #else 59 | #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; 60 | #endif 61 | #else 62 | #if __has_feature(objc_arc) 63 | #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; 64 | #else 65 | #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; 66 | #endif 67 | #endif 68 | #endif 69 | 70 | #ifndef strongify 71 | #if DEBUG 72 | #if __has_feature(objc_arc) 73 | #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; 74 | #else 75 | #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; 76 | #endif 77 | #else 78 | #if __has_feature(objc_arc) 79 | #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; 80 | #else 81 | #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; 82 | #endif 83 | #endif 84 | #endif 85 | 86 | #endif /* PrefixHeader_pch */ 87 | -------------------------------------------------------------------------------- /GKDYVideo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // GKDYVideo 4 | // 5 | // Created by QuintGao on 2018/9/23. 6 | // Copyright © 2018 QuintGao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 QuintGao 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 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | 3 | platform :ios, '11.0' 4 | 5 | target 'GKDYVideo' do 6 | use_frameworks! 7 | 8 | pod 'AFNetworking' 9 | pod 'SDWebImage' 10 | pod 'SDWebImageWebPCoder' 11 | pod 'Masonry' 12 | pod 'YYModel' 13 | pod 'GKNavigationBar' 14 | pod 'GKVideoScrollView' 15 | pod 'GKPageSmoothView' 16 | pod 'GKSliderView' 17 | pod 'GKPopupController' 18 | pod 'MJRefresh' 19 | pod 'JXCategoryView' 20 | pod 'ZFPlayer/AVPlayer' 21 | 22 | # 需要认证,不能免费使用了 23 | # pod 'TXLiteAVSDK_Player' # 腾讯云播放器-独立播放器 24 | 25 | end 26 | 27 | post_install do |installer| 28 | # 消除版本警告 29 | installer.pods_project.targets.each do |target| 30 | target.build_configurations.each do |config| 31 | if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 11.0 32 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' 33 | end 34 | end 35 | end 36 | 37 | installer.pods_project.targets.each do |target| 38 | target.build_configurations.each do |config| 39 | excluded_archs = config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] 40 | excluded_archs = excluded_archs.nil? ? '' : excluded_archs 41 | if !excluded_archs.include?('arm64') 42 | excluded_archs = "#{excluded_archs} arm64" 43 | end 44 | config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = excluded_archs 45 | end 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GKDYVideo 2 | iOS仿抖音短视频 3 | 4 | ## 更新 5 | 6 | ### 2023-05-11 7 | * 1、支持横屏后可以上下滑动切换视频 8 | * 2、支持手势放大缩小后清屏显示 9 | * 3、双击和单击手势点击优化,解决冲突问题 10 | 11 | ### 2023-03-30: 12 | * 1、移除腾讯云播放器,使用[ZFPlayer](https://github.com/renzifeng/ZFPlayer)(腾讯云播放器需要认证,不能免费使用了) 13 | * 2、上下滑动切换修改为我新封装的一个库[GKVideoScrollView](https://github.com/QuintGao/GKVideoScrollView) 14 | * 3、视频数据修改为[好看视频](https://haokan.baidu.com/) 网页端数据,仅供学习使用,请勿用作商业用途 15 | * 4、个人详情页优化,手势缩放动画优化 16 | * 5、支持全屏观看视频 17 | 18 | ## 效果图 19 | ![抖音-列表](https://upload-images.jianshu.io/upload_images/1598505-1a3cacbdf910797a.gif?imageMogr2/auto-orient/strip) 20 | 21 | ![抖音-带tabbar](https://upload-images.jianshu.io/upload_images/1598505-483a4e77d398f52b.gif?imageMogr2/auto-orient/strip) 22 | 23 | ![抖音-评论](https://upload-images.jianshu.io/upload_images/1598505-4e4ee5d8221a59a6.gif?imageMogr2/auto-orient/strip) 24 | 25 | ![抖音-动画](https://upload-images.jianshu.io/upload_images/1598505-3a101f2e25fa2005.gif?imageMogr2/auto-orient/strip) 26 | 27 | ![抖音-数据加载](https://upload-images.jianshu.io/upload_images/1598505-4ac8d3255e199ff5.gif?imageMogr2/auto-orient/strip) 28 | 29 | ![抖音-视频加载](https://upload-images.jianshu.io/upload_images/1598505-7214296ddc1aa923.gif?imageMogr2/auto-orient/strip) 30 | 31 | ![抖音-红心点赞](https://upload-images.jianshu.io/upload_images/1598505-b89f26ae20c357c0.gif?imageMogr2/auto-orient/strip) 32 | 33 | ![抖音-双击点赞](https://upload-images.jianshu.io/upload_images/1598505-ff4845163a16e9c9.gif?imageMogr2/auto-orient/strip) 34 | 35 | ## 说明 36 | 37 | [iOS仿抖音—左右滑动切换效果](https://www.jianshu.com/p/9c3670e4a533) 38 | 39 | [iOS仿抖音—上下滑动播放视频](https://www.jianshu.com/p/36a4e57f1a53) 40 | 41 | [iOS仿抖音—评论视图滑动消失](https://www.jianshu.com/p/8a1f174a91e5) 42 | 43 | [iOS仿抖音—加载、点赞动画效果](https://www.jianshu.com/p/a5f08098efb0) 44 | 45 | ## 作者 46 | 47 | - QQ: [1094887059](http://wpa.qq.com/msgrd?v=3&uin=1094887059&site=qq&menu=yes) 48 | - QQ群:[1047100313](https://qm.qq.com/cgi-bin/qm/qr?k=Aj_f4C5-R3X1_KEdeb_Ttg8pxK_41ZJu&jump_from=webapi) 49 | 50 | - [简书](https://www.jianshu.com/u/ba61bbfc87e8) 51 | 52 | - 支持作者 53 | 54 | 55 |              56 | 57 | 58 | [回到顶部](#readme) --------------------------------------------------------------------------------