├── .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 | 
20 |
21 | 
22 |
23 | 
24 |
25 | 
26 |
27 | 
28 |
29 | 
30 |
31 | 
32 |
33 | 
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)
--------------------------------------------------------------------------------