├── .gitignore ├── DYTV.podspec ├── DYTV ├── DYTV.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata ├── DYTV.xcworkspace │ └── contents.xcworkspacedata ├── DYTV │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── AppIcon29x29@2x.png │ │ │ ├── AppIcon40x40@2x.png │ │ │ ├── AppIcon57x57.png │ │ │ ├── AppIcon57x57@2x.png │ │ │ ├── AppIcon60x60@2x.png │ │ │ ├── AppIcon60x60@3x.png │ │ │ └── Contents.json │ │ ├── Brand Assets.launchimage │ │ │ ├── Contents.json │ │ │ ├── LaunchImage-568h@2x.png │ │ │ ├── LaunchImage-700@2x.png │ │ │ ├── LaunchImage-800-667h@2x.png │ │ │ └── LaunchImage-800-Portrait-736h@3x.png │ │ ├── Contents.json │ │ ├── Home │ │ │ ├── CollectionView │ │ │ │ ├── Contents.json │ │ │ │ ├── Image_online.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Image_online@2x.png │ │ │ │ │ └── Image_online@3x.png │ │ │ │ ├── Img_default.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Img_default@2x.png │ │ │ │ ├── home_header_hot.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── home_header_hot@2x.png │ │ │ │ │ └── home_header_hot@3x.png │ │ │ │ ├── home_header_normal.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── home_header_normal@2x.png │ │ │ │ │ └── home_header_normal@3x.png │ │ │ │ ├── home_header_phone.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── home_header_phone@2x.png │ │ │ │ │ └── home_header_phone@3x.png │ │ │ │ ├── home_live_cate_normal.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── home_live_cate_normal@2x.png │ │ │ │ │ └── home_live_cate_normal@3x.png │ │ │ │ ├── home_more_btn.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── home_more_btn@2x.png │ │ │ │ │ └── home_more_btn@3x.png │ │ │ │ ├── ico_location.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── ico_location@2x.png │ │ │ │ │ └── ico_location@3x.png │ │ │ │ └── live_cell_default_phone.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── live_cell_default_phone@2x.png │ │ │ ├── Contents.json │ │ │ ├── Game │ │ │ │ ├── Contents.json │ │ │ │ └── Img_orange.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Img_orange@2x.png │ │ │ │ │ └── Img_orange@3x.png │ │ │ └── NavigationBar │ │ │ │ ├── Contents.json │ │ │ │ ├── Image_my_history_click.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Image_my_history_click@2x.png │ │ │ │ └── Image_my_history_click@3x.png │ │ │ │ ├── Image_scan.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Image_scan@2x.png │ │ │ │ └── Image_scan@3x.png │ │ │ │ ├── Image_scan_click.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Image_scan_click@2x.png │ │ │ │ └── Image_scan_click@3x.png │ │ │ │ ├── btn_search.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── btn_search@2x.png │ │ │ │ └── btn_search@3x.png │ │ │ │ ├── btn_search_clicked.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── btn_search_clicked@2x.png │ │ │ │ └── btn_search_clicked@3x.png │ │ │ │ ├── image_my_history.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image_my_history@2x.png │ │ │ │ └── image_my_history@3x.png │ │ │ │ └── logo.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── logo@2x.png │ │ │ │ └── logo@3x.png │ │ └── Tabbar │ │ │ ├── Contents.json │ │ │ ├── btn_column_normal.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_column_normal@2x.png │ │ │ └── btn_column_normal@3x.png │ │ │ ├── btn_column_selected.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_column_selected@2x.png │ │ │ └── btn_column_selected@3x.png │ │ │ ├── btn_home_normal.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_home_normal@2x.png │ │ │ └── btn_home_normal@3x.png │ │ │ ├── btn_home_selected.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_home_selected@2x.png │ │ │ └── btn_home_selected@3x.png │ │ │ ├── btn_live_normal.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_live_normal@2x.png │ │ │ └── btn_live_normal@3x.png │ │ │ ├── btn_live_selected.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_live_selected@2x.png │ │ │ └── btn_live_selected@3x.png │ │ │ ├── btn_user_normal.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_user_normal@2x.png │ │ │ └── btn_user_normal@3x.png │ │ │ └── btn_user_selected.imageset │ │ │ ├── Contents.json │ │ │ ├── btn_user_selected@2x.png │ │ │ └── btn_user_selected@3x.png │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Classes │ │ ├── Fellow │ │ │ └── Controller │ │ │ │ ├── Fellow.storyboard │ │ │ │ └── FellowViewController.swift │ │ ├── Home │ │ │ ├── Controller │ │ │ │ ├── AmuseViewController.swift │ │ │ │ ├── FunnyViewController.swift │ │ │ │ ├── GameViewController.swift │ │ │ │ ├── Home.storyboard │ │ │ │ ├── HomeViewController.swift │ │ │ │ └── RecommendViewController.swift │ │ │ ├── Model │ │ │ │ ├── CycleModel.swift │ │ │ │ └── GameModel.swift │ │ │ ├── View │ │ │ │ ├── AmuseMenuView.swift │ │ │ │ ├── AmuseMenuView.xib │ │ │ │ ├── AmuseMenuViewCell.swift │ │ │ │ ├── AmuseMenuViewCell.xib │ │ │ │ ├── CollectionHeaderView.swift │ │ │ │ ├── CollectionHeaderView.xib │ │ │ │ ├── CollectionViewCycleCell.swift │ │ │ │ ├── CollectionViewCycleCell.xib │ │ │ │ ├── CollectionViewGameCell.swift │ │ │ │ ├── CollectionViewGameCell.xib │ │ │ │ ├── RecommendCycleView.swift │ │ │ │ ├── RecommendCycleView.xib │ │ │ │ ├── RecommendGameView.swift │ │ │ │ └── RecommendGameView.xib │ │ │ └── ViewModel │ │ │ │ ├── AmuseViewModel.swift │ │ │ │ ├── GameViewModel.swift │ │ │ │ └── RecommendViewModel.swift │ │ ├── Live │ │ │ └── Controller │ │ │ │ ├── Live.storyboard │ │ │ │ └── LiveViewController.swift │ │ ├── Main │ │ │ ├── Controller │ │ │ │ ├── BaseAnchorViewController.swift │ │ │ │ ├── BaseViewController.swift │ │ │ │ ├── CustomNavigationViewController.swift │ │ │ │ ├── Main.storyboard │ │ │ │ └── MainViewController.swift │ │ │ ├── Model │ │ │ │ ├── AnchorGroup.swift │ │ │ │ ├── AnchorModel.swift │ │ │ │ └── BaseGameModel.swift │ │ │ ├── View │ │ │ │ ├── CollectionBaseCell.swift │ │ │ │ ├── CollectionViewNormalCell.swift │ │ │ │ ├── CollectionViewNormalCell.xib │ │ │ │ ├── CollectionViewPrettyCell.swift │ │ │ │ ├── CollectionViewPrettyCell.xib │ │ │ │ ├── PageContentView.swift │ │ │ │ └── PageTitleView.swift │ │ │ └── ViewModel │ │ │ │ └── BaseViewModel.swift │ │ ├── Profile │ │ │ └── Controller │ │ │ │ ├── Profile.storyboard │ │ │ │ └── ProfileViewController.swift │ │ ├── Room │ │ │ └── Controller │ │ │ │ ├── RoomNormalViewController.swift │ │ │ │ └── RoomShowViewController.swift │ │ └── Tools │ │ │ ├── Common.swift │ │ │ ├── Extensions │ │ │ ├── NSDate+Extension.swift │ │ │ ├── UIBarButtonItem+Extension.swift │ │ │ └── UIColor+Extension.swift │ │ │ └── NetworkTools.swift │ └── Info.plist ├── Podfile ├── Podfile.lock └── Pods │ ├── Alamofire │ ├── LICENSE │ ├── README.md │ └── Source │ │ ├── AFError.swift │ │ ├── Alamofire.swift │ │ ├── DispatchQueue+Alamofire.swift │ │ ├── MultipartFormData.swift │ │ ├── NetworkReachabilityManager.swift │ │ ├── Notifications.swift │ │ ├── ParameterEncoding.swift │ │ ├── Request.swift │ │ ├── Response.swift │ │ ├── ResponseSerialization.swift │ │ ├── Result.swift │ │ ├── ServerTrustPolicy.swift │ │ ├── SessionDelegate.swift │ │ ├── SessionManager.swift │ │ ├── TaskDelegate.swift │ │ ├── Timeline.swift │ │ └── Validation.swift │ ├── Kingfisher │ ├── LICENSE │ ├── README.md │ └── Sources │ │ ├── AnimatedImageView.swift │ │ ├── Box.swift │ │ ├── CacheSerializer.swift │ │ ├── Filter.swift │ │ ├── Image.swift │ │ ├── ImageCache.swift │ │ ├── ImageDownloader.swift │ │ ├── ImagePrefetcher.swift │ │ ├── ImageProcessor.swift │ │ ├── ImageTransition.swift │ │ ├── ImageView+Kingfisher.swift │ │ ├── Indicator.swift │ │ ├── Kingfisher.h │ │ ├── Kingfisher.swift │ │ ├── KingfisherManager.swift │ │ ├── KingfisherOptionsInfo.swift │ │ ├── RequrstModifier.swift │ │ ├── Resource.swift │ │ ├── String+MD5.swift │ │ ├── ThreadHelper.swift │ │ └── UIButton+Kingfisher.swift │ ├── Manifest.lock │ ├── Pods.xcodeproj │ └── project.pbxproj │ └── Target Support Files │ ├── Alamofire │ ├── Alamofire-dummy.m │ ├── Alamofire-prefix.pch │ ├── Alamofire-umbrella.h │ ├── Alamofire.modulemap │ ├── Alamofire.xcconfig │ └── Info.plist │ ├── Kingfisher │ ├── Info.plist │ ├── Kingfisher-dummy.m │ ├── Kingfisher-prefix.pch │ ├── Kingfisher-umbrella.h │ ├── Kingfisher.modulemap │ └── Kingfisher.xcconfig │ └── Pods-DYTV │ ├── Info.plist │ ├── Pods-DYTV-acknowledgements.markdown │ ├── Pods-DYTV-acknowledgements.plist │ ├── Pods-DYTV-dummy.m │ ├── Pods-DYTV-frameworks.sh │ ├── Pods-DYTV-resources.sh │ ├── Pods-DYTV-umbrella.h │ ├── Pods-DYTV.debug.xcconfig │ ├── Pods-DYTV.modulemap │ └── Pods-DYTV.release.xcconfig ├── LICENSE ├── README.md └── photos ├── 1-1.png ├── 1-2.png ├── 1-3.png ├── 1-4.png ├── 1-5.png ├── 2-1.png ├── 2-2.png ├── 2-3.png └── 2-4.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | -------------------------------------------------------------------------------- /DYTV.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "DYTV" 4 | s.version = "1.00" 5 | s.summary = "A application for DYTV of ios." 6 | 7 | s.homepage = "https://github.com/coderLL/DYTV" 8 | s.screenshots = "http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E6%96%97%E9%B1%BCtvlogo&step_word=&hs=0&pn=0&spn=0&di=105228818310&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=3832303527%2C2485660051&os=2618432825%2C1948976708&simid=0%2C0&adpicid=0&ln=1420&fr=&fmq=1476189294519_R&fm=result&ic=0&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fhubei.sinaimg.cn%2F2016%2F0128%2FU8155P1190DT20160128105635.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fik_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3Fijz75AzdH3Ffiwg2x7gAzdH3Fda8m-a8-dbAzdH3F8ac0d9mm8d_z%26e3Bip4s&gsm=0&rpstart=0&rpnum=0" 9 | 10 | s.license = { :type => "MIT", :file => "LICENSE" } 11 | 12 | s.authors = { "coderLL" => "897323459@qq.com" } 13 | 14 | s.ios.deployment_target = "9.0" 15 | 16 | s.source = { :git => "https://github.com/coderLL/DYTV.git", :tag => s.version } 17 | 18 | s.source_files = "DYTV/DYTV/*" 19 | 20 | s.requires_arc = true 21 | 22 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3.0' } 23 | 24 | end -------------------------------------------------------------------------------- /DYTV/DYTV.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DYTV/DYTV.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /DYTV/DYTV/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | // 设置tabbar选中的主题颜色 18 | UITabBar.appearance().tintColor = UIColor.orange; 19 | return true 20 | } 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon57x57.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon57x57@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "size" : "29x29", 20 | "idiom" : "iphone", 21 | "filename" : "AppIcon29x29@2x.png", 22 | "scale" : "2x" 23 | }, 24 | { 25 | "idiom" : "iphone", 26 | "size" : "29x29", 27 | "scale" : "3x" 28 | }, 29 | { 30 | "size" : "40x40", 31 | "idiom" : "iphone", 32 | "filename" : "AppIcon40x40@2x.png", 33 | "scale" : "2x" 34 | }, 35 | { 36 | "idiom" : "iphone", 37 | "size" : "40x40", 38 | "scale" : "3x" 39 | }, 40 | { 41 | "size" : "57x57", 42 | "idiom" : "iphone", 43 | "filename" : "AppIcon57x57.png", 44 | "scale" : "1x" 45 | }, 46 | { 47 | "size" : "57x57", 48 | "idiom" : "iphone", 49 | "filename" : "AppIcon57x57@2x.png", 50 | "scale" : "2x" 51 | }, 52 | { 53 | "size" : "60x60", 54 | "idiom" : "iphone", 55 | "filename" : "AppIcon60x60@2x.png", 56 | "scale" : "2x" 57 | }, 58 | { 59 | "size" : "60x60", 60 | "idiom" : "iphone", 61 | "filename" : "AppIcon60x60@3x.png", 62 | "scale" : "3x" 63 | }, 64 | { 65 | "idiom" : "ipad", 66 | "size" : "29x29", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "idiom" : "ipad", 71 | "size" : "29x29", 72 | "scale" : "2x" 73 | }, 74 | { 75 | "size" : "24x24", 76 | "idiom" : "watch", 77 | "scale" : "2x", 78 | "role" : "notificationCenter", 79 | "subtype" : "38mm" 80 | }, 81 | { 82 | "size" : "27.5x27.5", 83 | "idiom" : "watch", 84 | "scale" : "2x", 85 | "role" : "notificationCenter", 86 | "subtype" : "42mm" 87 | }, 88 | { 89 | "size" : "29x29", 90 | "idiom" : "watch", 91 | "role" : "companionSettings", 92 | "scale" : "2x" 93 | }, 94 | { 95 | "size" : "29x29", 96 | "idiom" : "watch", 97 | "role" : "companionSettings", 98 | "scale" : "3x" 99 | }, 100 | { 101 | "size" : "40x40", 102 | "idiom" : "watch", 103 | "scale" : "2x", 104 | "role" : "appLauncher", 105 | "subtype" : "38mm" 106 | }, 107 | { 108 | "size" : "86x86", 109 | "idiom" : "watch", 110 | "scale" : "2x", 111 | "role" : "quickLook", 112 | "subtype" : "38mm" 113 | }, 114 | { 115 | "size" : "98x98", 116 | "idiom" : "watch", 117 | "scale" : "2x", 118 | "role" : "quickLook", 119 | "subtype" : "42mm" 120 | } 121 | ], 122 | "info" : { 123 | "version" : 1, 124 | "author" : "xcode" 125 | } 126 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "736h", 7 | "filename" : "LaunchImage-800-Portrait-736h@3x.png", 8 | "minimum-system-version" : "8.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "extent" : "full-screen", 14 | "idiom" : "iphone", 15 | "subtype" : "667h", 16 | "filename" : "LaunchImage-800-667h@2x.png", 17 | "minimum-system-version" : "8.0", 18 | "orientation" : "portrait", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "orientation" : "portrait", 23 | "idiom" : "iphone", 24 | "filename" : "LaunchImage-700@2x.png", 25 | "extent" : "full-screen", 26 | "minimum-system-version" : "7.0", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "extent" : "full-screen", 31 | "idiom" : "iphone", 32 | "subtype" : "retina4", 33 | "filename" : "LaunchImage-568h@2x.png", 34 | "minimum-system-version" : "7.0", 35 | "orientation" : "portrait", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "orientation" : "portrait", 40 | "idiom" : "iphone", 41 | "extent" : "full-screen", 42 | "subtype" : "retina4", 43 | "scale" : "2x" 44 | } 45 | ], 46 | "info" : { 47 | "version" : 1, 48 | "author" : "xcode" 49 | } 50 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-568h@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-700@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-700@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-800-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-800-667h@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-800-Portrait-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Brand Assets.launchimage/LaunchImage-800-Portrait-736h@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Image_online.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Image_online@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "Image_online@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Image_online.imageset/Image_online@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/Image_online.imageset/Image_online@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Image_online.imageset/Image_online@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/Image_online.imageset/Image_online@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Img_default.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Img_default@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/Img_default.imageset/Img_default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/Img_default.imageset/Img_default@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_hot.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "home_header_hot@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "home_header_hot@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_hot.imageset/home_header_hot@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_hot.imageset/home_header_hot@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_hot.imageset/home_header_hot@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_hot.imageset/home_header_hot@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "home_header_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "home_header_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_normal.imageset/home_header_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_normal.imageset/home_header_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_normal.imageset/home_header_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_normal.imageset/home_header_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_phone.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "home_header_phone@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "home_header_phone@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_phone.imageset/home_header_phone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_phone.imageset/home_header_phone@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_phone.imageset/home_header_phone@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_header_phone.imageset/home_header_phone@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_live_cate_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "home_live_cate_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "home_live_cate_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_live_cate_normal.imageset/home_live_cate_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_live_cate_normal.imageset/home_live_cate_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_live_cate_normal.imageset/home_live_cate_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_live_cate_normal.imageset/home_live_cate_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_more_btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "home_more_btn@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "home_more_btn@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_more_btn.imageset/home_more_btn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_more_btn.imageset/home_more_btn@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_more_btn.imageset/home_more_btn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/home_more_btn.imageset/home_more_btn@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/ico_location.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ico_location@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ico_location@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/ico_location.imageset/ico_location@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/ico_location.imageset/ico_location@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/ico_location.imageset/ico_location@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/ico_location.imageset/ico_location@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/live_cell_default_phone.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "live_cell_default_phone@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/CollectionView/live_cell_default_phone.imageset/live_cell_default_phone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/CollectionView/live_cell_default_phone.imageset/live_cell_default_phone@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/Game/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/Game/Img_orange.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Img_orange@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "Img_orange@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/Game/Img_orange.imageset/Img_orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/Game/Img_orange.imageset/Img_orange@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/Game/Img_orange.imageset/Img_orange@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/Game/Img_orange.imageset/Img_orange@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_my_history_click.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Image_my_history_click@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "Image_my_history_click@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_my_history_click.imageset/Image_my_history_click@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_my_history_click.imageset/Image_my_history_click@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_my_history_click.imageset/Image_my_history_click@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_my_history_click.imageset/Image_my_history_click@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Image_scan@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "Image_scan@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan.imageset/Image_scan@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan.imageset/Image_scan@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan.imageset/Image_scan@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan.imageset/Image_scan@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan_click.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Image_scan_click@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "Image_scan_click@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan_click.imageset/Image_scan_click@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan_click.imageset/Image_scan_click@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan_click.imageset/Image_scan_click@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/Image_scan_click.imageset/Image_scan_click@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_search@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_search@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search.imageset/btn_search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search.imageset/btn_search@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search.imageset/btn_search@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search.imageset/btn_search@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search_clicked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_search_clicked@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_search_clicked@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search_clicked.imageset/btn_search_clicked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search_clicked.imageset/btn_search_clicked@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search_clicked.imageset/btn_search_clicked@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/btn_search_clicked.imageset/btn_search_clicked@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/image_my_history.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "image_my_history@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "image_my_history@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/image_my_history.imageset/image_my_history@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/image_my_history.imageset/image_my_history@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/image_my_history.imageset/image_my_history@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/image_my_history.imageset/image_my_history@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "logo@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "logo@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/logo.imageset/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/logo.imageset/logo@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Home/NavigationBar/logo.imageset/logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Home/NavigationBar/logo.imageset/logo@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_column_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_column_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_normal.imageset/btn_column_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_normal.imageset/btn_column_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_normal.imageset/btn_column_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_normal.imageset/btn_column_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_column_selected@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_column_selected@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_selected.imageset/btn_column_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_selected.imageset/btn_column_selected@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_selected.imageset/btn_column_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_column_selected.imageset/btn_column_selected@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_home_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_home_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_normal.imageset/btn_home_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_normal.imageset/btn_home_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_normal.imageset/btn_home_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_normal.imageset/btn_home_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_home_selected@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_home_selected@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_selected.imageset/btn_home_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_selected.imageset/btn_home_selected@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_selected.imageset/btn_home_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_home_selected.imageset/btn_home_selected@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_live_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_live_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_normal.imageset/btn_live_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_normal.imageset/btn_live_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_normal.imageset/btn_live_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_normal.imageset/btn_live_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_live_selected@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_live_selected@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_selected.imageset/btn_live_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_selected.imageset/btn_live_selected@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_selected.imageset/btn_live_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_live_selected.imageset/btn_live_selected@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_normal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_user_normal@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_user_normal@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_normal.imageset/btn_user_normal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_normal.imageset/btn_user_normal@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_normal.imageset/btn_user_normal@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_normal.imageset/btn_user_normal@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "btn_user_selected@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "btn_user_selected@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_selected.imageset/btn_user_selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_selected.imageset/btn_user_selected@2x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_selected.imageset/btn_user_selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/DYTV/DYTV/Assets.xcassets/Tabbar/btn_user_selected.imageset/btn_user_selected@3x.png -------------------------------------------------------------------------------- /DYTV/DYTV/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Fellow/Controller/Fellow.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Fellow/Controller/FellowViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FellowViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class FellowViewController: UIViewController { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/AmuseViewController.swift: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // AmuseViewController.swift 4 | // DYTV 5 | // 6 | // Created by CodeLL on 2016/10/13. 7 | // Copyright © 2016年 coderLL. All rights reserved. 8 | // 9 | 10 | import UIKit 11 | 12 | // MARK:- 常量定义 13 | private let kMenuViewH : CGFloat = 200 14 | 15 | class AmuseViewController: BaseAnchorViewController { 16 | 17 | // MARK: 懒加载属性 18 | fileprivate lazy var amuseVM : AmuseViewModel = AmuseViewModel() 19 | fileprivate lazy var menuView : AmuseMenuView = { 20 | let menuView = AmuseMenuView.amuseMenuView() 21 | menuView.frame = CGRect(x: 0, y: -kMenuViewH, width: kScreenW, height: kMenuViewH) 22 | return menuView 23 | }() 24 | } 25 | 26 | // MARK:- 设置UI界面 27 | extension AmuseViewController { 28 | override func setupUI() { 29 | super.setupUI() 30 | 31 | // 将菜单的View添加到collectionView中 32 | collectionView.addSubview(menuView) 33 | collectionView.contentInset = UIEdgeInsets(top: kMenuViewH, left: 0, bottom: 0, right: 0) 34 | } 35 | } 36 | 37 | // MARK:- 请求数据 38 | extension AmuseViewController { 39 | 40 | // MARK:- 请求数据 41 | override func loadData() { 42 | // 1.给父类中ViewModel进行赋值 43 | self.baseVM = self.amuseVM 44 | 45 | self.amuseVM.loadAmuseData { 46 | // 1.刷新表格数据 47 | self.collectionView.reloadData() 48 | 49 | // 2.给菜单栏传递显示数据 50 | var tempGroups = self.amuseVM.anchorGroups 51 | tempGroups.removeFirst() 52 | self.menuView.groups = tempGroups 53 | 54 | // 3.数据请求完成 55 | self.loadDataFinished() 56 | } 57 | } 58 | } 59 | 60 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/FunnyViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunnyViewController.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 常量定义 12 | private let kTopMargin : CGFloat = 10 13 | 14 | class FunnyViewController : BaseAnchorViewController { 15 | // MARK: 懒加载属性 16 | fileprivate lazy var amuseVM : AmuseViewModel = AmuseViewModel() 17 | } 18 | 19 | // MARK:- 设置UI布局 20 | extension FunnyViewController { 21 | override func setupUI() { 22 | super.setupUI() 23 | 24 | // 1.设置头部的size为0 25 | let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 26 | layout.headerReferenceSize = CGSize.zero 27 | 28 | // 2.设置inset内边距 29 | self.collectionView.contentInset = UIEdgeInsets(top:kTopMargin, left: 0, bottom: 0, right: 0) 30 | } 31 | } 32 | 33 | // MARK:- 请求数据 34 | extension FunnyViewController { 35 | 36 | override func loadData() { 37 | // 1.给父类中ViewModel进行赋值 38 | self.baseVM = amuseVM 39 | 40 | self.amuseVM.loadFunnyData(method: .get, URLString: "http://capi.douyucdn.cn/api/v1/getColumnRoom/3") { 41 | // 2.1刷新表格数据 42 | self.collectionView.reloadData() 43 | 44 | // 2.2数据请求完成 45 | self.loadDataFinished() 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/GameViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/12. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 常量定义 12 | private let kEdgeMargin : CGFloat = 10 13 | private let kItemW : CGFloat = (kScreenW - 2 * kEdgeMargin) / 3 14 | private let kItemH : CGFloat = kItemW * 6 / 5 15 | private let kGameViewH : CGFloat = 90 16 | 17 | private let kGameCellID = "kGameCellID" 18 | 19 | class GameViewController: BaseViewController { 20 | 21 | // MARK: 懒加载属性 22 | fileprivate lazy var gameVM : GameViewModel = GameViewModel() 23 | fileprivate lazy var collectionView : UICollectionView = {[unowned self] in 24 | // 1.创建布局 25 | let layout = UICollectionViewFlowLayout() 26 | layout.itemSize = CGSize(width: kItemW, height: kItemH) 27 | layout.minimumLineSpacing = 0 28 | layout.minimumInteritemSpacing = 0 29 | layout.sectionInset = UIEdgeInsets(top: 0, left: kEdgeMargin, bottom: 0, right: kEdgeMargin) 30 | layout.headerReferenceSize = CGSize(width: kScreenW, height: kHeaderViewH) 31 | 32 | // 2.创建UICollectionView 33 | let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) 34 | collectionView.backgroundColor = UIColor.white 35 | collectionView.autoresizingMask = [.flexibleHeight, .flexibleWidth] 36 | collectionView.register(UINib(nibName: "CollectionViewGameCell", bundle: nil), forCellWithReuseIdentifier: kGameCellID) 37 | collectionView.register(UINib(nibName: "CollectionHeaderView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: kHeaderViewID) 38 | collectionView.dataSource = self 39 | 40 | return collectionView 41 | }() 42 | fileprivate lazy var topHeaderView : CollectionHeaderView = { 43 | let headerView = CollectionHeaderView.collectionHeaderView() 44 | headerView.frame = CGRect(x: 0, y: -(kHeaderViewH + kGameViewH), width: kScreenW, height: kHeaderViewH) 45 | headerView.iconImageView.image = UIImage(named: "Img_orange") 46 | headerView.titleLabel.text = "常见" 47 | headerView.moreBtn.isHidden = true 48 | return headerView 49 | }() 50 | fileprivate lazy var gameView : RecommendGameView = { 51 | let gameView = RecommendGameView.recommendGameView() 52 | gameView.frame = CGRect(x: 0, y: -kGameViewH, width: kScreenW, height: kGameViewH) 53 | return gameView 54 | }() 55 | 56 | // MARK: 系统回调 57 | override func viewDidLoad() { 58 | super.viewDidLoad() 59 | 60 | setupUI() 61 | loadData() 62 | } 63 | 64 | } 65 | 66 | 67 | // MARK:- 设置UI界面 68 | extension GameViewController { 69 | override func setupUI() { 70 | 71 | // 0.给content进行赋值 72 | self.baseContentView = collectionView 73 | 74 | // 1.添加UICollectionView 75 | view.addSubview(collectionView) 76 | 77 | // 2.添加顶部的HeaderView 78 | collectionView.addSubview(topHeaderView) 79 | 80 | // 3.将常用游戏的View,添加到collectionView中 81 | collectionView.addSubview(gameView) 82 | 83 | // 设置collectionView的内边距 84 | collectionView.contentInset = UIEdgeInsets(top: kHeaderViewH + kGameViewH, left: 0, bottom: 0, right: 0) 85 | 86 | super.setupUI() 87 | } 88 | } 89 | 90 | 91 | // MARK:- 请求数据 92 | extension GameViewController { 93 | fileprivate func loadData() { 94 | gameVM.loadAllGameData { 95 | // 1.展示全部游戏 96 | self.collectionView.reloadData() 97 | 98 | // 2.展示常用游戏 99 | self.gameView.groups = Array(self.gameVM.games[0..<10]) 100 | 101 | // 3.数据请求完成 102 | self.loadDataFinished() 103 | } 104 | } 105 | } 106 | 107 | 108 | // MARK:- 遵守UICollectionView的数据源&代理 109 | extension GameViewController : UICollectionViewDataSource { 110 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 111 | return gameVM.games.count 112 | } 113 | 114 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 115 | // 1.获取cell 116 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kGameCellID, for: indexPath) as! CollectionViewGameCell 117 | 118 | cell.baseGame = gameVM.games[indexPath.item] 119 | 120 | return cell 121 | } 122 | 123 | func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 124 | // 1.取出HeaderView 125 | let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: kHeaderViewID, for: indexPath) as! CollectionHeaderView 126 | 127 | // 2.给HeaderView设置属性 128 | headerView.titleLabel.text = "全部" 129 | headerView.iconImageView.image = UIImage(named: "Img_orange") 130 | headerView.moreBtn.isHidden = true 131 | 132 | return headerView 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/Home.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/HomeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 常量定义 12 | private let kTitleViewH: CGFloat = 40 13 | 14 | class HomeViewController: UIViewController { 15 | 16 | // MARK:- 懒加载属性 17 | fileprivate lazy var pageTitleView: PageTitleView = {[weak self] in 18 | let titleFrame = CGRect(x: 0, y: kStatusBarH + kNavigationBarH, width: kScreenW, height: kTitleViewH) 19 | let titles = ["推荐", "游戏", "娱乐", "趣玩"] 20 | let titleView = PageTitleView(frame: titleFrame, titles: titles) 21 | titleView.delegate = self 22 | return titleView 23 | }() 24 | 25 | fileprivate lazy var pageContentView: PageContentView = {[weak self] in 26 | // 1.确定内容的frame 27 | let contentH = kScreenH - kStatusBarH - kNavigationBarH - kTitleViewH - kTabbarH 28 | let contentFrame = CGRect(x: 0, y: kStatusBarH + kNavigationBarH + kTitleViewH, width: kScreenW, height: contentH) 29 | 30 | // 2.确定所有的子控制器 31 | var childVcs = [UIViewController]() 32 | childVcs.append(RecommendViewController()) 33 | childVcs.append(GameViewController()) 34 | childVcs.append(AmuseViewController()) 35 | childVcs.append(FunnyViewController()) 36 | 37 | let pageContentView = PageContentView(frame: contentFrame, childVcs: childVcs, parentViewController: self) 38 | pageContentView.delegate = self 39 | 40 | return pageContentView 41 | }() 42 | 43 | // MARK:- 系统回调函数 44 | override func viewDidLoad() { 45 | super.viewDidLoad() 46 | 47 | // 设置UI界面 48 | setupUI() 49 | } 50 | 51 | } 52 | 53 | // MARK:- 设置UI界面 54 | extension HomeViewController { 55 | 56 | fileprivate func setupUI() { 57 | 58 | // 0.不需要调整UIScrollView的内边距 59 | automaticallyAdjustsScrollViewInsets = false 60 | 61 | // 1.设置导航栏 62 | setupNavigationBar() 63 | 64 | // 2.添加TitltView 65 | view.addSubview(pageTitleView) 66 | 67 | // 3.添加contentView 68 | view.addSubview(pageContentView) 69 | 70 | } 71 | 72 | fileprivate func setupNavigationBar() { 73 | // 1.设置左侧的Item 74 | navigationItem.leftBarButtonItem = UIBarButtonItem(customView: UIImageView(image: UIImage(named: "logo"))) 75 | 76 | // 2.设置右侧的Item 77 | let size = CGSize(width: 40, height: 40) 78 | let historyItem = UIBarButtonItem(imageName: "image_my_history", highImageName: "Image_my_history_click", size: size) 79 | let searchItem = UIBarButtonItem(imageName: "btn_search", highImageName: "btn_search_clicked", size: size) 80 | let qrcodeItem = UIBarButtonItem(imageName: "Image_scan", highImageName: "Image_scan_click", size: size) 81 | navigationItem.rightBarButtonItems = [historyItem, searchItem, qrcodeItem] 82 | } 83 | 84 | } 85 | 86 | // MARK:- 遵守PageTitleViewDelegate协议 87 | extension HomeViewController : PageTitleViewDelegate { 88 | func pageTitltView(_ titleView: PageTitleView, selectedIndex index: Int) { 89 | pageContentView.setCurrentIndex(index) 90 | } 91 | } 92 | 93 | // MARK:- 遵守PageContentViewDelegate 94 | extension HomeViewController : PageContentViewDelegate { 95 | func pageContentView(_ contentView: PageContentView, progress: CGFloat, sourceIndex: Int, targetIndex: Int) { 96 | pageTitleView.setTitleWithProgress(progress, sourceIndex: sourceIndex, targetIndex: targetIndex) 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Controller/RecommendViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/28. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 定义常量 12 | private let kCycleViewH : CGFloat = kScreenW * 3 / 8 13 | private let kGameViewH : CGFloat = 90 14 | 15 | class RecommendViewController: BaseAnchorViewController { 16 | 17 | // MARK:- 懒加载属性 18 | fileprivate lazy var recommendVM : RecommendViewModel = RecommendViewModel() 19 | fileprivate lazy var recommendCycleView : RecommendCycleView = { 20 | let cycleView = RecommendCycleView.recommendCycleView() 21 | cycleView.frame = CGRect(x: 0, y: -(kCycleViewH + kGameViewH), width: kScreenW, height: kCycleViewH) 22 | return cycleView 23 | }() 24 | fileprivate lazy var gameView : RecommendGameView = { 25 | let gameView = RecommendGameView.recommendGameView() 26 | gameView.frame = CGRect(x: 0, y: -kGameViewH, width: kScreenW, height: kGameViewH) 27 | return gameView 28 | }() 29 | } 30 | 31 | // MARK:- 设置UI界面内容 32 | extension RecommendViewController { 33 | override func setupUI() { 34 | super.setupUI() 35 | 36 | // 2.将cycleView添加到UICollectionView中 37 | collectionView.addSubview(recommendCycleView) 38 | 39 | // 3.将gameView添加到UICollectionView中 40 | collectionView.addSubview(gameView) 41 | 42 | // 4.设置collectionView的内边距 43 | collectionView.contentInset = UIEdgeInsets(top: kCycleViewH + kGameViewH, left: 0, bottom: 0, right: 0) 44 | } 45 | } 46 | 47 | // MARK:- 请求数据 48 | extension RecommendViewController { 49 | override func loadData() { 50 | // 给父类的ViewModel赋值 51 | self.baseVM = self.recommendVM 52 | 53 | // 1.请求推荐数据 54 | recommendVM.requestData { 55 | // 1.展示推荐数据 56 | self.collectionView.reloadData() 57 | 58 | // 2.将数据传递给gameView 59 | var groups = self.recommendVM.anchorGroups 60 | // 2.1.移除前两组数据 61 | groups.removeFirst() 62 | groups.removeFirst() 63 | 64 | // 2.2添加更多组 65 | let moreGroup = AnchorGroup() 66 | moreGroup.tag_name = "更多" 67 | groups.append(moreGroup) 68 | 69 | self.gameView.groups = groups 70 | 71 | // 3.数据请求完成 72 | self.loadDataFinished() 73 | } 74 | 75 | // 2.请求无线轮播数据 76 | self.recommendVM.requestCycleData { 77 | self.recommendCycleView.cycleModels = self.recommendVM.cycleModels 78 | } 79 | } 80 | } 81 | 82 | // MARK:- 遵守UICollectionViewDelegateFlowLayout 83 | extension RecommendViewController : UICollectionViewDelegateFlowLayout { 84 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 85 | if (indexPath as NSIndexPath).section == 1 { 86 | return CGSize(width: kNormalItemW, height: kPrettyItemH) 87 | }else { 88 | return CGSize(width: kNormalItemW, height: kNormalItemH) 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Model/CycleModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CycleModel.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/2. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CycleModel: NSObject { 12 | 13 | // 标题 14 | var title : String = "" 15 | // 展示的图片地址 16 | var pic_url : String = "" 17 | // 主播信息对应的字典 18 | var room : [String : NSObject]? { 19 | didSet { 20 | guard let room = room else { return } 21 | anchor = AnchorModel(dict: room) 22 | } 23 | } 24 | // 主播信息对应的模型 25 | var anchor : AnchorModel? 26 | 27 | 28 | // MARK:- 自定义构造函数 29 | init(dict: [String : NSObject]) { 30 | super.init() 31 | 32 | setValuesForKeys(dict) 33 | } 34 | 35 | override func setValue(_ value: Any?, forUndefinedKey key: String) {} 36 | } 37 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/Model/GameModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseGameModel.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class GameModel: BaseGameModel { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/AmuseMenuView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AmuseMenuView.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 常量定义 12 | private let kMenuCellID = "kMenuCellID" 13 | 14 | class AmuseMenuView: UIView { 15 | 16 | // MARK: 定义属性 17 | var groups : [AnchorGroup]? { 18 | didSet { 19 | collectionView.reloadData() 20 | } 21 | } 22 | 23 | // MARK:- 控件属性 24 | @IBOutlet weak var collectionView: UICollectionView! 25 | @IBOutlet weak var pageControl: UIPageControl! 26 | 27 | // MARK: 从Xib中加载出来 28 | override func awakeFromNib() { 29 | super.awakeFromNib() 30 | 31 | // 注册单元格 32 | self.collectionView.register(UINib(nibName: "AmuseMenuViewCell", bundle: nil), forCellWithReuseIdentifier: kMenuCellID) 33 | } 34 | 35 | override func layoutSubviews() { 36 | super.layoutSubviews() 37 | 38 | // 设置每个cell的尺寸 39 | let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 40 | layout.itemSize = self.collectionView.bounds.size 41 | } 42 | } 43 | 44 | // MARK:- 快速创建view的方法 45 | extension AmuseMenuView { 46 | class func amuseMenuView() -> AmuseMenuView { 47 | return Bundle.main.loadNibNamed("AmuseMenuView", owner: nil, options: nil)?.first as! AmuseMenuView 48 | } 49 | } 50 | 51 | // MARK:- 遵守UICollectionView的数据源方法 52 | extension AmuseMenuView : UICollectionViewDataSource { 53 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 54 | 55 | if self.groups == nil { return 0 } 56 | 57 | let pageNum = (groups!.count - 1) / 8 + 1 58 | self.pageControl.numberOfPages = pageNum 59 | return pageNum 60 | } 61 | 62 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 63 | // 1.取出cell 64 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kMenuCellID, for: indexPath) as! AmuseMenuViewCell 65 | // 2.设置模型数据 66 | setupCellDataWithCell(cell: cell, indexPath: indexPath) 67 | 68 | return cell 69 | } 70 | 71 | // 根据cell设置数据模型 72 | private func setupCellDataWithCell(cell : AmuseMenuViewCell, indexPath : IndexPath) { 73 | // 0....7 74 | // 8....15 75 | // 16...23 76 | 77 | // 1.取出起始位置和终点位置 78 | let startIndex = indexPath.item * 8 79 | var endIndex = (indexPath.item + 1) * 8 - 1 80 | 81 | // 2.判断是否越界 82 | if endIndex > groups!.count - 1 { 83 | endIndex = groups!.count - 1 84 | } 85 | 86 | // 3.取出模型, 并赋值给cell 87 | cell.groups = Array(self.groups![startIndex...endIndex]) 88 | 89 | } 90 | } 91 | 92 | // MARK:- 遵守UICollectionView的代理方法 93 | extension AmuseMenuView : UICollectionViewDelegate { 94 | func scrollViewDidScroll(_ scrollView: UIScrollView) { 95 | pageControl.currentPage = Int(CGFloat(scrollView.contentOffset.x / scrollView.bounds.width) + 0.5) 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/AmuseMenuView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/AmuseMenuViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AmuseMenuViewCell.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | private let kGameCellID = "kGameCellID" 12 | 13 | class AmuseMenuViewCell: UICollectionViewCell { 14 | 15 | // MARK: 数组模型 16 | var groups : [AnchorGroup]? { 17 | didSet { 18 | collectionView.reloadData() 19 | } 20 | } 21 | 22 | // MARK: 控件属性 23 | @IBOutlet weak var collectionView: UICollectionView! 24 | 25 | // MARK: 从Xib中加载 26 | override func awakeFromNib() { 27 | super.awakeFromNib() 28 | 29 | collectionView.register(UINib(nibName: "CollectionViewGameCell", bundle: nil), forCellWithReuseIdentifier: kGameCellID) 30 | } 31 | 32 | override func layoutSubviews() { 33 | super.layoutSubviews() 34 | 35 | let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout 36 | let itemW = collectionView.bounds.width / 4 37 | let itemH = collectionView.bounds.height / 2 38 | layout.itemSize = CGSize(width: itemW, height: itemH) 39 | } 40 | } 41 | 42 | 43 | extension AmuseMenuViewCell : UICollectionViewDataSource { 44 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 45 | return groups?.count ?? 0 46 | } 47 | 48 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 49 | // 1.求出Cell 50 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kGameCellID, for: indexPath) as! CollectionViewGameCell 51 | 52 | // 2.给Cell设置数据 53 | cell.baseGame = groups![indexPath.item] 54 | cell.clipsToBounds = true 55 | 56 | return cell 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/AmuseMenuViewCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/CollectionHeaderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionHeaderView.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/29. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CollectionHeaderView: UICollectionReusableView { 12 | 13 | // MARK:- 控件属性 14 | @IBOutlet weak var titleLabel: UILabel! 15 | @IBOutlet weak var iconImageView: UIImageView! 16 | @IBOutlet weak var moreBtn: UIButton! 17 | 18 | // MARK:- 定义模型属性 19 | var group : AnchorGroup? { 20 | didSet { 21 | titleLabel.text = group?.tag_name 22 | iconImageView.image = UIImage(named: group?.icon_name ?? "home_header_normal") 23 | } 24 | } 25 | 26 | 27 | override func awakeFromNib() { 28 | super.awakeFromNib() 29 | // Initialization code 30 | } 31 | 32 | } 33 | 34 | // MARK:- 从Xib中快速创建的类方法 35 | extension CollectionHeaderView { 36 | class func collectionHeaderView() -> CollectionHeaderView { 37 | return Bundle.main.loadNibNamed("CollectionHeaderView", owner: nil, options: nil)?.first as! CollectionHeaderView 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/CollectionViewCycleCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewCycleCell.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/2. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Kingfisher 11 | 12 | class CollectionViewCycleCell: UICollectionViewCell { 13 | 14 | // MARK:- 定义模型属性 15 | var cycleModel : CycleModel? { 16 | didSet { 17 | titleLabel.text = cycleModel?.title 18 | if let iconURL = URL(string: cycleModel?.pic_url ?? "") { 19 | iconImageView.kf.setImage(with: iconURL) 20 | } 21 | } 22 | } 23 | 24 | // MARK:- 控件属性 25 | 26 | @IBOutlet weak var iconImageView: UIImageView! 27 | @IBOutlet weak var titleLabel: UILabel! 28 | 29 | override func awakeFromNib() { 30 | super.awakeFromNib() 31 | // Initialization code 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/CollectionViewCycleCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/CollectionViewGameCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewGameCell.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/2. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Kingfisher 11 | 12 | class CollectionViewGameCell: UICollectionViewCell { 13 | 14 | // MARK:- 控件属性 15 | @IBOutlet weak var iconImageView: UIImageView! 16 | @IBOutlet weak var titleLabel: UILabel! 17 | 18 | // MARK:- 定义模型属性 19 | var baseGame : BaseGameModel? { 20 | didSet { 21 | guard let game = baseGame else { return } 22 | titleLabel.text = game.tag_name 23 | if let iconURL = URL(string: game.icon_url) { 24 | iconImageView.kf.setImage(with: iconURL, placeholder: UIImage(named: "home_more_btn")) 25 | }else { 26 | iconImageView.image = UIImage(named: "home_more_btn") 27 | } 28 | } 29 | } 30 | 31 | override func awakeFromNib() { 32 | super.awakeFromNib() 33 | // Initialization code 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/CollectionViewGameCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/RecommendCycleView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendCycleView.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RecommendCycleView: UIView { 12 | 13 | // MARK:- 常量 14 | fileprivate let kCycleCellID = "kCycleCellID" 15 | 16 | // MARK:- 控件属性 17 | @IBOutlet weak var pageControl: UIPageControl! 18 | @IBOutlet weak var collectionView: UICollectionView! 19 | 20 | // MARK:- 定义属性 21 | var cycleTimer : Timer? 22 | 23 | var cycleModels : [CycleModel]? { 24 | didSet { 25 | // 1.刷新collectionView 26 | collectionView.reloadData() 27 | 28 | // 2.设置pageControl的个数 29 | pageControl.numberOfPages = cycleModels?.count ?? 0 30 | 31 | // 3.默认滚动到中间某一个值 32 | let indexPath = IndexPath(item: (cycleModels?.count ?? 0) * 10, section: 0) 33 | collectionView.scrollToItem(at: indexPath, at: .left, animated: false) 34 | 35 | // 4.添加定时器 36 | removeCycleTime() 37 | addCycleTimer() 38 | } 39 | } 40 | 41 | // MARK:- 系统回调方法 42 | override func awakeFromNib() { 43 | super.awakeFromNib() 44 | 45 | // 1.设置不随父控件拉伸而拉伸 46 | autoresizingMask = UIViewAutoresizing() 47 | 48 | // 2.注册cell 49 | collectionView.register(UINib(nibName: "CollectionViewCycleCell", bundle: nil), forCellWithReuseIdentifier: kCycleCellID) 50 | 51 | collectionView.isPagingEnabled = true 52 | collectionView.showsHorizontalScrollIndicator = false 53 | collectionView.bounces = false 54 | } 55 | 56 | override func layoutSubviews() { 57 | super.layoutSubviews() 58 | 59 | // 1.设置CollectionView的layout 60 | let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout 61 | layout.itemSize = collectionView.bounds.size 62 | layout.minimumLineSpacing = 0 63 | layout.minimumInteritemSpacing = 0 64 | layout.scrollDirection = .horizontal 65 | } 66 | } 67 | 68 | // MARK:- 提供一个快速创建View的类方法 69 | extension RecommendCycleView { 70 | class func recommendCycleView() -> RecommendCycleView { 71 | return Bundle.main.loadNibNamed("RecommendCycleView", owner: nil, options: nil)!.first as! RecommendCycleView 72 | } 73 | } 74 | 75 | // MARK:- 遵守UICollectionView数据源协议 76 | extension RecommendCycleView : UICollectionViewDataSource { 77 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 78 | return (self.cycleModels?.count ?? 0) * 1000 79 | } 80 | 81 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 82 | // 1.取到cell 83 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kCycleCellID, for: indexPath) as! CollectionViewCycleCell 84 | // 2.获取数据模型 85 | let cycleModel = cycleModels![(indexPath as NSIndexPath).item % cycleModels!.count] 86 | // 3.设置数据模型 87 | cell.cycleModel = cycleModel 88 | 89 | return cell 90 | } 91 | } 92 | 93 | // MARK:- 遵循UICollectionView代理协议 94 | extension RecommendCycleView : UICollectionViewDelegate { 95 | func scrollViewDidScroll(_ scrollView: UIScrollView) { 96 | // 1.获取滑动的偏移量 97 | let offsetX = scrollView.contentOffset.x 98 | 99 | // 2.计算pageControl的currentIndex 100 | pageControl.currentPage = Int((offsetX / scrollView.bounds.width) + 0.5) % (cycleModels?.count ?? 1) 101 | } 102 | 103 | func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 104 | removeCycleTime() 105 | } 106 | 107 | func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 108 | addCycleTimer() 109 | } 110 | } 111 | 112 | // MARK:- 对定时器的操作方法 113 | extension RecommendCycleView { 114 | fileprivate func addCycleTimer() { 115 | cycleTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.scrollToNext), userInfo: nil, repeats: true) 116 | } 117 | 118 | fileprivate func removeCycleTime() { 119 | cycleTimer?.invalidate() // 从运行循环中移除 120 | cycleTimer = nil 121 | } 122 | 123 | @objc fileprivate func scrollToNext() { 124 | // 1.获取滚动的偏移量 125 | let currentOffsetx = collectionView.contentOffset.x 126 | let offsetX = currentOffsetx + collectionView.bounds.width 127 | 128 | // 2.滚动到该位置 129 | collectionView.setContentOffset(CGPoint(x: offsetX, y: 0), animated: true) 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/RecommendCycleView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/RecommendGameView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendGameView.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/2. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK:- 定义常量 12 | private let kGameCellID : String = "kGameCellID" 13 | private let kEdgeInsetMargin : CGFloat = 10 14 | 15 | class RecommendGameView: UIView { 16 | 17 | // MARK:- 定义数据属性 18 | var groups : [BaseGameModel]? { 19 | didSet { 20 | 21 | // 1.重新刷新表格数据 22 | collectionView.reloadData() 23 | } 24 | } 25 | 26 | // MARK:- 控件属性 27 | @IBOutlet weak var collectionView: UICollectionView! 28 | 29 | // MARK:- 系统回调方法 30 | override func awakeFromNib() { 31 | super.awakeFromNib() 32 | 33 | // 默认创建出来有autoresizingMask导致内外一起拉伸之后尺寸为0, 所以显示不出来 34 | // 解决方法: 设置控件不随父控件拉伸而拉伸 35 | autoresizingMask = UIViewAutoresizing() 36 | 37 | // 注册cell 38 | collectionView.register(UINib(nibName: "CollectionViewGameCell", bundle: nil), forCellWithReuseIdentifier: kGameCellID) 39 | 40 | // 给collectionView设置内边距 41 | collectionView.contentInset = UIEdgeInsets(top: 0, left: kEdgeInsetMargin, bottom: 0, right: kEdgeInsetMargin) 42 | } 43 | } 44 | 45 | // MARK:- 提供快速创建的类方法 46 | extension RecommendGameView { 47 | class func recommendGameView() -> RecommendGameView { 48 | return Bundle.main.loadNibNamed("RecommendGameView", owner: nil, options: nil)!.first as! RecommendGameView 49 | } 50 | } 51 | 52 | // MARK:- 遵循UICollectionViewDataSource数据源协议 53 | extension RecommendGameView : UICollectionViewDataSource { 54 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 55 | return groups?.count ?? 0 56 | } 57 | 58 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 59 | 60 | // 1.获取cell 61 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kGameCellID, for: indexPath) as! CollectionViewGameCell 62 | 63 | // 2.取出数据模型 64 | let group = groups![(indexPath as NSIndexPath).item] 65 | 66 | // 3.传递模型数据 67 | cell.baseGame = group 68 | 69 | return cell 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/View/RecommendGameView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/ViewModel/AmuseViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AmuseViewModel.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/13. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AmuseViewModel : BaseViewModel{ 12 | 13 | } 14 | 15 | extension AmuseViewModel { 16 | func loadAmuseData(finishedCallback: @escaping () -> ()) { 17 | loadAnchorData(method: .get, URLString: "http://www.douyutv.com/api/v1/getHotRoom/2", finishedCallback: finishedCallback) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/ViewModel/GameViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GameViewModel.swift 3 | // DYTV 4 | // 5 | // Created by 1 on 16/10/12. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class GameViewModel { 12 | 13 | lazy var games : [GameModel] = [GameModel]() 14 | } 15 | 16 | extension GameViewModel { 17 | func loadAllGameData(finishedCallback : @escaping () -> ()) { 18 | NetworkTools.requestData(.get, URLString: "http://capi.douyucdn.cn/api/v1/getColumnDetail", parameters: ["shortName" : "game"]) { (result) in 19 | // 1.获取到数据 20 | guard let resultDict = result as? [String : Any] else { return } 21 | guard let dataArray = resultDict["data"] as? [[String : Any]] else { return } 22 | 23 | // 2.字典转模型 24 | for dict in dataArray { 25 | self.games.append(GameModel(dict: dict)) 26 | } 27 | 28 | // 3.完成回调 29 | finishedCallback() 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Home/ViewModel/RecommendViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendViewModel.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RecommendViewModel : BaseViewModel { 12 | 13 | // MARK:- 懒加载属性 14 | lazy var cycleModels : [CycleModel] = [CycleModel]() 15 | fileprivate lazy var bigDataGroup : AnchorGroup = AnchorGroup() 16 | fileprivate lazy var prettyGroup : AnchorGroup = AnchorGroup() 17 | } 18 | 19 | // MARK:- 发送网络请求 20 | extension RecommendViewModel { 21 | 22 | // 请求推荐数据 23 | func requestData(_ finishCallback : @escaping () -> ()) { 24 | // 1.定义参数 25 | let paramters = ["limit" : "4", "offset" : "0", "time" : Date.getCurrentTime()] 26 | // 2.创建Group 27 | let dGroup = DispatchGroup() 28 | 29 | // 3.请求第一部分的推荐数据 30 | dGroup.enter() 31 | NetworkTools.requestData(.get, URLString: "http://capi.douyucdn.cn/api/v1/getbigDataRoom", parameters: paramters) { (result) in 32 | 33 | // 1.将result转成字典类型 34 | guard let resultDict = result as? [String : NSObject] else { return } 35 | 36 | // 2.根据data该key, 获取数据 37 | guard let dataArray = resultDict["data"] as? [[String : NSObject]] else {return} 38 | 39 | // 3.遍历字典,并且转成模型数组 40 | // 3.1设置组的属性 41 | self.bigDataGroup.tag_name = "热门" 42 | self.bigDataGroup.icon_name = "home_header_hot" 43 | 44 | // 3.2获取主播数据 45 | for dict in dataArray { 46 | let anchor = AnchorModel(dict: dict) 47 | self.bigDataGroup.anchors.append(anchor) 48 | } 49 | 50 | // 3.3离开组 51 | dGroup.leave() 52 | } 53 | 54 | // 4.请求第二部分的颜值数据 55 | dGroup.enter() 56 | NetworkTools.requestData(.get, URLString: "http://capi.douyucdn.cn/api/v1/getVerticalRoom", parameters: paramters) { (result) in 57 | 58 | // 1.将result转成字典类型 59 | guard let resultDict = result as? [String : NSObject] else { return } 60 | 61 | // 2.根据data该key, 获取数据 62 | guard let dataArray = resultDict["data"] as? [[String : NSObject]]else {return} 63 | 64 | // 3.遍历字典,并且转成模型数组 65 | // 3.1设置组的属性 66 | self.prettyGroup.tag_name = "颜值" 67 | self.prettyGroup.icon_name = "home_header_phone" 68 | 69 | // 3.2获取主播数据 70 | for dict in dataArray { 71 | let anchor = AnchorModel(dict: dict) 72 | self.prettyGroup.anchors.append(anchor) 73 | } 74 | 75 | // 3.3离开组 76 | dGroup.leave() 77 | } 78 | 79 | // 5.请求2-12部分的游戏数据 80 | dGroup.enter() 81 | loadAnchorData(method: .get, URLString: "http://capi.douyucdn.cn/api/v1/getHotCate", parameters: paramters) { 82 | // 1.离开组 83 | dGroup.leave() 84 | } 85 | 86 | // 6.所有的数据都请求道, 对所有的数据进行排序 87 | dGroup.notify(queue: DispatchQueue.main) { 88 | self.anchorGroups.insert(self.prettyGroup, at: 0) 89 | self.anchorGroups.insert(self.bigDataGroup, at: 0) 90 | 91 | // 完成回调 92 | finishCallback() 93 | } 94 | } 95 | 96 | // 请求无限轮播数据 97 | func requestCycleData(_ finishCallback : @escaping () -> ()) { 98 | NetworkTools.requestData(.get, URLString: "http://www.douyutv.com/api/v1/slide/6", parameters: ["version" : "2.300"]) { (result) in 99 | // 1.获取整体字典数据 100 | guard let resultDict = result as? [String : NSObject] else { return } 101 | 102 | // 2.根据data的key, 获取数据 103 | guard let dataArray = resultDict["data"] as? [[String : NSObject]] else { return } 104 | 105 | // 3.字典转模型对象 106 | for dict in dataArray { 107 | self.cycleModels.append(CycleModel(dict: dict)) 108 | } 109 | 110 | // 回调闭包 111 | finishCallback() 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Live/Controller/Live.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Live/Controller/LiveViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LiveViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class LiveViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | } 18 | 19 | override func didReceiveMemoryWarning() { 20 | super.didReceiveMemoryWarning() 21 | // Dispose of any resources that can be recreated. 22 | } 23 | 24 | 25 | /* 26 | // MARK: - Navigation 27 | 28 | // In a storyboard-based application, you will often want to do a little preparation before navigation 29 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 30 | // Get the new view controller using segue.destinationViewController. 31 | // Pass the selected object to the new view controller. 32 | } 33 | */ 34 | 35 | } 36 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Controller/BaseViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewController.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseViewController: UIViewController { 12 | 13 | // MARK:- 定义属性 14 | var baseContentView : UIView? 15 | 16 | // MARK:- 懒加载属性 17 | fileprivate lazy var animImageView : UIImageView = { [unowned self] in 18 | let imageView = UIImageView(image: UIImage(named: "home_header_normal")) 19 | imageView.center = self.view.center 20 | imageView.animationImages = [UIImage(named: "home_header_normal")!, UIImage(named: "home_header_hot")!] 21 | imageView.animationDuration = 0.5 22 | imageView.animationRepeatCount = LONG_MAX 23 | imageView.autoresizingMask = [.flexibleTopMargin, .flexibleBottomMargin] 24 | return imageView 25 | }() 26 | 27 | // MARK:- 系统回调 28 | override func viewDidLoad() { 29 | super.viewDidLoad() 30 | 31 | self.setupUI() 32 | } 33 | 34 | } 35 | 36 | // MARK:- 添加UI界面 37 | extension BaseViewController { 38 | 39 | // MARK:- 设置UI界面 40 | func setupUI() { 41 | 42 | // 1.先隐藏内容的view 43 | self.baseContentView?.isHidden = true 44 | 45 | // 2.添加执行动画的UIImageView 46 | self.view.addSubview(animImageView) 47 | 48 | // 3.给UIImageView执行动画 49 | self.animImageView.startAnimating() 50 | 51 | // 4.设置背景颜色 52 | view.backgroundColor = UIColor(r: 250, g: 250, b: 250) 53 | } 54 | 55 | // MARK:- 数据请求完成 56 | func loadDataFinished() { 57 | // 1.停止动画 58 | self.animImageView.stopAnimating() 59 | 60 | // 2.隐藏animImageView 61 | self.animImageView.isHidden = true 62 | 63 | // 3.显示内容的view 64 | self.baseContentView?.isHidden = false 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Controller/CustomNavigationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomNavigationViewController.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CustomNavigationViewController: UINavigationController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // 设置全屏pop手势 17 | setScreenPopGesture() 18 | } 19 | 20 | 21 | override func pushViewController(_ viewController: UIViewController, animated: Bool) { 22 | 23 | // 隐藏要push的控制器的tabbar 24 | viewController.hidesBottomBarWhenPushed = true 25 | 26 | super.pushViewController(viewController, animated: animated) 27 | } 28 | } 29 | 30 | // MARK:- 设置全屏pop手势 31 | extension CustomNavigationViewController { 32 | 33 | fileprivate func setScreenPopGesture() { 34 | // 1. 获取系统pop手势 35 | guard let systemGes = interactivePopGestureRecognizer else { return } 36 | 37 | // 2. 获取系统手势添加到的view中 38 | guard let gesView = systemGes.view else { return } 39 | 40 | // 3. 获取target/action 41 | // 根据运行时获取所有的属性名称 42 | // var count : UInt32 = 0 43 | // let ivars = class_copyIvarList(UIGestureRecognizer.self, &count)! 44 | // for i in 0.. 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Controller/MainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MainViewController: UITabBarController { 12 | 13 | override class func initialize() { 14 | // let navBarAppear = UINavigationBar.appearance() 15 | // navBarAppear.barTintColor = UIColor.orangeColor() 16 | // navBarAppear.tintColor = UIColor.whiteColor() 17 | } 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | 22 | addChildVc("Home") 23 | addChildVc("Live") 24 | addChildVc("Fellow") 25 | addChildVc("Profile") 26 | } 27 | 28 | 29 | fileprivate func addChildVc(_ storyName : String) { 30 | // 1.通过storyboard获取控制器 31 | let childVc = UIStoryboard(name: storyName, bundle: nil).instantiateInitialViewController() 32 | 33 | // 2.将childVc作为子控制器 34 | addChildViewController(childVc!) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Model/AnchorGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnchorGroup.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AnchorGroup: BaseGameModel { 12 | 13 | // 该组中对应的房间信息 14 | var room_list : [[String : NSObject]]? { 15 | didSet { 16 | guard let room_list = room_list else { return } 17 | for dict in room_list { 18 | anchors.append(AnchorModel(dict: dict)) 19 | } 20 | } 21 | } 22 | 23 | // 组显示的图标 24 | var icon_name : String = "home_header_normal" 25 | // 定义主播的模型对象数组 26 | lazy var anchors : [AnchorModel] = [AnchorModel]() 27 | 28 | } 29 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Model/AnchorModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnchorModel.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AnchorModel: NSObject { 12 | // 房间ID 13 | var room_id : Int = 0 14 | // 房间图片对应的URLString 15 | var vertical_src : String = "" 16 | // 判断是手机直播还是电脑直播 17 | // 0: 电脑直播(普通房间) 1: 手机直播(秀场房间) 18 | var isVertical : Int = 0 19 | // 房间名称 20 | var room_name : String = "" 21 | // 主播昵称 22 | var nickname : String = "" 23 | // 观看人数 24 | var online : Int = 0 25 | // 主播所在城市 26 | var anchor_city : String = "" 27 | 28 | init(dict : [String : Any]) { 29 | super.init() 30 | 31 | setValuesForKeys(dict) 32 | } 33 | 34 | override func setValue(_ value: Any?, forUndefinedKey key: String) {} 35 | } 36 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/Model/BaseGameModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseGameModel.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseGameModel: NSObject { 12 | // MARK:- 定义属性 13 | var tag_name : String = "" 14 | var icon_url : String = "" 15 | 16 | // MARK:- 构造函数 17 | override init() { 18 | super.init() 19 | } 20 | 21 | init(dict : [String : Any]) { 22 | super.init() 23 | 24 | setValuesForKeys(dict) 25 | } 26 | 27 | override func setValue(_ value: Any?, forUndefinedKey key: String) {} 28 | } 29 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/View/CollectionBaseCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionBaseCell.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CollectionBaseCell: UICollectionViewCell { 12 | 13 | // MARK:- 控件属性 14 | @IBOutlet weak var iconImageView: UIImageView! 15 | @IBOutlet weak var nickNameLabel: UILabel! 16 | @IBOutlet weak var onlineBtn: UIButton! 17 | 18 | // MARK:- 定义模型属性 19 | var anchor: AnchorModel? { 20 | didSet { 21 | // 0.校验模型是否有值 22 | guard let anchor = anchor else { return } 23 | 24 | // 1.取出在线人数显示的文字 25 | var onlineStr : String = "" 26 | if anchor.online >= 10000 { 27 | onlineStr = "\(Int(anchor.online/1000))万人在线" 28 | } else { 29 | onlineStr = "\(anchor.online)人在线" 30 | } 31 | onlineBtn.setTitle(onlineStr, for: UIControlState()) 32 | 33 | // 2.昵称的显示 34 | nickNameLabel.text = anchor.nickname 35 | 36 | // 3.设置封面图片 37 | guard let icon_URL = URL(string: anchor.vertical_src) else { return } 38 | iconImageView.kf.setImage(with: icon_URL) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/View/CollectionViewNormalCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewNormalCell.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/29. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Kingfisher 11 | 12 | class CollectionViewNormalCell: CollectionBaseCell { 13 | 14 | // MARK:- 控件属性 15 | @IBOutlet weak var roomNameLabel: UILabel! 16 | 17 | // MARK:- 定义模型属性 18 | override var anchor: AnchorModel? { 19 | didSet { 20 | // 1.将属性传递给父类 21 | super.anchor = anchor 22 | 23 | // 2.设置房间名称 24 | roomNameLabel.text = anchor?.room_name 25 | } 26 | } 27 | 28 | override func awakeFromNib() { 29 | super.awakeFromNib() 30 | // Initialization code 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/View/CollectionViewPrettyCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewPrettyCell.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/29. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Kingfisher 11 | 12 | class CollectionViewPrettyCell: CollectionBaseCell { 13 | 14 | // MARK:- 控件属性 15 | @IBOutlet weak var cityBtn: UIButton! 16 | 17 | // MARK:- 定义模型属性 18 | override var anchor: AnchorModel? { 19 | didSet { 20 | // 1.将属性传递给父类 21 | super.anchor = anchor 22 | 23 | // 3.所在城市 24 | cityBtn.setTitle(anchor?.anchor_city, for: UIControlState()) 25 | } 26 | } 27 | 28 | override func awakeFromNib() { 29 | super.awakeFromNib() 30 | // Initialization code 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Main/ViewModel/BaseViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewModel.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/14. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseViewModel { 12 | 13 | lazy var anchorGroups : [AnchorGroup] = [AnchorGroup]() 14 | } 15 | 16 | // MARK:- 请求数据 17 | extension BaseViewModel { 18 | 19 | // MARK:- 请求推荐、娱乐模块主播数据 20 | func loadAnchorData(method : MethodType, URLString : String, parameters: [String : Any]? = nil, finishedCallback: @escaping () -> ()) { 21 | 22 | NetworkTools.requestData(method, URLString: URLString, parameters: parameters) { (result) in 23 | 24 | // 1.对结果进行处理 25 | guard let resultDict = result as? [String : Any] else { return } 26 | guard let dataArr = resultDict["data"] as? [[String : Any]] else { return } 27 | 28 | // 2.遍历数组中的字典 29 | for dict in dataArr { 30 | let amuse = AnchorGroup(dict: dict) 31 | self.anchorGroups.append(amuse) 32 | } 33 | 34 | // 3.完成回调 35 | finishedCallback() 36 | } 37 | } 38 | 39 | // MARK:- 请求趣玩模块主播数据 40 | func loadFunnyData(method : MethodType, URLString : String, parameters: [String : Any]? = nil, finishedCallback: @escaping () -> ()) { 41 | 42 | NetworkTools.requestData(method, URLString: URLString, parameters: parameters) { (result) in 43 | 44 | // 1.对结果进行处理 45 | guard let resultDict = result as? [String : Any] else { return } 46 | guard let dataArr = resultDict["data"] as? [[String : Any]] else { return } 47 | 48 | // 2.遍历数组中的字典 49 | // 2.1创建AnchorGroup 50 | let anchorGroup = AnchorGroup() 51 | // 2.1添加Anchor 52 | for dict in dataArr { 53 | let anchor = AnchorModel(dict: dict) 54 | anchorGroup.anchors.append(anchor) 55 | } 56 | // 2.3将AnchorGroup添加到anchorGroups 57 | self.anchorGroups.append(anchorGroup) 58 | 59 | // 3.完成回调 60 | finishedCallback() 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Profile/Controller/Profile.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Profile/Controller/ProfileViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileViewController.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ProfileViewController: UIViewController { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Room/Controller/RoomNormalViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoomNormalViewController.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RoomNormalViewController: UIViewController , UIGestureRecognizerDelegate{ 12 | 13 | // MARK:- 定义属性 14 | var maskImageView : UIImageView! 15 | 16 | // MARK:- 定义模型属性 17 | var anchor: AnchorModel? 18 | 19 | // MARK:- 系统回调函数 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | setupUI() 24 | } 25 | 26 | override func touchesBegan(_ touches: Set, with event: UIEvent?) { 27 | super.touchesBegan(touches, with: event) 28 | 29 | dismiss(animated: true, completion: nil) 30 | } 31 | 32 | override func viewWillAppear(_ animated: Bool) { 33 | super.viewWillAppear(animated) 34 | 35 | // 1.隐藏导航栏 36 | navigationController?.setNavigationBarHidden(true, animated: true) 37 | } 38 | 39 | override func viewWillDisappear(_ animated: Bool) { 40 | super.viewWillDisappear(animated) 41 | 42 | // 1.显示导航栏 43 | navigationController?.setNavigationBarHidden(false, animated: true) 44 | } 45 | } 46 | 47 | // MARK:- 添加UI控件 48 | extension RoomNormalViewController { 49 | 50 | fileprivate func setupUI() { 51 | 52 | // 1.设置背景颜色 53 | view.backgroundColor = UIColor(r: 250, g: 250, b: 250) 54 | 55 | // 2.添加蒙版 56 | let imageView = UIImageView() 57 | imageView.frame = CGRect(x: 0, y: 0, width: kScreenW, height: 240) 58 | let blurEffect = UIBlurEffect(style: .light) 59 | let effectView = UIVisualEffectView(effect: blurEffect) 60 | effectView.frame = imageView.bounds 61 | imageView.addSubview(effectView) 62 | 63 | // 1.设置蒙版图片 64 | guard let icon_URL = URL(string: (self.anchor?.vertical_src)!) else { return } 65 | 66 | imageView.kf.setImage(with: icon_URL) 67 | 68 | self.maskImageView = imageView 69 | 70 | view.addSubview(self.maskImageView) 71 | } 72 | } 73 | 74 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Room/Controller/RoomShowViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoomShowViewController.swift 3 | // DYTV 4 | // 5 | // Created by CodeLL on 2016/10/15. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RoomShowViewController: UIViewController { 12 | 13 | // MARK:- 定义属性 14 | var maskImageView : UIImageView! 15 | 16 | // MARK:- 定义模型属性 17 | var anchor: AnchorModel? 18 | 19 | // MARK:- 系统回调函数 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | setupUI() 24 | } 25 | 26 | override func touchesBegan(_ touches: Set, with event: UIEvent?) { 27 | super.touchesBegan(touches, with: event) 28 | 29 | dismiss(animated: true, completion: nil) 30 | } 31 | } 32 | 33 | 34 | // MARK:- 添加UI控件 35 | extension RoomShowViewController { 36 | 37 | fileprivate func setupUI() { 38 | 39 | let imageView = UIImageView() 40 | imageView.frame = self.view.bounds 41 | let blurEffect = UIBlurEffect(style: .light) 42 | let effectView = UIVisualEffectView(effect: blurEffect) 43 | effectView.frame = imageView.bounds 44 | imageView.addSubview(effectView) 45 | 46 | // 1.设置蒙版图片 47 | guard let icon_URL = URL(string: (self.anchor?.vertical_src)!) else { return } 48 | 49 | imageView.kf.setImage(with: icon_URL) 50 | 51 | self.maskImageView = imageView 52 | 53 | view.addSubview(self.maskImageView) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Tools/Common.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Common.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | let kStatusBarH : CGFloat = 20 12 | let kNavigationBarH : CGFloat = 44 13 | let kTabbarH : CGFloat = 44 14 | 15 | let kScreenW = UIScreen.main.bounds.size.width 16 | let kScreenH = UIScreen.main.bounds.size.height 17 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Tools/Extensions/NSDate+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSDate+Extension.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Date { 12 | static func getCurrentTime() -> String { 13 | 14 | let nowDate = Date() 15 | 16 | let interval = Int(nowDate.timeIntervalSince1970) 17 | 18 | return "\(interval)" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Tools/Extensions/UIBarButtonItem+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIBarButtonItem+Extension.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIBarButtonItem { 12 | // 便利构造函数 13 | convenience init(imageName: String, highImageName: String, size: CGSize = CGSize.zero) { 14 | 15 | // 1.创建UIButton 16 | let btn = UIButton(); 17 | 18 | // 2.设置btn的图片 19 | btn.setImage(UIImage(named: imageName), for: UIControlState()) 20 | if(highImageName != "") { 21 | btn.setImage(UIImage(named: highImageName), for: .highlighted) 22 | } 23 | 24 | // 3.设置btn的尺寸 25 | if size == CGSize.zero { 26 | btn.sizeToFit() 27 | }else { 28 | btn.frame = CGRect(origin: CGPoint.zero, size: size) 29 | } 30 | 31 | // 4.创建UIBarButtonItem 32 | self.init(customView: btn) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Tools/Extensions/UIColor+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extension.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/9/16. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | 13 | // MARK:- 遍历构造器 14 | convenience init(r: CGFloat, g: CGFloat, b: CGFloat) { 15 | self.init(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: 1.0) 16 | } 17 | 18 | // MARK:- 随机色 19 | class func randomColor() -> UIColor { 20 | return UIColor(r: CGFloat(arc4random_uniform(256)), g: CGFloat(arc4random_uniform(256)), b: CGFloat(arc4random_uniform(256))) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /DYTV/DYTV/Classes/Tools/NetworkTools.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkTools.swift 3 | // DYTV 4 | // 5 | // Created by coderLL on 16/10/1. 6 | // Copyright © 2016年 coderLL. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Alamofire 11 | 12 | // MARK:- 方法枚举类型 13 | enum MethodType { 14 | case get 15 | case post 16 | } 17 | 18 | // MARK:- 网络请求工具类 19 | class NetworkTools { 20 | class func requestData(_ type : MethodType, URLString : String, parameters : [String : Any]? = nil, finishedCallback: @escaping (_ result : Any) -> ()) { 21 | 22 | // 1.获取类型 23 | let method = type == .get ? HTTPMethod.get : HTTPMethod.post 24 | 25 | // 2.发送网络请求 26 | Alamofire.request(URLString, method: method, parameters: parameters).responseJSON { (response) in 27 | // 3.获取结果 28 | guard let result = response.result.value else { 29 | print(response.result.error) 30 | return 31 | } 32 | // 4.将结果回调出去 33 | finishedCallback(result) 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /DYTV/DYTV/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | 斗鱼直播 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | 32 | UIMainStoryboardFile 33 | Main 34 | UIRequiredDeviceCapabilities 35 | 36 | armv7 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /DYTV/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | platform :ios, '9.0' 3 | # Comment this line if you're not using Swift and don't want to use dynamic frameworks 4 | use_frameworks! 5 | 6 | target 'DYTV' do 7 | 8 | pod 'Alamofire', '~> 4.0.1' 9 | pod 'Kingfisher', '~> 3.1.3' 10 | 11 | end 12 | -------------------------------------------------------------------------------- /DYTV/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.0.1) 3 | - Kingfisher (3.1.3) 4 | 5 | DEPENDENCIES: 6 | - Alamofire (~> 4.0.1) 7 | - Kingfisher (~> 3.1.3) 8 | 9 | SPEC CHECKSUMS: 10 | Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 11 | Kingfisher: 007f5851c18c81e7cc106c9cbac1bafea1cce5dc 12 | 13 | PODFILE CHECKSUM: a112dddb869d14b0740c964dc98439aa4e83d52c 14 | 15 | COCOAPODS: 1.0.1 16 | -------------------------------------------------------------------------------- /DYTV/Pods/Alamofire/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /DYTV/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueue+Alamofire.swift 3 | // 4 | // Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Dispatch 26 | import Foundation 27 | 28 | extension DispatchQueue { 29 | static var userInteractive: DispatchQueue { return DispatchQueue.global(qos: .userInteractive) } 30 | static var userInitiated: DispatchQueue { return DispatchQueue.global(qos: .userInitiated) } 31 | static var utility: DispatchQueue { return DispatchQueue.global(qos: .utility) } 32 | static var background: DispatchQueue { return DispatchQueue.global(qos: .background) } 33 | 34 | func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { 35 | asyncAfter(deadline: .now() + delay, execute: closure) 36 | } 37 | 38 | func syncResult(_ closure: () -> T) -> T { 39 | var result: T! 40 | sync { result = closure() } 41 | return result 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /DYTV/Pods/Alamofire/Source/Notifications.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Notifications.swift 3 | // 4 | // Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | extension Notification.Name { 28 | /// Used as a namespace for all `URLSessionTask` related notifications. 29 | public struct Task { 30 | /// Posted when a `URLSessionTask` is resumed. The notification `object` contains the resumed `URLSessionTask`. 31 | public static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume") 32 | 33 | /// Posted when a `URLSessionTask` is suspended. The notification `object` contains the suspended `URLSessionTask`. 34 | public static let DidSuspend = Notification.Name(rawValue: "org.alamofire.notification.name.task.didSuspend") 35 | 36 | /// Posted when a `URLSessionTask` is cancelled. The notification `object` contains the cancelled `URLSessionTask`. 37 | public static let DidCancel = Notification.Name(rawValue: "org.alamofire.notification.name.task.didCancel") 38 | 39 | /// Posted when a `URLSessionTask` is completed. The notification `object` contains the completed `URLSessionTask`. 40 | public static let DidComplete = Notification.Name(rawValue: "org.alamofire.notification.name.task.didComplete") 41 | } 42 | } 43 | 44 | // MARK: - 45 | 46 | extension Notification { 47 | /// Used as a namespace for all `Notification` user info dictionary keys. 48 | public struct Key { 49 | /// User info dictionary key representing the `URLSessionTask` associated with the notification. 50 | public static let Task = "org.alamofire.notification.key.task" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /DYTV/Pods/Alamofire/Source/Result.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Result.swift 3 | // 4 | // Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | /// Used to represent whether a request was successful or encountered an error. 28 | /// 29 | /// - success: The request and all post processing operations were successful resulting in the serialization of the 30 | /// provided associated value. 31 | /// 32 | /// - failure: The request encountered an error resulting in a failure. The associated values are the original data 33 | /// provided by the server as well as the error that caused the failure. 34 | public enum Result { 35 | case success(Value) 36 | case failure(Error) 37 | 38 | /// Returns `true` if the result is a success, `false` otherwise. 39 | public var isSuccess: Bool { 40 | switch self { 41 | case .success: 42 | return true 43 | case .failure: 44 | return false 45 | } 46 | } 47 | 48 | /// Returns `true` if the result is a failure, `false` otherwise. 49 | public var isFailure: Bool { 50 | return !isSuccess 51 | } 52 | 53 | /// Returns the associated value if the result is a success, `nil` otherwise. 54 | public var value: Value? { 55 | switch self { 56 | case .success(let value): 57 | return value 58 | case .failure: 59 | return nil 60 | } 61 | } 62 | 63 | /// Returns the associated error value if the result is a failure, `nil` otherwise. 64 | public var error: Error? { 65 | switch self { 66 | case .success: 67 | return nil 68 | case .failure(let error): 69 | return error 70 | } 71 | } 72 | } 73 | 74 | // MARK: - CustomStringConvertible 75 | 76 | extension Result: CustomStringConvertible { 77 | /// The textual representation used when written to an output stream, which includes whether the result was a 78 | /// success or failure. 79 | public var description: String { 80 | switch self { 81 | case .success: 82 | return "SUCCESS" 83 | case .failure: 84 | return "FAILURE" 85 | } 86 | } 87 | } 88 | 89 | // MARK: - CustomDebugStringConvertible 90 | 91 | extension Result: CustomDebugStringConvertible { 92 | /// The debug textual representation used when written to an output stream, which includes whether the result was a 93 | /// success or failure in addition to the value or error. 94 | public var debugDescription: String { 95 | switch self { 96 | case .success(let value): 97 | return "SUCCESS: \(value)" 98 | case .failure(let error): 99 | return "FAILURE: \(error)" 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Wei Wang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Kingfisher 4 | 5 |

6 | 7 |

8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | codebeat badge 22 | 23 | 24 | 25 | 26 |

27 | 28 | Kingfisher is a lightweight, pure-Swift library for downloading and caching images from the web. This project is heavily inspired by the popular [SDWebImage](https://github.com/rs/SDWebImage). It provides you a chance to use a pure-Swift alternative in your next app. 29 | 30 | ## Features 31 | 32 | - [x] Asynchronous image downloading and caching. 33 | - [x] `URLSession`-based networking. Basic image processors and filters supplied. 34 | - [x] Multiple-layer cache for both memory and disk. 35 | - [x] Cancelable downloading and processing tasks to improve performance. 36 | - [x] Independent components. Use the downloader or caching system separately as you need. 37 | - [x] Prefetching images and showing them from cache later when necessary. 38 | - [x] Extensions for `UIImageView`, `NSImage` and `UIButton` to directly set an image from a URL. 39 | - [x] Built-in transition animation when setting images. 40 | - [x] Extensible image processing and image format support. 41 | 42 | The simplest use-case is setting an image to an image view with the `UIImageView` extension: 43 | 44 | ```swift 45 | let url = URL(string: "url_of_your_image") 46 | imageView.kf.setImage(with: url) 47 | ``` 48 | 49 | Kingfisher will download the image from `url`, send it to both the memory cache and the disk cache, and display it in `imageView`. When you use the same code later, the image will be retrieved from cache and shown immediately. 50 | 51 | ## Requirements 52 | 53 | - iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ 54 | - Swift 3 (Kingfisher 3.x), Swift 2.3 (Kingfisher 2.x) 55 | 56 | Main development of Kingfisher will support Swift 3. Only critical bug fixes will be made for Kingfisher 2.x. 57 | 58 | [Kingfisher 3.0 Migration Guide](https://github.com/onevcat/Kingfisher/wiki/Kingfisher-3.0-Migration-Guide) - If you are upgrading to Kingfisher 3.x from an earlier version, please read this for more information. 59 | 60 | ## Next Steps 61 | 62 | We prepared a [wiki page](https://github.com/onevcat/Kingfisher/wiki). You can find tons of useful things there. 63 | 64 | * [Installation Guide](https://github.com/onevcat/Kingfisher/wiki/Installation-Guide) - Follow it to integrate Kingfisher into your project. 65 | * [Cheat Sheet](https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet)- Curious about what Kingfisher could do and how would it look like when used in your project? See this page for useful code snippets. If you are already familiar with Kingfisher, you could also learn new tricks to improve the way you use Kingfisher! 66 | * [API Reference](http://cocoadocs.org/docsets/Kingfisher/) - Lastly, please remember to read the full whenever you may need a more detailed reference. 67 | 68 | ## Other 69 | 70 | ### Future of Kingfisher 71 | 72 | I want to keep Kingfisher lightweight. This framework will focus on providing a simple solution for downloading and caching images. This doesn’t mean the framework can’t be improved. Kingfisher is far from perfect, so necessary and useful updates will be made to make it better. 73 | 74 | ### About the logo 75 | 76 | The logo of Kingfisher is inspired by [Tangram (七巧板)](http://en.wikipedia.org/wiki/Tangram), a dissection puzzle consisting of seven flat shapes from China. I believe she's a kingfisher bird instead of a swift, but someone insists that she is a pigeon. I guess I should give her a name. Hi, guys, do you have any suggestions? 77 | 78 | ### Contact 79 | 80 | Follow and contact me on [Twitter](http://twitter.com/onevcat) or [Sina Weibo](http://weibo.com/onevcat). If you find an issue, just [open a ticket](https://github.com/onevcat/Kingfisher/issues/new). Pull requests are warmly welcome as well. 81 | 82 | ### License 83 | 84 | Kingfisher is released under the MIT license. See LICENSE for details. 85 | 86 | 87 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/Box.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Box.swift 3 | // Kingfisher 4 | // 5 | // Created by WANG WEI on 2016/09/12. 6 | // Copyright © 2016年 Wei Wang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Box { 12 | let value: T 13 | init(value: T) { 14 | self.value = value 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/CacheSerializer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CacheSerializer.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 2016/09/02. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | 29 | /// An `CacheSerializer` would be used to convert some data to an image object for 30 | /// retrieving from disk cache and vice versa for storing to disk cache. 31 | public protocol CacheSerializer { 32 | 33 | /// Get the serialized data from a provided image 34 | /// and optional original data for caching to disk. 35 | /// 36 | /// 37 | /// - parameter image: The image needed to be serialized. 38 | /// - parameter original: The original data which is just downloaded. 39 | /// If the image is retrieved from cache instead of 40 | /// downloaded, it will be `nil`. 41 | /// 42 | /// - returns: A data which will be stored to cache, or `nil` when no valid 43 | /// data could be serialized. 44 | func data(with image: Image, original: Data?) -> Data? 45 | 46 | /// Get an image deserialized from provided data. 47 | /// 48 | /// - parameter data: The data from which an image should be deserialized. 49 | /// - parameter options: Options for deserialization. 50 | /// 51 | /// - returns: An image deserialized or `nil` when no valid image 52 | /// could be deserialized. 53 | func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? 54 | } 55 | 56 | 57 | /// `DefaultCacheSerializer` is a basic `CacheSerializer` used in default cache of 58 | /// Kingfisher. It could serialize and deserialize PNG, JEPG and GIF images. For 59 | /// image other than these formats, a normalized `pngRepresentation` will be used. 60 | public struct DefaultCacheSerializer: CacheSerializer { 61 | 62 | public static let `default` = DefaultCacheSerializer() 63 | private init() {} 64 | 65 | public func data(with image: Image, original: Data?) -> Data? { 66 | let imageFormat = original?.kf.imageFormat ?? .unknown 67 | 68 | let data: Data? 69 | switch imageFormat { 70 | case .PNG: data = image.kf.pngRepresentation() 71 | case .JPEG: data = image.kf.jpegRepresentation(compressionQuality: 1.0) 72 | case .GIF: data = image.kf.gifRepresentation() 73 | case .unknown: data = original ?? image.kf.normalized.kf.pngRepresentation() 74 | } 75 | 76 | return data 77 | } 78 | 79 | public func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? { 80 | let scale = (options ?? KingfisherEmptyOptionsInfo).scaleFactor 81 | let preloadAllGIFData = (options ?? KingfisherEmptyOptionsInfo).preloadAllGIFData 82 | 83 | return Kingfisher.image(data: data, scale: scale, preloadAllGIFData: preloadAllGIFData) 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/ImageTransition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageTransition.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 15/9/18. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | #if os(macOS) 28 | // Not implemented for macOS and watchOS yet. 29 | 30 | import AppKit 31 | 32 | /// Image transition is not supported on macOS. 33 | public enum ImageTransition { 34 | case none 35 | var duration: TimeInterval { 36 | return 0 37 | } 38 | } 39 | 40 | #elseif os(watchOS) 41 | import UIKit 42 | /// Image transition is not supported on watchOS. 43 | public enum ImageTransition { 44 | case none 45 | var duration: TimeInterval { 46 | return 0 47 | } 48 | } 49 | #else 50 | import UIKit 51 | 52 | /** 53 | Transition effect which will be used when an image downloaded and set by `UIImageView` extension API in Kingfisher. 54 | You can assign an enum value with transition duration as an item in `KingfisherOptionsInfo` 55 | to enable the animation transition. 56 | 57 | Apple's UIViewAnimationOptions is used under the hood. 58 | For custom transition, you should specified your own transition options, animations and 59 | comletion handler as well. 60 | */ 61 | public enum ImageTransition { 62 | /// No animation transistion. 63 | case none 64 | 65 | /// Fade in the loaded image. 66 | case fade(TimeInterval) 67 | 68 | /// Flip from left transition. 69 | case flipFromLeft(TimeInterval) 70 | 71 | /// Flip from right transition. 72 | case flipFromRight(TimeInterval) 73 | 74 | /// Flip from top transition. 75 | case flipFromTop(TimeInterval) 76 | 77 | /// Flip from bottom transition. 78 | case flipFromBottom(TimeInterval) 79 | 80 | /// Custom transition. 81 | case custom(duration: TimeInterval, 82 | options: UIViewAnimationOptions, 83 | animations: ((UIImageView, UIImage) -> Void)?, 84 | completion: ((Bool) -> Void)?) 85 | 86 | var duration: TimeInterval { 87 | switch self { 88 | case .none: return 0 89 | case .fade(let duration): return duration 90 | 91 | case .flipFromLeft(let duration): return duration 92 | case .flipFromRight(let duration): return duration 93 | case .flipFromTop(let duration): return duration 94 | case .flipFromBottom(let duration): return duration 95 | 96 | case .custom(let duration, _, _, _): return duration 97 | } 98 | } 99 | 100 | var animationOptions: UIViewAnimationOptions { 101 | switch self { 102 | case .none: return [] 103 | case .fade(_): return .transitionCrossDissolve 104 | 105 | case .flipFromLeft(_): return .transitionFlipFromLeft 106 | case .flipFromRight(_): return .transitionFlipFromRight 107 | case .flipFromTop(_): return .transitionFlipFromTop 108 | case .flipFromBottom(_): return .transitionFlipFromBottom 109 | 110 | case .custom(_, let options, _, _): return options 111 | } 112 | } 113 | 114 | var animations: ((UIImageView, UIImage) -> Void)? { 115 | switch self { 116 | case .custom(_, _, let animations, _): return animations 117 | default: return { $0.image = $1 } 118 | } 119 | } 120 | 121 | var completion: ((Bool) -> Void)? { 122 | switch self { 123 | case .custom(_, _, _, let completion): return completion 124 | default: return nil 125 | } 126 | } 127 | } 128 | #endif 129 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/Kingfisher.h: -------------------------------------------------------------------------------- 1 | // 2 | // Kingfisher.h 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 15/4/6. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | #import 28 | 29 | //! Project version number for Kingfisher. 30 | FOUNDATION_EXPORT double KingfisherVersionNumber; 31 | 32 | //! Project version string for Kingfisher. 33 | FOUNDATION_EXPORT const unsigned char KingfisherVersionString[]; 34 | 35 | // In this header, you should import all the public headers of your framework using statements like #import 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/Kingfisher.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Kingfisher.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 16/9/14. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | import ImageIO 29 | 30 | #if os(macOS) 31 | import AppKit 32 | public typealias Image = NSImage 33 | public typealias Color = NSColor 34 | public typealias ImageView = NSImageView 35 | typealias Button = NSButton 36 | #else 37 | import UIKit 38 | public typealias Image = UIImage 39 | public typealias Color = UIColor 40 | #if !os(watchOS) 41 | public typealias ImageView = UIImageView 42 | typealias Button = UIButton 43 | #endif 44 | #endif 45 | 46 | public final class Kingfisher { 47 | public let base: Base 48 | public init(_ base: Base) { 49 | self.base = base 50 | } 51 | } 52 | 53 | /** 54 | A type that has Kingfisher extensions. 55 | */ 56 | public protocol KingfisherCompatible { 57 | associatedtype CompatibleType 58 | var kf: CompatibleType { get } 59 | } 60 | 61 | public extension KingfisherCompatible { 62 | public var kf: Kingfisher { 63 | get { return Kingfisher(self) } 64 | } 65 | } 66 | 67 | extension Image: KingfisherCompatible { } 68 | #if !os(watchOS) 69 | extension ImageView: KingfisherCompatible { } 70 | extension Button: KingfisherCompatible { } 71 | #endif 72 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/RequrstModifier.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequrstModifier.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 2016/09/05. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | 29 | /// Request modifier of image downloader. 30 | public protocol ImageDownloadRequestModifier { 31 | func modified(for request: URLRequest) -> URLRequest? 32 | } 33 | 34 | struct NoModifier: ImageDownloadRequestModifier { 35 | static let `default` = NoModifier() 36 | private init() {} 37 | func modified(for request: URLRequest) -> URLRequest? { 38 | return request 39 | } 40 | } 41 | 42 | public struct AnyModifier: ImageDownloadRequestModifier { 43 | 44 | let block: (URLRequest) -> URLRequest? 45 | 46 | public func modified(for request: URLRequest) -> URLRequest? { 47 | return block(request) 48 | } 49 | 50 | public init(modify: @escaping (URLRequest) -> URLRequest? ) { 51 | block = modify 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/Resource.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Resource.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 15/4/6. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | 29 | 30 | /// `Resource` protocol defines how to download and cache a resource from network. 31 | public protocol Resource { 32 | /// The key used in cache. 33 | var cacheKey: String { get } 34 | 35 | /// The target image URL. 36 | var downloadURL: URL { get } 37 | } 38 | 39 | /** 40 | ImageResource is a simple combination of `downloadURL` and `cacheKey`. 41 | 42 | When passed to image view set methods, Kingfisher will try to download the target 43 | image from the `downloadURL`, and then store it with the `cacheKey` as the key in cache. 44 | */ 45 | public struct ImageResource: Resource { 46 | /// The key used in cache. 47 | public let cacheKey: String 48 | 49 | /// The target image URL. 50 | public let downloadURL: URL 51 | 52 | /** 53 | Create a resource. 54 | 55 | - parameter downloadURL: The target image URL. 56 | - parameter cacheKey: The cache key. If `nil`, Kingfisher will use the `absoluteString` of `downloadURL` as the key. 57 | 58 | - returns: A resource. 59 | */ 60 | public init(downloadURL: URL, cacheKey: String? = nil) { 61 | self.downloadURL = downloadURL 62 | self.cacheKey = cacheKey ?? downloadURL.absoluteString 63 | } 64 | } 65 | 66 | /** 67 | URL conforms to `Resource` in Kingfisher. 68 | The `absoluteString` of this URL is used as `cacheKey`. And the URL itself will be used as `downloadURL`. 69 | If you need customize the url and/or cache key, use `ImageResource` instead. 70 | */ 71 | extension URL: Resource { 72 | public var cacheKey: String { return absoluteString } 73 | public var downloadURL: URL { return self } 74 | } 75 | -------------------------------------------------------------------------------- /DYTV/Pods/Kingfisher/Sources/ThreadHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThreadHelper.swift 3 | // Kingfisher 4 | // 5 | // Created by Wei Wang on 15/10/9. 6 | // 7 | // Copyright (c) 2016 Wei Wang 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | 27 | import Foundation 28 | 29 | extension DispatchQueue { 30 | // This method will dispatch the `block` to self. 31 | // If `self` is the main queue, and current thread is main thread, the block 32 | // will be invoked immediately instead of being dispatched. 33 | func safeAsync(_ block: @escaping ()->()) { 34 | if self === DispatchQueue.main && Thread.isMainThread { 35 | block() 36 | } else { 37 | async { block() } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /DYTV/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.0.1) 3 | - Kingfisher (3.1.3) 4 | 5 | DEPENDENCIES: 6 | - Alamofire (~> 4.0.1) 7 | - Kingfisher (~> 3.1.3) 8 | 9 | SPEC CHECKSUMS: 10 | Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 11 | Kingfisher: 007f5851c18c81e7cc106c9cbac1bafea1cce5dc 12 | 13 | PODFILE CHECKSUM: a112dddb869d14b0740c964dc98439aa4e83d52c 14 | 15 | COCOAPODS: 1.0.1 16 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Alamofire-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Alamofire : NSObject 3 | @end 4 | @implementation PodsDummy_Alamofire 5 | @end 6 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double AlamofireVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Alamofire.modulemap: -------------------------------------------------------------------------------- 1 | framework module Alamofire { 2 | umbrella header "Alamofire-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Alamofire.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Alamofire 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Alamofire/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 3.1.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Kingfisher : NSObject 3 | @end 4 | @implementation PodsDummy_Kingfisher 5 | @end 6 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "Kingfisher.h" 4 | 5 | FOUNDATION_EXPORT double KingfisherVersionNumber; 6 | FOUNDATION_EXPORT const unsigned char KingfisherVersionString[]; 7 | 8 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap: -------------------------------------------------------------------------------- 1 | framework module Kingfisher { 2 | umbrella header "Kingfisher-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Kingfisher 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_LDFLAGS = -framework "CFNetwork" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | SWIFT_VERSION = 3.0 12 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Alamofire 5 | 6 | Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | 27 | ## Kingfisher 28 | 29 | The MIT License (MIT) 30 | 31 | Copyright (c) 2015 Wei Wang 32 | 33 | Permission is hereby granted, free of charge, to any person obtaining a copy 34 | of this software and associated documentation files (the "Software"), to deal 35 | in the Software without restriction, including without limitation the rights 36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 37 | copies of the Software, and to permit persons to whom the Software is 38 | furnished to do so, subject to the following conditions: 39 | 40 | The above copyright notice and this permission notice shall be included in all 41 | copies or substantial portions of the Software. 42 | 43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 49 | SOFTWARE. 50 | 51 | 52 | Generated by CocoaPods - https://cocoapods.org 53 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | Alamofire 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | The MIT License (MIT) 45 | 46 | Copyright (c) 2015 Wei Wang 47 | 48 | Permission is hereby granted, free of charge, to any person obtaining a copy 49 | of this software and associated documentation files (the "Software"), to deal 50 | in the Software without restriction, including without limitation the rights 51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the Software is 53 | furnished to do so, subject to the following conditions: 54 | 55 | The above copyright notice and this permission notice shall be included in all 56 | copies or substantial portions of the Software. 57 | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 64 | SOFTWARE. 65 | 66 | 67 | Title 68 | Kingfisher 69 | Type 70 | PSGroupSpecifier 71 | 72 | 73 | FooterText 74 | Generated by CocoaPods - https://cocoapods.org 75 | Title 76 | 77 | Type 78 | PSGroupSpecifier 79 | 80 | 81 | StringsTable 82 | Acknowledgements 83 | Title 84 | Acknowledgements 85 | 86 | 87 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_DYTV : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_DYTV 5 | @end 6 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" 88 | install_framework "$BUILT_PRODUCTS_DIR/Kingfisher/Kingfisher.framework" 89 | fi 90 | if [[ "$CONFIGURATION" == "Release" ]]; then 91 | install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" 92 | install_framework "$BUILT_PRODUCTS_DIR/Kingfisher/Kingfisher.framework" 93 | fi 94 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | *) 22 | TARGET_DEVICE_ARGS="--target-device mac" 23 | ;; 24 | esac 25 | 26 | realpath() { 27 | DIRECTORY="$(cd "${1%/*}" && pwd)" 28 | FILENAME="${1##*/}" 29 | echo "$DIRECTORY/$FILENAME" 30 | } 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_DYTVVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_DYTVVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV.debug.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher/Kingfisher.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Kingfisher" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_DYTV { 2 | umbrella header "Pods-DYTV-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /DYTV/Pods/Target Support Files/Pods-DYTV/Pods-DYTV.release.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher/Kingfisher.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Kingfisher" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2016 coderLL DYTV Software Foundation 2 | Permission is hereby granted, free of charge, to any person obtaining a copy 3 | of this software and associated documentation files (the "Software"), to deal 4 | in the Software without restriction, including without limitation the rights 5 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 6 | copies of the Software, and to permit persons to whom the Software is 7 | furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in 10 | all copies or substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 高仿 | 斗鱼TV 2 | - An project of DouYuTV 3 | - Continues updating 4 | 5 | ## Current progress Preview 6 | > 进度截图 7 | 8 | 图片1-1 9 | 图片1-2 10 | 图片1-3 11 | 图片1-4 12 | 图片1-5 13 | 图2-1 14 | 图2-2 15 | 图2-3 16 | 图2-4 17 | 18 | ## 后期持续更新... 19 | 20 | -------------------------------------------------------------------------------- /photos/1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/1-1.png -------------------------------------------------------------------------------- /photos/1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/1-2.png -------------------------------------------------------------------------------- /photos/1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/1-3.png -------------------------------------------------------------------------------- /photos/1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/1-4.png -------------------------------------------------------------------------------- /photos/1-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/1-5.png -------------------------------------------------------------------------------- /photos/2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/2-1.png -------------------------------------------------------------------------------- /photos/2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/2-2.png -------------------------------------------------------------------------------- /photos/2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/2-3.png -------------------------------------------------------------------------------- /photos/2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrazyRoy/DYTV/d36f1a6210610bcb72f81ee447ebbdcea6846b3f/photos/2-4.png --------------------------------------------------------------------------------