├── .gitignore ├── Demo ├── CurveMask.gif ├── QQ.gif ├── TXVideo.gif ├── Taobao.gif └── Youku.gif ├── GTMRefresh.podspec ├── GTMRefresh.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── luoyang.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── GTMRefresh.xcscheme │ ├── GTMRefreshExample.xcscheme │ └── xcschememanagement.plist ├── GTMRefresh ├── DefaultGTMLoadMoreFooter.swift ├── DefaultGTMRefreshHeader.swift ├── GTMLoadMoreFooter.swift ├── GTMRefreshComponent.swift ├── GTMRefreshConstant.swift ├── GTMRefreshExtension.swift ├── GTMRefreshHeader.swift ├── GTMRefreshStyle.swift ├── Info.plist └── Resource │ ├── Base.lproj │ └── Localize.strings │ ├── arrow_down@3x.png │ ├── en.lproj │ └── Localize.strings │ ├── failure@3x.png │ ├── success@3x.png │ └── zh-Hans.lproj │ └── Localize.strings ├── GTMRefreshExample ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── 1024.png │ │ ├── Contents.json │ │ ├── Icon-120.png │ │ ├── Icon-121.png │ │ ├── Icon-180.png │ │ ├── Icon-40.png │ │ ├── Icon-58.png │ │ ├── Icon-60.png │ │ ├── Icon-80.png │ │ └── Icon-87.png │ ├── Contents.json │ ├── dropdown_anim__0001.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0001@2x.png │ ├── dropdown_anim__00010.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00010@2x.png │ ├── dropdown_anim__00011.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00011@2x.png │ ├── dropdown_anim__00012.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00012@2x.png │ ├── dropdown_anim__00013.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00013@2x.png │ ├── dropdown_anim__00014.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00014@2x.png │ ├── dropdown_anim__00015.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00015@2x.png │ ├── dropdown_anim__00016.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00016@2x.png │ ├── dropdown_anim__00017.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00017@2x.png │ ├── dropdown_anim__00018.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00018@2x.png │ ├── dropdown_anim__00019.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00019@2x.png │ ├── dropdown_anim__0002.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0002@2x.png │ ├── dropdown_anim__00020.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00020@2x.png │ ├── dropdown_anim__00021.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00021@2x.png │ ├── dropdown_anim__00022.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00022@2x.png │ ├── dropdown_anim__00023.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00023@2x.png │ ├── dropdown_anim__00024.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00024@2x.png │ ├── dropdown_anim__00025.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00025@2x.png │ ├── dropdown_anim__00026.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00026@2x.png │ ├── dropdown_anim__00027.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00027@2x.png │ ├── dropdown_anim__00028.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00028@2x.png │ ├── dropdown_anim__00029.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00029@2x.png │ ├── dropdown_anim__0003.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0003@2x.png │ ├── dropdown_anim__00030.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00030@2x.png │ ├── dropdown_anim__00031.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00031@2x.png │ ├── dropdown_anim__00032.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00032@2x.png │ ├── dropdown_anim__00033.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00033@2x.png │ ├── dropdown_anim__00034.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00034@2x.png │ ├── dropdown_anim__00035.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00035@2x.png │ ├── dropdown_anim__00036.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00036@2x.png │ ├── dropdown_anim__00037.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00037@2x.png │ ├── dropdown_anim__00038.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00038@2x.png │ ├── dropdown_anim__00039.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00039@2x.png │ ├── dropdown_anim__0004.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0004@2x.png │ ├── dropdown_anim__00040.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00040@2x.png │ ├── dropdown_anim__00041.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00041@2x.png │ ├── dropdown_anim__00042.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00042@2x.png │ ├── dropdown_anim__00043.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00043@2x.png │ ├── dropdown_anim__00044.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00044@2x.png │ ├── dropdown_anim__00045.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00045@2x.png │ ├── dropdown_anim__00046.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00046@2x.png │ ├── dropdown_anim__00047.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00047@2x.png │ ├── dropdown_anim__00048.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00048@2x.png │ ├── dropdown_anim__00049.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00049@2x.png │ ├── dropdown_anim__0005.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0005@2x.png │ ├── dropdown_anim__00050.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00050@2x.png │ ├── dropdown_anim__00051.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00051@2x.png │ ├── dropdown_anim__00052.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00052@2x.png │ ├── dropdown_anim__00053.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00053@2x.png │ ├── dropdown_anim__00054.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00054@2x.png │ ├── dropdown_anim__00055.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00055@2x.png │ ├── dropdown_anim__00056.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00056@2x.png │ ├── dropdown_anim__00057.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00057@2x.png │ ├── dropdown_anim__00058.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00058@2x.png │ ├── dropdown_anim__00059.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00059@2x.png │ ├── dropdown_anim__0006.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0006@2x.png │ ├── dropdown_anim__00060.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__00060@2x.png │ ├── dropdown_anim__0007.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0007@2x.png │ ├── dropdown_anim__0008.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0008@2x.png │ ├── dropdown_anim__0009.imageset │ │ ├── Contents.json │ │ └── dropdown_anim__0009@2x.png │ ├── dropdown_loading_01.imageset │ │ ├── Contents.json │ │ └── dropdown_loading_01@2x.png │ ├── dropdown_loading_02.imageset │ │ ├── Contents.json │ │ └── dropdown_loading_02@2x.png │ └── dropdown_loading_03.imageset │ │ ├── Contents.json │ │ └── dropdown_loading_03@2x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── BaseTableViewController.swift ├── CurveMask │ ├── CurveMaskTableViewController.swift │ ├── CurveRefreshHeader.swift │ └── arrow_downWhite.png ├── Default │ ├── DefaultCollectionViewController.swift │ ├── DefaultScrollViewController.swift │ ├── DefaultTableViewController.swift │ └── DefaultWebViewController.swift ├── DianPing │ ├── DianpingRefreshHeader.swift │ └── DianpingTableviewController.swift ├── Info.plist ├── NavigationController.swift ├── QQRefresh │ ├── QQStyleHeaderViewController.swift │ ├── QQStylePullingIndicator.swift │ └── QQStyleRefreshHeader.swift ├── QQVideo │ ├── QQVideoRefreshHeader.swift │ ├── QQVideoTableViewController.swift │ └── Resource │ │ ├── loading00@2x.png │ │ ├── loading00@3x.png │ │ ├── loading01@2x.png │ │ ├── loading01@3x.png │ │ ├── loading02@2x.png │ │ ├── loading02@3x.png │ │ ├── loading03@2x.png │ │ ├── loading03@3x.png │ │ ├── loading04@2x.png │ │ ├── loading04@3x.png │ │ ├── loading05@2x.png │ │ ├── loading05@3x.png │ │ ├── loading06@2x.png │ │ ├── loading06@3x.png │ │ ├── loading07@2x.png │ │ ├── loading07@3x.png │ │ ├── loading08@2x.png │ │ ├── loading08@3x.png │ │ ├── loading09@2x.png │ │ ├── loading09@3x.png │ │ ├── loading10@2x.png │ │ ├── loading10@3x.png │ │ ├── loading11@2x.png │ │ ├── loading11@3x.png │ │ ├── loading12@2x.png │ │ ├── loading12@3x.png │ │ ├── loading13@2x.png │ │ ├── loading13@3x.png │ │ ├── loading14@2x.png │ │ ├── loading14@3x.png │ │ ├── loading15@2x.png │ │ ├── loading15@3x.png │ │ ├── loading16@2x.png │ │ ├── loading16@3x.png │ │ ├── loading17@2x.png │ │ ├── loading17@3x.png │ │ ├── loading18@2x.png │ │ ├── loading18@3x.png │ │ ├── loading19@2x.png │ │ ├── loading19@3x.png │ │ ├── loading20@2x.png │ │ ├── loading20@3x.png │ │ ├── loading21@2x.png │ │ ├── loading21@3x.png │ │ ├── loading22@2x.png │ │ ├── loading22@3x.png │ │ ├── loading23@2x.png │ │ ├── loading23@3x.png │ │ ├── loading24@2x.png │ │ ├── loading24@3x.png │ │ ├── loading25@2x.png │ │ ├── loading25@3x.png │ │ ├── loading26@2x.png │ │ ├── loading26@3x.png │ │ ├── loading27@2x.png │ │ ├── loading27@3x.png │ │ ├── loading28@2x.png │ │ ├── loading28@3x.png │ │ ├── loading29@2x.png │ │ └── loading29@3x.png ├── SectionModel.swift ├── TaoBao │ ├── TaoBaoRefreshHeader.swift │ ├── TaobaoTableViewController.swift │ └── taobaoLogo.png ├── ViewController.swift ├── Wechat │ ├── WechatRefreshHeader.swift │ ├── WechatRefreshHeaderTestVC.swift │ └── wechat.png ├── YahooWeather │ ├── Resource │ │ ├── sun_00000.png │ │ ├── sun_00001.png │ │ ├── sun_00002.png │ │ ├── sun_00003.png │ │ ├── sun_00004.png │ │ ├── sun_00005.png │ │ ├── sun_00006.png │ │ ├── sun_00007.png │ │ ├── sun_00008.png │ │ ├── sun_00009.png │ │ ├── sun_00010.png │ │ ├── sun_00011.png │ │ ├── sun_00012.png │ │ ├── sun_00013.png │ │ ├── sun_00014.png │ │ ├── sun_00015.png │ │ ├── sun_00016.png │ │ ├── sun_00017.png │ │ ├── sun_00018.png │ │ ├── sun_00019.png │ │ ├── sun_00020.png │ │ ├── sun_00021.png │ │ ├── sun_00022.png │ │ ├── sun_00023.png │ │ ├── sun_00024.png │ │ ├── sun_00025.png │ │ ├── sun_00026.png │ │ ├── sun_00027.png │ │ ├── sun_00028.png │ │ ├── sun_00029.png │ │ ├── sun_00030.png │ │ ├── sun_00031.png │ │ ├── sun_00032.png │ │ ├── sun_00033.png │ │ ├── sun_00034.png │ │ ├── sun_00035.png │ │ ├── sun_00036.png │ │ ├── sun_00037.png │ │ ├── sun_00038.png │ │ ├── sun_00039.png │ │ ├── sun_00040.png │ │ ├── sun_00041.png │ │ ├── sun_00042.png │ │ ├── sun_00043.png │ │ ├── sun_00044.png │ │ ├── sun_00045.png │ │ ├── sun_00046.png │ │ ├── sun_00047.png │ │ ├── sun_00048.png │ │ ├── sun_00049.png │ │ ├── sun_00050.png │ │ ├── sun_00051.png │ │ ├── sun_00052.png │ │ ├── sun_00053.png │ │ ├── sun_00054.png │ │ ├── sun_00055.png │ │ ├── sun_00056.png │ │ ├── sun_00057.png │ │ ├── sun_00058.png │ │ ├── sun_00059.png │ │ ├── sun_00060.png │ │ ├── sun_00061.png │ │ ├── sun_00062.png │ │ ├── sun_00063.png │ │ ├── sun_00064.png │ │ ├── sun_00065.png │ │ ├── sun_00066.png │ │ ├── sun_00067.png │ │ ├── sun_00068.png │ │ ├── sun_00069.png │ │ ├── sun_00070.png │ │ ├── sun_00071.png │ │ ├── sun_00072.png │ │ ├── sun_00073.png │ │ ├── sun_00074.png │ │ ├── sun_00075.png │ │ ├── sun_00076.png │ │ ├── sun_00077.png │ │ ├── sun_00078.png │ │ ├── sun_00079.png │ │ ├── sun_00080.png │ │ ├── sun_00081.png │ │ ├── sun_00082.png │ │ ├── sun_00083.png │ │ ├── sun_00084.png │ │ ├── sun_00085.png │ │ ├── sun_00086.png │ │ ├── sun_00087.png │ │ ├── sun_00088.png │ │ ├── sun_00089.png │ │ ├── sun_00090.png │ │ ├── sun_00091.png │ │ ├── sun_00092.png │ │ ├── sun_00093.png │ │ ├── sun_00094.png │ │ ├── sun_00095.png │ │ ├── sun_00096.png │ │ ├── sun_00097.png │ │ ├── sun_00098.png │ │ ├── sun_00099.png │ │ ├── sun_00100.png │ │ ├── sun_00101.png │ │ ├── sun_00102.png │ │ ├── sun_00103.png │ │ ├── sun_00104.png │ │ ├── sun_00105.png │ │ ├── sun_00106.png │ │ ├── sun_00107.png │ │ ├── sun_00108.png │ │ ├── sun_00109.png │ │ └── yahoo_logo@3x.png │ ├── YahooWeatherRefreshHeader.swift │ └── YahooWeatherTableViewController.swift └── YouKu │ ├── YoukuRefreshHeader.swift │ ├── YoukuTableViewController.swift │ ├── youku_ad.jpeg │ ├── youku_down@3x.png │ └── youku_refreshing@3x.png ├── LICENSE ├── README.md └── logo.png /.gitignore: -------------------------------------------------------------------------------- 1 | #CocoaPods 2 | 3 | Pods/ 4 | 5 | 6 | # Xcode 7 | 8 | # 9 | 10 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore &Swift.gitignore 11 | 12 | # Mac OS X Finder and whatnot 13 | 14 | .DS_Store 15 | 16 | ## Build generated 17 | 18 | build/DerivedData/ 19 | 20 | ## Various settings 21 | 22 | *.pbxuser!default.pbxuser 23 | 24 | *.mode1v3!default.mode1v3 25 | 26 | *.mode2v3!default.mode2v3 27 | 28 | *.perspectivev3!default.perspectivev3 29 | 30 | xcuserdata/ 31 | 32 | ## Other 33 | 34 | *.moved-aside 35 | 36 | *.xcuserstate 37 | 38 | *.xccheckout 39 | 40 | ## Obj-C/Swift specific 41 | 42 | *.hmap 43 | 44 | *.ipa 45 | 46 | *.dSYM.zip 47 | 48 | *.dSYM -------------------------------------------------------------------------------- /Demo/CurveMask.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/Demo/CurveMask.gif -------------------------------------------------------------------------------- /Demo/QQ.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/Demo/QQ.gif -------------------------------------------------------------------------------- /Demo/TXVideo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/Demo/TXVideo.gif -------------------------------------------------------------------------------- /Demo/Taobao.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/Demo/Taobao.gif -------------------------------------------------------------------------------- /Demo/Youku.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/Demo/Youku.gif -------------------------------------------------------------------------------- /GTMRefresh.podspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pod::Spec.new do |s| 4 | 5 | s.name = "GTMRefresh" 6 | s.version = "1.3.9" 7 | s.summary = "swift 实现的上拉刷新,下拉加载动效库" 8 | s.swift_version= "5.1" 9 | 10 | s.homepage = "https://github.com/GTMYang/GTMRefresh" 11 | 12 | s.license = { :type => "MIT", :file => "LICENSE" } 13 | s.author = { "GTMYang" => "17757128523@163.com" } 14 | 15 | 16 | s.source = { :git => "https://github.com/GTMYang/GTMRefresh.git", :tag => s.version } 17 | s.source_files = "GTMRefresh/*.{h,swift}" 18 | s.resources = 'GTMRefresh/Resource/**/*' 19 | 20 | s.ios.deployment_target = "8.0" 21 | s.frameworks = "UIKit" 22 | 23 | end 24 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/xcuserdata/luoyang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/xcuserdata/luoyang.xcuserdatad/xcschemes/GTMRefresh.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/xcuserdata/luoyang.xcuserdatad/xcschemes/GTMRefreshExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /GTMRefresh.xcodeproj/xcuserdata/luoyang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | GTMRefresh.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | GTMRefreshExample.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 267115411DF6AE0D00F27CEA 21 | 22 | primary 23 | 24 | 25 | 267115571DF6AEAA00F27CEA 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /GTMRefresh/DefaultGTMLoadMoreFooter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultGTMLoadMoreFooter.swift 3 | // GTMRefresh 4 | // 5 | // Created by 骆扬 on 2019/12/30. 6 | // Copyright © 2019 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | public class DefaultGTMLoadMoreFooter: GTMLoadMoreFooter, SubGTMLoadMoreFooterProtocol { 13 | 14 | var pullUpToRefreshText: String = GTMRLocalize("pullUpToRefresh") 15 | public var loaddingText: String = GTMRLocalize("loadMore") 16 | public var noMoreDataText: String = GTMRLocalize("noMoreData") 17 | public var releaseLoadMoreText: String = GTMRLocalize("releaseLoadMore") 18 | 19 | var txtColor: UIColor? { 20 | didSet { 21 | if let color = txtColor { 22 | self.messageLabel.textColor = color 23 | } 24 | } 25 | } 26 | var idleImage: UIImage? { 27 | didSet { 28 | if let idleImg = idleImage { 29 | self.pullingIndicator.image = idleImg 30 | } 31 | } 32 | } 33 | 34 | 35 | lazy var pullingIndicator: UIImageView = { 36 | let pindicator = UIImageView() 37 | if let img = self.idleImage { 38 | pindicator.image = img 39 | } else { 40 | pindicator.image = UIImage(named: "arrow_down", in: Bundle(for: GTMLoadMoreFooter.self), compatibleWith: nil) 41 | } 42 | return pindicator 43 | }() 44 | 45 | lazy var loaddingIndicator: UIActivityIndicatorView = { 46 | let indicator = UIActivityIndicatorView() 47 | indicator.hidesWhenStopped = true 48 | indicator.style = .gray 49 | //indicator.backgroundColor = UIColor.white 50 | 51 | return indicator 52 | }() 53 | 54 | lazy var messageLabel: UILabel = { 55 | let label = UILabel() 56 | label.textAlignment = .center 57 | label.font = UIFont.systemFont(ofSize: 15) 58 | 59 | return label 60 | }() 61 | 62 | // MARK: Life Cycle 63 | 64 | override init(frame: CGRect) { 65 | super.init(frame: frame) 66 | 67 | self.contentView.addSubview(self.messageLabel) 68 | self.contentView.addSubview(self.pullingIndicator) 69 | self.contentView.addSubview(self.loaddingIndicator) 70 | } 71 | 72 | required public init?(coder aDecoder: NSCoder) { 73 | fatalError("init(coder:) has not been implemented") 74 | } 75 | 76 | override public func willMove(toSuperview newSuperview: UIView?) { 77 | super.willMove(toSuperview: newSuperview) 78 | 79 | guard newSuperview != nil else { 80 | return 81 | } 82 | 83 | self.pullingIndicator.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+0.000001)) 84 | } 85 | 86 | // MARK: Layout 87 | 88 | override public func layoutSubviews() { 89 | super.layoutSubviews() 90 | 91 | let center = CGPoint(x: frame.width * 0.5 - 70 - 30, y: frame.height * 0.5) 92 | pullingIndicator.frame = CGRect(x: 0, y: 0, width: 20, height: 20) 93 | pullingIndicator.mj_center = center 94 | 95 | loaddingIndicator.frame = CGRect(x: 0, y: 0, width: 20, height: 20) 96 | loaddingIndicator.mj_center = center 97 | messageLabel.frame = self.bounds 98 | } 99 | 100 | // MARK: SubGTMLoadMoreFooterProtocol 101 | 102 | /// 控件的高度 103 | /// 104 | /// - Returns: 控件的高度 105 | public func contentHeith() -> CGFloat { 106 | return 50.0 107 | } 108 | 109 | public func toNormalState() { 110 | self.pullingIndicator.isHidden = false 111 | self.loaddingIndicator.isHidden = true 112 | self.loaddingIndicator.stopAnimating() 113 | 114 | self.messageLabel.text = self.pullUpToRefreshText 115 | // print(".........\(self.messageLabel.text ?? "")") 116 | UIView.animate(withDuration: 0.4, animations: { 117 | self.pullingIndicator.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+0.000001)) 118 | }) 119 | } 120 | public func toNoMoreDataState() { 121 | self.pullingIndicator.isHidden = true 122 | self.loaddingIndicator.isHidden = true 123 | self.loaddingIndicator.stopAnimating() 124 | 125 | self.messageLabel.text = self.noMoreDataText 126 | } 127 | public func toWillRefreshState() { 128 | messageLabel.text = self.releaseLoadMoreText 129 | UIView.animate(withDuration: 0.4, animations: { 130 | self.pullingIndicator.transform = CGAffineTransform.identity 131 | }) 132 | } 133 | public func toRefreshingState() { 134 | self.pullingIndicator.isHidden = true 135 | self.loaddingIndicator.isHidden = false 136 | self.loaddingIndicator.startAnimating() 137 | 138 | messageLabel.text = self.loaddingText 139 | } 140 | 141 | } 142 | -------------------------------------------------------------------------------- /GTMRefresh/GTMRefreshComponent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GTMRefreshComponent.swift 3 | // GTMRefresh 4 | // 5 | // Created by luoyang on 2016/12/7. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// 状态枚举 12 | /// 13 | /// - idle: 闲置 14 | /// - pulling: 可以进行刷新 15 | /// - refreshing: 正在刷新 16 | /// - willRefresh: 即将刷新 17 | /// - noMoreData: 没有更多数据 18 | public enum GTMRefreshState { 19 | case idle // 闲置 20 | case pulling // 可以进行刷新 21 | case refreshing // 正在刷新 22 | case willRefresh // 即将刷新 23 | case noMoreData // 没有更多数据 24 | } 25 | 26 | public protocol SubGTMRefreshComponentProtocol { 27 | func scollViewContentOffsetDidChange(change: [NSKeyValueChangeKey : Any]?) 28 | func scollViewContentSizeDidChange(change: [NSKeyValueChangeKey : Any]?) 29 | } 30 | 31 | open class GTMRefreshComponent: UIView { 32 | 33 | public weak var scrollView: UIScrollView? 34 | 35 | public var scrollViewOriginalInset: UIEdgeInsets? 36 | 37 | var state: GTMRefreshState = .idle 38 | 39 | // MARK: Life Cycle 40 | 41 | override init(frame: CGRect) { 42 | super.init(frame: frame) 43 | setup() 44 | } 45 | 46 | required public init?(coder aDecoder: NSCoder) { 47 | super.init(coder: aDecoder) 48 | setup() 49 | } 50 | 51 | func setup() { 52 | self.autoresizingMask = UIView.AutoresizingMask.flexibleWidth 53 | self.backgroundColor = UIColor.clear 54 | 55 | self.state = .idle 56 | } 57 | 58 | override open func draw(_ rect: CGRect) { 59 | super.draw(rect) 60 | 61 | if self.state == .willRefresh { 62 | // 预防view还没显示出来就调用了beginRefreshing 63 | self.state = .refreshing 64 | } 65 | } 66 | 67 | deinit { 68 | if GTMRefreshConstant.debug { print("GTMRefreshComponent excute deinit() ... ")} 69 | } 70 | 71 | override open func willMove(toSuperview newSuperview: UIView?) { 72 | super.willMove(toSuperview: newSuperview) 73 | 74 | guard let scrollView = newSuperview as? UIScrollView else { 75 | return 76 | } 77 | 78 | self.mj_x = 0 79 | self.mj_w = scrollView.mj_w 80 | 81 | self.scrollView = scrollView 82 | // 设置永远支持垂直弹簧效果 83 | self.scrollView?.alwaysBounceVertical = true 84 | self.scrollViewOriginalInset = scrollView.mj_inset 85 | 86 | } 87 | 88 | open override func willMove(toWindow newWindow: UIWindow?) { 89 | super.willMove(toWindow: newWindow) 90 | 91 | if newWindow != nil { 92 | self.addObserver() 93 | } else { 94 | self.removeAbserver() 95 | } 96 | } 97 | 98 | 99 | // MARK: KVO 100 | 101 | private func addObserver() { 102 | if GTMRefreshConstant.debug { print("GTMRefresh -> addObserver ... ")} 103 | scrollView?.addObserver(self, forKeyPath: GTMRefreshConstant.keyPathContentOffset, options: .new, context: nil) 104 | scrollView?.addObserver(self, forKeyPath: GTMRefreshConstant.keyPathContentSize, options: .new, context: nil) 105 | } 106 | 107 | private func removeAbserver() { 108 | if GTMRefreshConstant.debug { print("GTMRefresh -> removeAbserver ... ")} 109 | scrollView?.removeObserver(self, forKeyPath: GTMRefreshConstant.keyPathContentOffset) 110 | scrollView?.removeObserver(self, forKeyPath: GTMRefreshConstant.keyPathContentSize) 111 | } 112 | 113 | override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 114 | guard isUserInteractionEnabled else { 115 | return 116 | } 117 | 118 | if let sub: SubGTMRefreshComponentProtocol = self as? SubGTMRefreshComponentProtocol { 119 | if keyPath == GTMRefreshConstant.keyPathContentSize { 120 | sub.scollViewContentSizeDidChange(change: change) 121 | } 122 | 123 | if self.isHidden { 124 | return 125 | } 126 | 127 | if keyPath == GTMRefreshConstant.keyPathContentOffset { 128 | sub.scollViewContentOffsetDidChange(change: change) 129 | } 130 | 131 | } 132 | } 133 | 134 | 135 | 136 | } 137 | -------------------------------------------------------------------------------- /GTMRefresh/GTMRefreshConstant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GTMRefreshConstant.swift 3 | // GTMRefresh 4 | // 5 | // Created by luoyang on 2016/12/7. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class GTMRefreshConstant { 12 | static let slowAnimationDuration: TimeInterval = 0.4 13 | static let fastAnimationDuration: TimeInterval = 0.25 14 | 15 | 16 | static let keyPathContentOffset: String = "contentOffset" 17 | static let keyPathContentInset: String = "contentInset" 18 | static let keyPathContentSize: String = "contentSize" 19 | // static let keyPathPanState: String = "state" 20 | 21 | 22 | static var associatedObjectGtmHeader = 0 23 | static var associatedObjectGtmFooter = 1 24 | 25 | static let debug = false 26 | } 27 | 28 | public func GTMRLocalize(_ string:String)->String{ 29 | return NSLocalizedString(string, tableName: "Localize", bundle: Bundle(for: DefaultGTMRefreshHeader.self), value: "", comment: "") 30 | } 31 | public struct GTMRHeaderString{ 32 | static public let pullDownToRefresh = GTMRLocalize("pullDownToRefresh") 33 | static public let releaseToRefresh = GTMRLocalize("releaseToRefresh") 34 | static public let refreshSuccess = GTMRLocalize("refreshSuccess") 35 | static public let refreshFailure = GTMRLocalize("refreshFailure") 36 | static public let refreshing = GTMRLocalize("refreshing") 37 | } 38 | 39 | public struct GTMRFooterString{ 40 | static public let pullUpToRefresh = GTMRLocalize("pullUpToRefresh") 41 | static public let loadding = GTMRLocalize("loadMore") 42 | static public let noMoreData = GTMRLocalize("noMoreData") 43 | static public let releaseLoadMore = GTMRLocalize("releaseLoadMore") 44 | //static public let scrollAndTapToRefresh = GTMRLocalize("scrollAndTapToRefresh") 45 | } 46 | -------------------------------------------------------------------------------- /GTMRefresh/GTMRefreshStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GTMRefreshStyle.swift 3 | // GTMRefresh 4 | // 5 | // Created by luoyang on 2017/8/8. 6 | // Copyright © 2017年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIScrollView { 12 | 13 | // MARK: - 自定义 header 文字 14 | @discardableResult 15 | final public func pullDownToRefreshText(_ text: String) -> UIScrollView { 16 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 17 | header.pullDownToRefresh = text 18 | } 19 | return self 20 | } 21 | @discardableResult 22 | final public func releaseToRefreshText(_ text: String) -> UIScrollView { 23 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 24 | header.releaseToRefresh = text 25 | } 26 | return self 27 | } 28 | @discardableResult 29 | final public func refreshSuccessText(_ text: String) -> UIScrollView { 30 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 31 | header.refreshSuccess = text 32 | } 33 | return self 34 | } 35 | @discardableResult 36 | final public func refreshFailureText(_ text: String) -> UIScrollView { 37 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 38 | header.refreshFailure = text 39 | } 40 | return self 41 | } 42 | @discardableResult 43 | final public func refreshingText(_ text: String) -> UIScrollView { 44 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 45 | header.refreshing = text 46 | } 47 | return self 48 | } 49 | 50 | 51 | //MARK: - 自定义 footer 文字 52 | @discardableResult 53 | final public func pullUpToRefreshText(_ text: String) -> UIScrollView { 54 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 55 | footer.pullUpToRefreshText = text 56 | } 57 | return self 58 | } 59 | @discardableResult 60 | final public func loaddingText(_ text: String) -> UIScrollView { 61 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 62 | footer.loaddingText = text 63 | } 64 | return self 65 | } 66 | @discardableResult 67 | final public func noMoreDataText(_ text: String) -> UIScrollView { 68 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 69 | footer.noMoreDataText = text 70 | } 71 | return self 72 | } 73 | @discardableResult 74 | final public func releaseLoadMoreText(_ text: String) -> UIScrollView { 75 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 76 | footer.releaseLoadMoreText = text 77 | } 78 | return self 79 | } 80 | 81 | //MARK: - 自定义文字颜色 82 | @discardableResult 83 | final public func headerTextColor(_ color: UIColor) -> UIScrollView { 84 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 85 | header.txtColor = color 86 | } 87 | return self 88 | } 89 | @discardableResult 90 | final public func footerTextColor(_ color: UIColor) -> UIScrollView { 91 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 92 | footer.txtColor = color 93 | } 94 | return self 95 | } 96 | 97 | //MARK: - 自定义文图片 98 | // header's 99 | @discardableResult 100 | final public func headerIdleImage(_ image: UIImage?) -> UIScrollView { 101 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 102 | header.idleImage = image 103 | } 104 | return self 105 | } 106 | @discardableResult 107 | final public func headerSucImage(_ image: UIImage?) -> UIScrollView { 108 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 109 | header.sucImage = image 110 | } 111 | return self 112 | } 113 | @discardableResult 114 | final public func headerFailImage(_ image: UIImage?) -> UIScrollView { 115 | if let header = self.gtmHeader as? DefaultGTMRefreshHeader { 116 | header.failImage = image 117 | } 118 | return self 119 | } 120 | // footer's 121 | @discardableResult 122 | final public func footerIdleImage(_ image: UIImage?) -> UIScrollView { 123 | if let footer = self.gtmFooter as? DefaultGTMLoadMoreFooter { 124 | footer.idleImage = image 125 | } 126 | return self 127 | } 128 | 129 | } 130 | -------------------------------------------------------------------------------- /GTMRefresh/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 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /GTMRefresh/Resource/Base.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "Pull to refresh"; 9 | 10 | releaseToRefresh = "Release to refresh"; 11 | 12 | refreshSuccess = "Update successful"; 13 | 14 | refreshFailure = "Update failed"; 15 | 16 | refreshing = "Refreshing..."; 17 | 18 | pullUpToRefresh = "Scroll to load"; 19 | 20 | noMoreData = "No more data, daling!"; 21 | 22 | tapToRefresh = "Tap to refresh"; 23 | 24 | scrollAndTapToRefresh = "Scroll or tap to load"; 25 | 26 | loadMore = "Loading..."; 27 | 28 | releaseLoadMore = "Release to load more"; 29 | -------------------------------------------------------------------------------- /GTMRefresh/Resource/arrow_down@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefresh/Resource/arrow_down@3x.png -------------------------------------------------------------------------------- /GTMRefresh/Resource/en.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "Pull to refresh"; 9 | 10 | releaseToRefresh = "Release to refresh"; 11 | 12 | refreshSuccess = "Update successful"; 13 | 14 | refreshFailure = "Update failed"; 15 | 16 | refreshing = "Refreshing..."; 17 | 18 | pullUpToRefresh = "Scroll to load"; 19 | 20 | noMoreData = "No more data, daling!"; 21 | 22 | tapToRefresh = "Tap to refresh"; 23 | 24 | scrollAndTapToRefresh = "Scroll or tap to load"; 25 | 26 | loadMore = "Loading..."; 27 | 28 | releaseLoadMore = "Release to load more"; 29 | -------------------------------------------------------------------------------- /GTMRefresh/Resource/failure@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefresh/Resource/failure@3x.png -------------------------------------------------------------------------------- /GTMRefresh/Resource/success@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefresh/Resource/success@3x.png -------------------------------------------------------------------------------- /GTMRefresh/Resource/zh-Hans.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | GTMRefresh 4 | 5 | Created by luoyang on 2016/12/8. 6 | Copyright © 2016年 luoyang. All rights reserved. 7 | */ 8 | pullDownToRefresh = "下拉可以刷新"; 9 | 10 | releaseToRefresh = "松开立即刷新"; 11 | 12 | refreshSuccess = "刷新成功"; 13 | 14 | refreshFailure = "刷新失败"; 15 | 16 | refreshing = "正在刷新数据中..."; 17 | 18 | pullUpToRefresh = "上拉加载更多数据"; 19 | 20 | noMoreData = "真没有了,哥!"; 21 | 22 | tapToRefresh = "点击加载更多"; 23 | 24 | scrollAndTapToRefresh = "上拉或点击加载更多"; 25 | 26 | loadMore = "正在加载..."; 27 | 28 | releaseLoadMore = "松开加载更多"; 29 | -------------------------------------------------------------------------------- /GTMRefreshExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // GTMRefreshExample 4 | // 5 | // Created by luoyang on 2016/12/6. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-60.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-58.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-87.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-80.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-120.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-121.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-180.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "1024x1024", 53 | "idiom" : "ios-marketing", 54 | "filename" : "1024.png", 55 | "scale" : "1x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-120.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-121.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-121.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-180.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-58.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-60.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-80.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/AppIcon.appiconset/Icon-87.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0001.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0001@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0001.imageset/dropdown_anim__0001@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0001.imageset/dropdown_anim__0001@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00010.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00010@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00010.imageset/dropdown_anim__00010@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00010.imageset/dropdown_anim__00010@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00011.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00011@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00011.imageset/dropdown_anim__00011@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00011.imageset/dropdown_anim__00011@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00012.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00012@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00012.imageset/dropdown_anim__00012@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00012.imageset/dropdown_anim__00012@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00013.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00013@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00013.imageset/dropdown_anim__00013@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00013.imageset/dropdown_anim__00013@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00014.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00014@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00014.imageset/dropdown_anim__00014@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00014.imageset/dropdown_anim__00014@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00015.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00015@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00015.imageset/dropdown_anim__00015@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00015.imageset/dropdown_anim__00015@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00016.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00016@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00016.imageset/dropdown_anim__00016@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00016.imageset/dropdown_anim__00016@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00017.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00017@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00017.imageset/dropdown_anim__00017@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00017.imageset/dropdown_anim__00017@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00018.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00018@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00018.imageset/dropdown_anim__00018@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00018.imageset/dropdown_anim__00018@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00019.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00019@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00019.imageset/dropdown_anim__00019@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00019.imageset/dropdown_anim__00019@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0002.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0002@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0002.imageset/dropdown_anim__0002@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0002.imageset/dropdown_anim__0002@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00020.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00020@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00020.imageset/dropdown_anim__00020@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00020.imageset/dropdown_anim__00020@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00021.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00021@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00021.imageset/dropdown_anim__00021@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00021.imageset/dropdown_anim__00021@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00022.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00022@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00022.imageset/dropdown_anim__00022@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00022.imageset/dropdown_anim__00022@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00023.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00023@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00023.imageset/dropdown_anim__00023@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00023.imageset/dropdown_anim__00023@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00024.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00024@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00024.imageset/dropdown_anim__00024@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00024.imageset/dropdown_anim__00024@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00025.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00025@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00025.imageset/dropdown_anim__00025@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00025.imageset/dropdown_anim__00025@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00026.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00026@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00026.imageset/dropdown_anim__00026@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00026.imageset/dropdown_anim__00026@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00027.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00027@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00027.imageset/dropdown_anim__00027@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00027.imageset/dropdown_anim__00027@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00028.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00028@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00028.imageset/dropdown_anim__00028@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00028.imageset/dropdown_anim__00028@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00029.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00029@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00029.imageset/dropdown_anim__00029@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00029.imageset/dropdown_anim__00029@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0003.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0003@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0003.imageset/dropdown_anim__0003@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0003.imageset/dropdown_anim__0003@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00030.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00030@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00030.imageset/dropdown_anim__00030@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00030.imageset/dropdown_anim__00030@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00031.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00031@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00031.imageset/dropdown_anim__00031@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00031.imageset/dropdown_anim__00031@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00032.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00032@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00032.imageset/dropdown_anim__00032@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00032.imageset/dropdown_anim__00032@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00033.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00033@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00033.imageset/dropdown_anim__00033@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00033.imageset/dropdown_anim__00033@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00034.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00034@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00034.imageset/dropdown_anim__00034@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00034.imageset/dropdown_anim__00034@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00035.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00035@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00035.imageset/dropdown_anim__00035@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00035.imageset/dropdown_anim__00035@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00036.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00036@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00036.imageset/dropdown_anim__00036@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00036.imageset/dropdown_anim__00036@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00037.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00037@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00037.imageset/dropdown_anim__00037@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00037.imageset/dropdown_anim__00037@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00038.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00038@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00038.imageset/dropdown_anim__00038@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00038.imageset/dropdown_anim__00038@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00039.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00039@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00039.imageset/dropdown_anim__00039@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00039.imageset/dropdown_anim__00039@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0004.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0004@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0004.imageset/dropdown_anim__0004@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0004.imageset/dropdown_anim__0004@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00040.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00040@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00040.imageset/dropdown_anim__00040@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00040.imageset/dropdown_anim__00040@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00041.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00041@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00041.imageset/dropdown_anim__00041@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00041.imageset/dropdown_anim__00041@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00042.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00042@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00042.imageset/dropdown_anim__00042@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00042.imageset/dropdown_anim__00042@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00043.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00043@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00043.imageset/dropdown_anim__00043@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00043.imageset/dropdown_anim__00043@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00044.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00044@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00044.imageset/dropdown_anim__00044@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00044.imageset/dropdown_anim__00044@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00045.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00045@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00045.imageset/dropdown_anim__00045@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00045.imageset/dropdown_anim__00045@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00046.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00046@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00046.imageset/dropdown_anim__00046@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00046.imageset/dropdown_anim__00046@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00047.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00047@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00047.imageset/dropdown_anim__00047@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00047.imageset/dropdown_anim__00047@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00048.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00048@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00048.imageset/dropdown_anim__00048@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00048.imageset/dropdown_anim__00048@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00049.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00049@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00049.imageset/dropdown_anim__00049@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00049.imageset/dropdown_anim__00049@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0005.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0005@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0005.imageset/dropdown_anim__0005@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0005.imageset/dropdown_anim__0005@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00050.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00050@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00050.imageset/dropdown_anim__00050@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00050.imageset/dropdown_anim__00050@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00051.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00051@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00051.imageset/dropdown_anim__00051@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00051.imageset/dropdown_anim__00051@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00052.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00052@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00052.imageset/dropdown_anim__00052@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00052.imageset/dropdown_anim__00052@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00053.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00053@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00053.imageset/dropdown_anim__00053@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00053.imageset/dropdown_anim__00053@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00054.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00054@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00054.imageset/dropdown_anim__00054@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00054.imageset/dropdown_anim__00054@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00055.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00055@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00055.imageset/dropdown_anim__00055@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00055.imageset/dropdown_anim__00055@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00056.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00056@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00056.imageset/dropdown_anim__00056@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00056.imageset/dropdown_anim__00056@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00057.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00057@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00057.imageset/dropdown_anim__00057@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00057.imageset/dropdown_anim__00057@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00058.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00058@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00058.imageset/dropdown_anim__00058@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00058.imageset/dropdown_anim__00058@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00059.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00059@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00059.imageset/dropdown_anim__00059@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00059.imageset/dropdown_anim__00059@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0006.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0006@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0006.imageset/dropdown_anim__0006@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0006.imageset/dropdown_anim__0006@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00060.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__00060@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__00060.imageset/dropdown_anim__00060@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__00060.imageset/dropdown_anim__00060@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0007.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0007@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0007.imageset/dropdown_anim__0007@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0007.imageset/dropdown_anim__0007@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0008.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0008@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0008.imageset/dropdown_anim__0008@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0008.imageset/dropdown_anim__0008@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0009.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_anim__0009@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_anim__0009.imageset/dropdown_anim__0009@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_anim__0009.imageset/dropdown_anim__0009@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_01.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_loading_01@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_01.imageset/dropdown_loading_01@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_loading_01.imageset/dropdown_loading_01@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_02.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_loading_02@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_02.imageset/dropdown_loading_02@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_loading_02.imageset/dropdown_loading_02@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_03.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "dropdown_loading_03@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 | } -------------------------------------------------------------------------------- /GTMRefreshExample/Assets.xcassets/dropdown_loading_03.imageset/dropdown_loading_03@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Assets.xcassets/dropdown_loading_03.imageset/dropdown_loading_03@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /GTMRefreshExample/Base.lproj/Main.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 | -------------------------------------------------------------------------------- /GTMRefreshExample/BaseTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseTableViewController: UITableViewController { 12 | var models = ["1、你若安好,便是晴天。", 13 | "2、人生没有彩排,每一天都是现场直播。", 14 | "3、我们走得太快,灵魂都跟不上了。", 15 | "4、人生就像一杯茶,不会苦一辈子,但总会苦一阵子。", 16 | "5、人生如果错了方向,停止就是进步。", 17 | "6、理想很丰满,现实很骨感。", 18 | "7、男人一有钱就变坏,女人一边坏就有钱。", 19 | "8、择一城终老,遇一人白首。", 20 | "9、低头要有勇气,抬头要有底气。", 21 | "10、愿得一人心,白首不分离。", 22 | "11、一个人炫耀什么,说明内心缺少什么。", 23 | "12、试金可以用火,试女人可以用金,试男人可以用女人。", 24 | "13、时间就像一张网,你撒在哪里,你的收获就在哪里。", 25 | "14、学习要加,骄傲要减,机会要乘,懒惰要除。", 26 | "15、如果你简单,这个世界就对你简单。"] 27 | override func viewDidLoad() { 28 | super.viewDidLoad() 29 | self.tableView.tableFooterView = UIView(frame: CGRect.zero) 30 | self.edgesForExtendedLayout = [] 31 | } 32 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 33 | return models.count 34 | } 35 | override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 36 | return 44.0 37 | } 38 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 39 | var cell = tableView.dequeueReusableCell(withIdentifier: "cell") 40 | if cell == nil { 41 | cell = UITableViewCell(style: .default, reuseIdentifier: "cell") 42 | // cell?.backgroundColor = UIColor(colorLiteralRed: 249/255, green: 148/255, blue: 28/255, alpha: 1.0) 43 | } 44 | cell?.textLabel?.text = "\(models[(indexPath as NSIndexPath).row])" 45 | return cell! 46 | } 47 | deinit{ 48 | print("Deinit of \(NSStringFromClass(type(of: self)))") 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /GTMRefreshExample/CurveMask/CurveMaskTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CurveMaskTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class CurveMaskTableViewController:BaseTableViewController{ 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | //Setup 17 | let curveHeader = CurveRefreshHeader() 18 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: curveHeader) { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | self.tableView.triggerRefreshing() 24 | } 25 | 26 | 27 | func refresh() { 28 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 29 | } 30 | 31 | @objc func endRefresing() { 32 | self.tableView.endRefreshing(isSuccess: true) 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /GTMRefreshExample/CurveMask/CurveRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CurveRefreshHeader.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import GTMRefresh 10 | import UIKit 11 | 12 | class CurveRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | 14 | let pullingIndicator = UIImageView() 15 | // let bgColor = UIColor(red: 77.0/255.0, green: 184.0/255.0, blue: 255.0/255.0, alpha: 0.65) 16 | let totalHeight = UIScreen.main.bounds.size.height 17 | let maskLayer = CAShapeLayer() 18 | let spinner = UIActivityIndicatorView(style: .gray) 19 | let backgroundLayer = CALayer() 20 | 21 | override init(frame: CGRect) { 22 | super.init(frame: frame) 23 | pullingIndicator.image = UIImage(named: "arrow_downWhite") 24 | 25 | self.contentView.layer.addSublayer(backgroundLayer) 26 | backgroundLayer.backgroundColor = UIColor(red: 77.0/255.0, green: 184.0/255.0, blue: 255.0/255.0, alpha: 0.65).cgColor 27 | backgroundLayer.mask = maskLayer 28 | 29 | self.contentView.addSubview(pullingIndicator) 30 | self.contentView.addSubview(spinner) 31 | } 32 | 33 | override func layoutSubviews() { 34 | super.layoutSubviews() 35 | 36 | let center = CGPoint(x: self.contentView.bounds.width/2, y: self.contentView.bounds.height - 30) 37 | spinner.center = center 38 | 39 | pullingIndicator.frame = CGRect(x: 0, y: 0, width: 25, height: 25) 40 | pullingIndicator.center = center 41 | 42 | backgroundLayer.bounds = self.contentView.bounds 43 | backgroundLayer.position = CGPoint(x: self.contentView.bounds.width/2, y: self.contentView.bounds.height/2) 44 | 45 | maskLayer.bounds = self.contentView.bounds 46 | maskLayer.anchorPoint = CGPoint(x: 0.0, y: 0.0) 47 | } 48 | required init?(coder aDecoder: NSCoder) { 49 | fatalError("init(coder:) has not been implemented") 50 | } 51 | 52 | override func refreshingHoldHeight() -> CGFloat { 53 | return 60 54 | } 55 | 56 | /// 即将触发刷新的高度(特殊的控件需要重写该方法,返回不同的数值) 57 | /// 58 | /// - Returns: 触发刷新的高度 59 | open override func willRefresHeight() -> CGFloat { 60 | return 60 61 | } 62 | 63 | 64 | 65 | func toNormalState() { 66 | UIView.animate(withDuration: 0.4, animations: { 67 | self.pullingIndicator.transform = CGAffineTransform.identity 68 | }) 69 | } 70 | func toRefreshingState() { 71 | spinner.startAnimating() 72 | let controPoint = CGPoint(x: self.bounds.width/2, y: self.bounds.height - 60.0) 73 | self.maskLayer.path = createLayerWithY(60, controlPoint: controPoint).cgPath 74 | } 75 | func toPullingState() { 76 | // UIView.animate(withDuration: 0.4, animations: { 77 | // self.pullingIndicator.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+0.000001)) 78 | // }) 79 | } 80 | 81 | func changePullingPercent(percent: CGFloat) { 82 | let heightScrolled = 60 * percent; 83 | let adjustHeight = heightScrolled < 60 ? heightScrolled : 60; 84 | // print(adjustHeight) 85 | let controlPoint = CGPoint(x: self.bounds.width/2, y: self.bounds.height + adjustHeight) 86 | let bezierPath = createLayerWithY(adjustHeight,controlPoint: controlPoint) 87 | self.maskLayer.path = bezierPath.cgPath 88 | 89 | self.pullingIndicator.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+Double.pi*2*Double(percent))) 90 | } 91 | func willEndRefreshing(isSuccess: Bool) { 92 | spinner.stopAnimating() 93 | pullingIndicator.transform = CGAffineTransform.identity 94 | // imageView.image = UIImage(named: "success") 95 | } 96 | func didEndRefreshing() { 97 | pullingIndicator.image = UIImage(named: "arrow_downWhite") 98 | } 99 | func contentHeight()->CGFloat{ 100 | return 500 101 | } 102 | 103 | // MARK: Private 104 | func createLayerWithY(_ y:CGFloat,controlPoint:CGPoint)->UIBezierPath{ 105 | let bezierPath = UIBezierPath() 106 | bezierPath.move(to: CGPoint(x: 0, y: 0)); 107 | bezierPath.addLine(to: CGPoint(x: self.bounds.width, y: 0)) 108 | bezierPath.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - y)) 109 | bezierPath.addQuadCurve(to: CGPoint(x: 0, y: self.bounds.height - y), controlPoint: controlPoint) 110 | bezierPath.addLine(to: CGPoint(x: 0, y: 0)) 111 | return bezierPath 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /GTMRefreshExample/CurveMask/arrow_downWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/CurveMask/arrow_downWhite.png -------------------------------------------------------------------------------- /GTMRefreshExample/Default/DefaultCollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultCollectionViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class DefaultCollectionViewController:UIViewController,UICollectionViewDataSource{ 13 | var collectionView:UICollectionView? 14 | override func viewDidLoad() { 15 | self.view.backgroundColor = UIColor.white 16 | self.setUpCollectionView() 17 | 18 | self.collectionView?.gtm_addRefreshHeaderView { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | 24 | self.collectionView?.gtm_addLoadMoreFooterView { 25 | [weak self] in 26 | print("excute loadMoreBlock") 27 | self?.loadMore() 28 | } 29 | } 30 | 31 | 32 | // MARK: Test 33 | func refresh() { 34 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 35 | } 36 | 37 | @objc func endRefresing() { 38 | self.collectionView?.endRefreshing(isSuccess: true) 39 | } 40 | func loadMore() { 41 | perform(#selector(endLoadMore), with: nil, afterDelay: 3) 42 | } 43 | 44 | @objc func endLoadMore() { 45 | self.collectionView?.endLoadMore(isNoMoreData: true) 46 | } 47 | 48 | 49 | 50 | func setUpCollectionView(){ 51 | let flowLayout = UICollectionViewFlowLayout() 52 | flowLayout.scrollDirection = UICollectionView.ScrollDirection.vertical 53 | flowLayout.itemSize = CGSize(width: 100, height: 100) 54 | self.collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout) 55 | self.collectionView?.backgroundColor = UIColor.white 56 | self.collectionView?.dataSource = self 57 | self.view.addSubview(self.collectionView!) 58 | 59 | self.collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") 60 | } 61 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 62 | return 21 63 | } 64 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 65 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 66 | cell.backgroundColor = UIColor.lightGray 67 | return cell 68 | } 69 | deinit{ 70 | print("Deinit of DefaultCollectionViewController") 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /GTMRefreshExample/Default/DefaultScrollViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultScrollViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | import GTMRefresh 12 | 13 | class DefaultScrollViewController:UIViewController{ 14 | var scrollView:UIScrollView? 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | self.view.backgroundColor = UIColor.white 18 | self.automaticallyAdjustsScrollViewInsets = false 19 | setUpScrollView() 20 | 21 | self.scrollView?.gtm_addRefreshHeaderView { 22 | [weak self] in 23 | print("excute refreshBlock") 24 | self?.refresh() 25 | } 26 | 27 | self.scrollView?.gtm_addLoadMoreFooterView { 28 | [weak self] in 29 | print("excute loadMoreBlock") 30 | self?.loadMore() 31 | } 32 | } 33 | 34 | 35 | // MARK: Test 36 | func refresh() { 37 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 38 | } 39 | 40 | @objc func endRefresing() { 41 | self.scrollView?.endRefreshing(isSuccess: true) 42 | } 43 | 44 | func loadMore() { 45 | perform(#selector(endLoadMore), with: nil, afterDelay: 3) 46 | } 47 | 48 | @objc func endLoadMore() { 49 | self.scrollView?.endLoadMore(isNoMoreData: true) 50 | } 51 | 52 | func setUpScrollView(){ 53 | self.scrollView = UIScrollView(frame: CGRect(x: 0,y: 0,width: 300,height: 300)) 54 | self.scrollView?.backgroundColor = UIColor.lightGray 55 | self.scrollView?.center = self.view.center 56 | self.scrollView?.contentSize = CGSize(width: 300,height: 600) 57 | self.view.addSubview(self.scrollView!) 58 | } 59 | 60 | 61 | deinit{ 62 | print("Deinit of \(NSStringFromClass(type(of: self)))") 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /GTMRefreshExample/Default/DefaultTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WebviewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | fileprivate func < (lhs: T?, rhs: T?) -> Bool { 12 | switch (lhs, rhs) { 13 | case let (l?, r?): 14 | return l < r 15 | case (nil, _?): 16 | return true 17 | default: 18 | return false 19 | } 20 | } 21 | 22 | class DefaultTableViewController:UITableViewController{ 23 | var models = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | self.view.backgroundColor = UIColor.white 27 | self.tableView.tableFooterView = UIView(frame: CGRect.zero) 28 | 29 | self.tableView?.gtm_addRefreshHeaderView { 30 | [weak self] in 31 | print("excute refreshBlock") 32 | self?.refresh() 33 | } 34 | 35 | self.tableView?.gtm_addLoadMoreFooterView { 36 | [weak self] in 37 | print("excute loadMoreBlock") 38 | self?.loadMore() 39 | } 40 | } 41 | 42 | 43 | // MARK: Test 44 | func refresh() { 45 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 46 | } 47 | 48 | @objc func endRefresing() { 49 | self.tableView?.endRefreshing(isSuccess: true) 50 | } 51 | func loadMore() { 52 | perform(#selector(endLoadMore), with: nil, afterDelay: 3) 53 | } 54 | 55 | @objc func endLoadMore() { 56 | self.models += [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] 57 | self.tableView?.endLoadMore(isNoMoreData: models.count > 50) 58 | self.tableView?.reloadData() 59 | } 60 | 61 | 62 | 63 | 64 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 65 | return models.count 66 | } 67 | override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 68 | return 44.0 69 | } 70 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 71 | var cell = tableView.dequeueReusableCell(withIdentifier: "cell") 72 | if cell == nil { 73 | cell = UITableViewCell(style: .default, reuseIdentifier: "cell") 74 | } 75 | cell?.textLabel?.text = "\(models[(indexPath as NSIndexPath).row])" 76 | return cell! 77 | } 78 | 79 | 80 | deinit{ 81 | print("Deinit of \(NSStringFromClass(type(of: self)))") 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /GTMRefreshExample/Default/DefaultWebViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultWebViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class DefaultWebViewController: UIViewController, UIWebViewDelegate{ 13 | var webview:UIWebView? 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | self.view.backgroundColor = UIColor.lightGray 17 | self.webview = UIWebView(frame:view.bounds) 18 | self.webview?.autoresizingMask = [.flexibleWidth,.flexibleHeight] 19 | self.webview?.backgroundColor = UIColor.white 20 | view.addSubview(self.webview!) 21 | 22 | self.webview?.scrollView.gtm_addRefreshHeaderView { 23 | [weak self] in 24 | print("excute refreshBlock") 25 | self?.refresh() 26 | } 27 | 28 | self.webview?.scrollView.gtm_addLoadMoreFooterView { 29 | [weak self] in 30 | print("excute loadMoreBlock") 31 | self?.loadMore() 32 | } 33 | } 34 | 35 | 36 | // MARK: Test 37 | func refresh() { 38 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 39 | } 40 | 41 | @objc func endRefresing() { 42 | self.webview?.scrollView.endRefreshing(isSuccess: true) 43 | } 44 | func loadMore() { 45 | perform(#selector(endLoadMore), with: nil, afterDelay: 3) 46 | } 47 | 48 | @objc func endLoadMore() { 49 | self.webview?.scrollView.endLoadMore(isNoMoreData: true) 50 | } 51 | 52 | 53 | func webViewDidFinishLoad(_ webView: UIWebView) { 54 | self.webview?.scrollView.endRefreshing(isSuccess: true) 55 | } 56 | 57 | 58 | deinit{ 59 | print("Deinit of \(NSStringFromClass(type(of: self)))") 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /GTMRefreshExample/DianPing/DianpingRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DianpingRefreshHeader.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import GTMRefresh 10 | import UIKit 11 | 12 | class DianpingRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | let imageView = UIImageView() 14 | override init(frame: CGRect) { 15 | super.init(frame: frame) 16 | 17 | self.contentView.addSubview(imageView) 18 | } 19 | 20 | required init?(coder aDecoder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | override func layoutSubviews() { 25 | super.layoutSubviews() 26 | imageView.frame = CGRect(x: 0, y: 0, width: 60, height: 60) 27 | imageView.center = CGPoint(x: self.bounds.width/2.0, y: self.bounds.height/2.0) 28 | } 29 | 30 | 31 | 32 | func toNormalState() {} 33 | func toRefreshingState() { 34 | let images = ["dropdown_loading_01","dropdown_loading_02","dropdown_loading_03"].map { (name) -> UIImage in 35 | return UIImage(named:name)! 36 | } 37 | imageView.animationImages = images 38 | imageView.animationDuration = Double(images.count) * 0.15 39 | imageView.startAnimating() 40 | } 41 | func toPullingState() {} 42 | func toWillRefreshState() {} 43 | func changePullingPercent(percent: CGFloat) { 44 | imageView.isHidden = (percent == 0) 45 | let adjustPercent = max(min(1.0, percent),0.0) 46 | let scale = 0.2 + (1.0 - 0.2) * adjustPercent; 47 | imageView.transform = CGAffineTransform(scaleX: scale, y: scale) 48 | let mappedIndex = Int(adjustPercent * 60) 49 | let imageName = "dropdown_anim__000\(mappedIndex)" 50 | let image = UIImage(named: imageName) 51 | imageView.image = image 52 | } 53 | func willEndRefreshing(isSuccess: Bool) {} 54 | func didEndRefreshing() { 55 | imageView.animationImages = nil 56 | imageView.stopAnimating() 57 | imageView.isHidden = true 58 | } 59 | func contentHeight()->CGFloat{ 60 | return 70 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /GTMRefreshExample/DianPing/DianpingTableviewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DianpingTableviewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class DianpingTableviewController:BaseTableViewController{ 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | //Setup 16 | self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0) 17 | let qqHeader = DianpingRefreshHeader() 18 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: qqHeader) { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | self.tableView.triggerRefreshing() 24 | } 25 | 26 | 27 | func refresh() { 28 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 29 | } 30 | 31 | @objc func endRefresing() { 32 | self.tableView.endRefreshing(isSuccess: true) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /GTMRefreshExample/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 | APPL 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /GTMRefreshExample/NavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NavigationController.swift 3 | // EasyLife 4 | // 5 | // Created by 骆扬 on 2018/7/24. 6 | // Copyright © 2018年 SyncSoft. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class NavigationController: UINavigationController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | self.delegate = NavigationControllerDelegate.shared 17 | self.interactivePopGestureRecognizer?.delegate = NavigationControllerDelegate.shared 18 | } 19 | 20 | } 21 | 22 | 23 | class NavigationControllerDelegate: NSObject, UINavigationControllerDelegate, UIGestureRecognizerDelegate { 24 | 25 | static let shared = NavigationControllerDelegate() 26 | private override init() { } 27 | 28 | func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { 29 | let hide = viewController.isKind(of: DefaultTableViewController.self) 30 | navigationController.setNavigationBarHidden(hide, animated: animated) 31 | } 32 | 33 | 34 | } 35 | 36 | 37 | //extension UIViewController { 38 | // var isNavigationBarHidden: Bool { 39 | // if let controller = self as? BaseViewController { 40 | // return controller.hiddenNavigationBar 41 | // } 42 | // if let controller = self as? WebViewController { 43 | // return controller.hiddenNavigationBar 44 | // } 45 | // if self.isKind(of: UITabBarController.self) { 46 | // return true 47 | // } 48 | // return false 49 | // } 50 | //} 51 | -------------------------------------------------------------------------------- /GTMRefreshExample/QQRefresh/QQStyleHeaderViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QQStyleHeaderViewController.swift 3 | // GTMRefresh 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class QQStyleHeaderViewController: BaseTableViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | //Setup 16 | // self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0) 17 | let qqHeader = QQStyleRefreshHeader() 18 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: qqHeader) { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | self.tableView.triggerRefreshing() 24 | } 25 | 26 | 27 | func refresh() { 28 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 29 | } 30 | 31 | @objc func endRefresing() { 32 | self.tableView.endRefreshing(isSuccess: true) 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /GTMRefreshExample/QQRefresh/QQStyleRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QQStyleRefreshHeader.swift 3 | // GTMRefresh 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import GTMRefresh 11 | 12 | class QQStyleRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | 14 | let control:QQStylePullingIndicator 15 | public let textLabel:UILabel = UILabel(frame: CGRect(x: 0,y: 0,width: 120,height: 40)) 16 | public let imageView:UIImageView = UIImageView(frame: CGRect.zero) 17 | 18 | // MARK: Life Cycle 19 | 20 | override public init(frame: CGRect) { 21 | control = QQStylePullingIndicator(frame: frame) 22 | super.init(frame: frame) 23 | 24 | self.autoresizingMask = .flexibleWidth 25 | self.backgroundColor = UIColor.white 26 | imageView.sizeToFit() 27 | imageView.frame = CGRect(x: 0, y: 0, width: 20, height: 20) 28 | textLabel.font = UIFont.systemFont(ofSize: 15) 29 | textLabel.textAlignment = .center 30 | textLabel.textColor = UIColor.darkGray 31 | addSubview(control) 32 | addSubview(textLabel) 33 | addSubview(imageView) 34 | 35 | // textLabel.text = textDic[.pullToRefresh] 36 | } 37 | 38 | required public init?(coder aDecoder: NSCoder) { 39 | fatalError("init(coder:) has not been implemented") 40 | } 41 | 42 | // MARK: Layout 43 | 44 | open override func layoutSubviews() { 45 | super.layoutSubviews() 46 | control.frame = self.bounds 47 | 48 | let totalHegiht = self.contentHeight() 49 | imageView.center = CGPoint(x: frame.width/2 - 40 - 40, y: totalHegiht * 0.75) 50 | textLabel.center = CGPoint(x: frame.size.width/2, y: totalHegiht * 0.75); 51 | } 52 | 53 | // MARK: override 54 | 55 | /// Loadding动画显示区域的高度(特殊的控件需要重写该方法,返回不同的数值) 56 | /// 57 | /// - Returns: Loadding动画显示区域的高度 58 | public override func refreshingHoldHeight() -> CGFloat { 59 | return 40.0 60 | } 61 | 62 | 63 | // MARK: SubGTMRefreshHeaderProtocol 64 | func contentHeight() -> CGFloat { 65 | return 80.0 66 | } 67 | 68 | func toNormalState() { 69 | 70 | self.control.isHidden = false 71 | self.imageView.isHidden = true 72 | self.textLabel.isHidden = true 73 | } 74 | func toRefreshingState() { 75 | 76 | self.control.animating = true 77 | } 78 | func toPullingState() { 79 | } 80 | func changePullingPercent(percent: CGFloat) { 81 | 82 | self.control.animating = false 83 | if percent > 0.5 && percent <= 1.0{ 84 | self.control.progress = (percent - 0.5)/0.5 85 | }else if percent <= 0.5{ 86 | self.control.progress = 0.0 87 | }else{ 88 | self.control.progress = 1.0 89 | } 90 | } 91 | func toWillRefreshState() { 92 | } 93 | 94 | func willEndRefreshing(isSuccess: Bool) { 95 | if isSuccess { 96 | self.control.isHidden = true 97 | imageView.isHidden = false 98 | textLabel.isHidden = false 99 | textLabel.text = GTMRHeaderString.refreshSuccess 100 | imageView.image = UIImage(named: "success", in: Bundle(for: GTMRefreshHeader.self), compatibleWith: nil) 101 | } else { 102 | self.control.isHidden = true 103 | imageView.isHidden = false 104 | textLabel.isHidden = false 105 | textLabel.text = GTMRHeaderString.refreshFailure 106 | imageView.image = UIImage(named: "failure", in: Bundle(for: GTMRefreshHeader.self), compatibleWith: nil) 107 | } 108 | } 109 | func didEndRefreshing() { 110 | 111 | } 112 | 113 | } 114 | -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/QQVideoRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QQVideoRefreshHeader.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | import GTMRefresh 9 | import UIKit 10 | 11 | class QQVideoRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 12 | let imageView = UIImageView() 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | imageView.image = UIImage(named: "loading15") 16 | self.contentView.addSubview(imageView) 17 | } 18 | 19 | required init?(coder aDecoder: NSCoder) { 20 | fatalError("init(coder:) has not been implemented") 21 | } 22 | 23 | override func layoutSubviews() { 24 | super.layoutSubviews() 25 | imageView.frame = CGRect(x: 0, y: 0, width: 27, height: 10) 26 | imageView.center = CGPoint(x: self.bounds.width/2.0, y: self.bounds.height/2.0) 27 | } 28 | 29 | 30 | 31 | func toNormalState() { 32 | UIView.animate(withDuration: 0.3, animations: { 33 | self.imageView.transform = CGAffineTransform(translationX: 0, y: -50) 34 | }) 35 | } 36 | func toRefreshingState() { 37 | imageView.image = nil 38 | let images = (0...29).map{return $0 < 10 ? "loading0\($0)" : "loading\($0)"} 39 | imageView.animationImages = images.map{return UIImage(named:$0)!} 40 | imageView.animationDuration = Double(images.count) * 0.04 41 | imageView.startAnimating() 42 | } 43 | func toPullingState() { 44 | UIView.animate(withDuration: 0.3, animations: { 45 | self.imageView.transform = CGAffineTransform.identity 46 | }) 47 | } 48 | func toWillRefreshState() {} 49 | func changePullingPercent(percent: CGFloat) {} 50 | func willEndRefreshing(isSuccess: Bool) {} 51 | func didEndRefreshing() { 52 | imageView.animationImages = nil 53 | imageView.stopAnimating() 54 | imageView.image = UIImage(named: "loading15") 55 | } 56 | func contentHeight() -> CGFloat { 57 | return 50 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/QQVideoTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QQVideoTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class QQVideoTableviewController:BaseTableViewController{ 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | let qqHeader = QQVideoRefreshHeader() 17 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: qqHeader) { 18 | [weak self] in 19 | print("excute refreshBlock") 20 | self?.refresh() 21 | } 22 | self.tableView.triggerRefreshing() 23 | } 24 | 25 | 26 | func refresh() { 27 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 28 | } 29 | 30 | @objc func endRefresing() { 31 | self.tableView.endRefreshing(isSuccess: true) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading00@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading00@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading00@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading00@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading01@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading01@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading01@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading01@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading02@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading02@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading02@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading02@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading03@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading03@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading03@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading03@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading04@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading04@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading04@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading04@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading05@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading05@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading05@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading05@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading06@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading06@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading06@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading06@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading07@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading07@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading07@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading07@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading08@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading08@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading08@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading08@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading09@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading09@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading09@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading09@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading10@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading10@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading10@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading11@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading11@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading11@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading11@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading12@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading12@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading12@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading12@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading13@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading13@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading13@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading13@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading14@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading14@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading14@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading14@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading15@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading15@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading15@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading15@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading16@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading16@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading16@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading17@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading17@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading17@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading17@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading18@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading18@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading18@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading18@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading19@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading19@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading19@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading19@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading20@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading20@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading21@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading21@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading21@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading21@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading22@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading22@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading22@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading22@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading23@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading23@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading23@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading23@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading24@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading24@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading24@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading25@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading25@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading25@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading25@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading26@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading26@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading26@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading26@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading27@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading27@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading27@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading27@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading28@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading28@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading28@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading28@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading29@2x.png -------------------------------------------------------------------------------- /GTMRefreshExample/QQVideo/Resource/loading29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/QQVideo/Resource/loading29@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/SectionModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SectionModel.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct SectionModel { 12 | var rowsCount:Int 13 | var sectionTitle:String 14 | var rowsTitles:[String] 15 | var rowsTargetControlerNames:[String] 16 | } 17 | -------------------------------------------------------------------------------- /GTMRefreshExample/TaoBao/TaobaoTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaobaoTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | class TaobaoTableViewController:BaseTableViewController{ 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | //Setup 15 | // self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0) 16 | let qqHeader = TaoBaoRefreshHeader() 17 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: qqHeader) { 18 | [weak self] in 19 | print("excute refreshBlock") 20 | self?.refresh() 21 | } 22 | self.tableView.triggerRefreshing() 23 | } 24 | 25 | 26 | func refresh() { 27 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 28 | } 29 | 30 | @objc func endRefresing() { 31 | self.tableView.endRefreshing(isSuccess: true) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /GTMRefreshExample/TaoBao/taobaoLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/TaoBao/taobaoLogo.png -------------------------------------------------------------------------------- /GTMRefreshExample/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // GTMRefreshExample 4 | // 5 | // Created by luoyang on 2016/12/6. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import GTMRefresh 11 | 12 | class ViewController: UITableViewController { 13 | 14 | var models = [SectionModel]() 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | let section0 = SectionModel(rowsCount: 4, 19 | sectionTitle:"Default", 20 | rowsTitles: ["Tableview","CollectionView","ScrollView","WebView"], 21 | rowsTargetControlerNames:["DefaultTableViewController","DefaultCollectionViewController","DefaultScrollViewController","DefaultWebViewController"]) 22 | 23 | 24 | let section1 = SectionModel(rowsCount: 8, 25 | sectionTitle:"Customize", 26 | rowsTitles: ["QQ","YahooWeather","Curve Mask","Youku","TaoBao","QQ Video","DianPing", "Wechat"], 27 | rowsTargetControlerNames:["QQStyleHeaderViewController","YahooWeatherTableViewController","CurveMaskTableViewController","YoukuTableViewController","TaobaoTableViewController","QQVideoTableviewController","DianpingTableviewController", "WechatRefreshHeaderTestVC"]) 28 | models.append(section0) 29 | models.append(section1) 30 | 31 | self.tableView.gtm_addRefreshHeaderView { 32 | [weak self] in 33 | print("excute refreshBlock") 34 | self?.refresh() 35 | } 36 | 37 | self.tableView.gtm_addLoadMoreFooterView { 38 | [weak self] in 39 | print("excute loadMoreBlock") 40 | self?.loadMore() 41 | } 42 | 43 | self.tableView.tableFooterView = UIView(frame: CGRect.zero) 44 | 45 | // text 46 | self.tableView.pullDownToRefreshText("亲,试试下拉会刷新的") 47 | .releaseToRefreshText("亲,松开试试") 48 | .refreshSuccessText("亲,成功了") 49 | .refreshFailureText("亲,无果") 50 | .refreshingText("亲,正在努力刷新") 51 | // color 52 | self.tableView.headerTextColor(.red) 53 | // icon 54 | self.tableView.headerIdleImage(UIImage.init(named: "dropdown_anim__00048")) 55 | 56 | } 57 | 58 | 59 | // MARK: Test 60 | func refresh() { 61 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 62 | } 63 | 64 | @objc func endRefresing() { 65 | self.tableView.endRefreshing(isSuccess: true) 66 | } 67 | func loadMore() { 68 | perform(#selector(endLoadMore), with: nil, afterDelay: 3) 69 | } 70 | 71 | @objc func endLoadMore() { 72 | self.tableView.endLoadMore(isNoMoreData: true) 73 | } 74 | 75 | // MARK: Table View 76 | 77 | override func numberOfSections(in tableView: UITableView) -> Int { 78 | return models.count 79 | } 80 | override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 81 | return 30.0 82 | } 83 | override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 84 | let sectionModel = models[section] 85 | return sectionModel.sectionTitle 86 | } 87 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 88 | let sectionModel = models[section] 89 | return sectionModel.rowsCount 90 | } 91 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 92 | var cell = tableView.dequeueReusableCell(withIdentifier: "cell") 93 | if cell == nil { 94 | cell = UITableViewCell(style: .default, reuseIdentifier: "cell") 95 | 96 | } 97 | let sectionModel = models[(indexPath as NSIndexPath).section] 98 | cell?.textLabel?.text = sectionModel.rowsTitles[(indexPath as NSIndexPath).row] 99 | return cell! 100 | } 101 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 102 | tableView.deselectRow(at: indexPath, animated: true) 103 | let sectionModel = models[(indexPath as NSIndexPath).section] 104 | var className = sectionModel.rowsTargetControlerNames[(indexPath as NSIndexPath).row] 105 | className = "GTMRefreshExample.\(className)" 106 | if let cls = NSClassFromString(className) as? UIViewController.Type{ 107 | let dvc = cls.init() 108 | self.navigationController?.pushViewController(dvc, animated: true) 109 | } 110 | 111 | } 112 | } 113 | 114 | -------------------------------------------------------------------------------- /GTMRefreshExample/Wechat/WechatRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WechatRefreshHeader.swift 3 | // GTMRefreshExample 4 | // 5 | // Created by 骆扬 on 2020/1/2. 6 | // Copyright © 2020 luoyang. All rights reserved. 7 | // 8 | 9 | import GTMRefresh 10 | import UIKit 11 | 12 | class WechatRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | var wheel: UIImageView = { 14 | let wheel = UIImageView() 15 | wheel.image = UIImage(named: "wechat") 16 | 17 | return wheel 18 | }() 19 | 20 | override init(frame: CGRect) { 21 | super.init(frame: frame) 22 | setup() 23 | } 24 | required init?(coder aDecoder: NSCoder) { 25 | super.init(coder: aDecoder) 26 | setup() 27 | } 28 | 29 | func setup() { 30 | self.backgroundColor = .white 31 | } 32 | 33 | func startWheelAnimation() { 34 | 35 | let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 36 | rotateAnimation.toValue = NSNumber(value: Double.pi * 2.0 as Double) 37 | rotateAnimation.duration = 1.6 38 | rotateAnimation.isCumulative = true 39 | rotateAnimation.repeatCount = MAXFLOAT 40 | self.wheel.layer.add(rotateAnimation, forKey: "rotate") 41 | } 42 | 43 | 44 | // MARK: - SubGTMRefreshHeaderProtocol 45 | /// 状态变成.idle 46 | func toNormalState() { 47 | self.wheel.removeFromSuperview() 48 | } 49 | 50 | /// 状态变成.pulling 51 | func toPullingState() { 52 | // 掉落动画 53 | if self.wheel.superview == nil { 54 | self.scrollView?.addSubview(self.wheel) 55 | self.wheel.frame = CGRect(x: 20, y: -30, width: 28, height: 28) 56 | UIView.animate(withDuration: 0.5) { 57 | self.wheel.frame = CGRect(x: 20, y: 30, width: 28, height: 28) 58 | } 59 | } 60 | } 61 | /// 状态变成.willRefresh 62 | func toRefreshingState() { 63 | if self.wheel.superview == nil { 64 | self.scrollView?.addSubview(self.wheel) 65 | self.wheel.frame = CGRect(x: 20, y: -30, width: 28, height: 28) 66 | UIView.animate(withDuration: 0.5) { 67 | self.wheel.frame = CGRect(x: 20, y: 30, width: 28, height: 28) 68 | } 69 | } 70 | startWheelAnimation() 71 | } 72 | /// 结束动画完成后执行 73 | func didEndRefreshing() { 74 | self.wheel.layer.removeAllAnimations() 75 | } 76 | 77 | func contentHeight() -> CGFloat { 78 | return 30 79 | } 80 | override func refreshingHoldHeight() -> CGFloat { 81 | return 10 82 | } 83 | 84 | 85 | } 86 | -------------------------------------------------------------------------------- /GTMRefreshExample/Wechat/WechatRefreshHeaderTestVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WechatRefreshHeaderTestVC.swift 3 | // GTMRefreshExample 4 | // 5 | // Created by 骆扬 on 2020/1/2. 6 | // Copyright © 2020 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class WechatRefreshHeaderTestVC: BaseTableViewController{ 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | self.tableView.backgroundColor = UIColor.lightGray 16 | //Setup 17 | let wechatHeader = WechatRefreshHeader() 18 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: wechatHeader) { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | self.tableView.triggerRefreshing() 24 | 25 | } 26 | 27 | 28 | func refresh() { 29 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 30 | } 31 | 32 | @objc func endRefresing() { 33 | self.tableView.endRefreshing(isSuccess: true) 34 | } 35 | 36 | 37 | 38 | 39 | } 40 | 41 | 42 | -------------------------------------------------------------------------------- /GTMRefreshExample/Wechat/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/Wechat/wechat.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00000.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00001.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00002.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00003.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00004.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00005.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00006.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00007.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00008.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00009.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00010.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00011.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00012.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00013.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00014.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00015.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00016.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00017.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00018.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00019.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00020.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00021.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00022.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00023.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00024.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00025.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00026.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00027.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00028.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00029.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00030.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00031.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00032.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00033.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00034.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00035.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00036.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00037.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00038.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00039.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00040.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00041.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00042.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00043.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00044.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00045.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00046.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00047.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00048.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00049.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00050.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00051.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00052.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00053.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00054.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00055.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00056.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00057.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00058.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00059.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00060.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00061.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00061.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00062.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00063.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00064.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00065.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00065.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00066.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00066.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00067.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00068.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00068.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00069.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00069.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00070.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00070.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00071.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00071.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00072.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00072.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00073.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00073.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00074.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00074.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00075.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00075.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00076.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00076.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00077.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00077.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00078.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00078.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00079.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00079.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00080.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00080.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00081.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00082.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00082.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00083.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00084.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00084.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00085.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00085.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00086.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00086.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00087.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00087.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00088.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00088.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00089.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00089.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00090.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00090.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00091.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00091.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00092.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00092.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00093.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00093.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00094.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00094.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00095.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00095.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00096.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00097.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00097.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00098.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00098.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00099.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00099.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00100.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00101.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00102.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00103.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00104.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00104.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00105.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00105.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00106.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00106.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00107.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00108.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/sun_00109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/sun_00109.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/Resource/yahoo_logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YahooWeather/Resource/yahoo_logo@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/YahooWeatherRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YahooWeatherRefreshHeader.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import GTMRefresh 11 | 12 | class YahooWeatherRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | 14 | let imageView = UIImageView(frame:CGRect(x: 0, y: 0, width: 40, height: 40)) 15 | let logoImage = UIImageView(frame: CGRect(x: 0, y: 0, width: 60, height: 14)) 16 | let label = UILabel() 17 | 18 | override init(frame: CGRect) { 19 | super.init(frame: frame) 20 | setup() 21 | } 22 | 23 | required init?(coder aDecoder: NSCoder) { 24 | super.init(coder: aDecoder) 25 | setup() 26 | } 27 | 28 | func setup() { 29 | // self.backgroundColor = UIColor(white: 0.0, alpha: 0.25) 30 | imageView.image = UIImage(named: "sun_000000") 31 | logoImage.image = UIImage(named: "yahoo_logo") 32 | label.textColor = UIColor.white 33 | label.font = UIFont.systemFont(ofSize: 12) 34 | label.text = "Last update: 5 minutes ago" 35 | 36 | self.contentView.addSubview(imageView) 37 | self.contentView.addSubview(logoImage) 38 | self.contentView.addSubview(label) 39 | 40 | } 41 | 42 | override func layoutSubviews() { 43 | super.layoutSubviews() 44 | 45 | 46 | logoImage.center = CGPoint(x: self.bounds.width/2.0, y: frame.height - 30 - 7.0) 47 | imageView.center = CGPoint(x: self.bounds.width/2.0 - 60.0, y: frame.height - 30) 48 | label.frame = CGRect(x: logoImage.frame.origin.x, y: logoImage.frame.origin.y + logoImage.frame.height + 2,width: 200, height: 20) 49 | } 50 | 51 | 52 | var animating: Bool = false 53 | func startTransitionAnimation(){ 54 | if animating { 55 | return 56 | } 57 | animating = true 58 | imageView.image = UIImage(named: "sun_00073") 59 | // let images = (27...72).map({"sun_000\($0)"}).map({UIImage(named:$0)!}) 60 | // imageView.animationImages = images 61 | // imageView.animationDuration = Double(images.count) * 0.02 62 | // imageView.animationRepeatCount = 1 63 | // imageView.startAnimating() 64 | // self.perform(#selector(YahooWeatherRefreshHeader.transitionFinihsed), with: nil, afterDelay: imageView.animationDuration) 65 | let images = (73...109).map({return $0 < 100 ? "sun_000\($0)" : "sun_00\($0)"}).map({UIImage(named:$0)!}) 66 | 67 | imageView.animationImages = images 68 | imageView.animationDuration = Double(images.count) * 0.03 69 | imageView.animationRepeatCount = 1000000 70 | imageView.startAnimating() 71 | } 72 | 73 | @objc func transitionFinihsed(){ 74 | let images = (73...109).map({return $0 < 100 ? "sun_000\($0)" : "sun_00\($0)"}).map({UIImage(named:$0)!}) 75 | 76 | imageView.animationImages = images 77 | imageView.animationDuration = Double(images.count) * 0.03 78 | imageView.animationRepeatCount = 1000000 79 | imageView.startAnimating() 80 | } 81 | 82 | 83 | 84 | 85 | // MARK: SubGTMRefreshHeaderProtocol 86 | func contentHeight() -> CGFloat { 87 | return 60.0 88 | } 89 | 90 | 91 | func toNormalState() { 92 | print("\(self) toNormalState") 93 | //imageView.image = UIImage(named: "sun_000000") 94 | } 95 | 96 | func toRefreshingState() { 97 | // imageView.image = nil 98 | print("\(self) statr refreshing") 99 | startTransitionAnimation() 100 | } 101 | 102 | func toPullingState() { 103 | 104 | } 105 | 106 | func changePullingPercent(percent: CGFloat) { 107 | let adjustPercent = max(min(1.0, percent),0.0) 108 | let index = Int(adjustPercent * 27) 109 | let imageName = index < 10 ? "sun_0000\(index)" : "sun_000\(index)" 110 | DispatchQueue.main.async { [weak self] in 111 | self?.imageView.image = UIImage(named:imageName) 112 | } 113 | } 114 | func toWillRefreshState() { 115 | // imageView.image = nil 116 | print("\(self) will refreshing") 117 | startTransitionAnimation() 118 | } 119 | 120 | func willEndRefreshing(isSuccess: Bool) { 121 | print("\(self) willEndRefreshing") 122 | } 123 | 124 | func didEndRefreshing() { 125 | 126 | print("\(self) didEndRefreshing") 127 | imageView.stopAnimating() 128 | animating = false 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /GTMRefreshExample/YahooWeather/YahooWeatherTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YahooWeatherTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class YahooWeatherTableViewController: BaseTableViewController{ 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | self.tableView.backgroundColor = UIColor.lightGray 16 | //Setup 17 | let yahooHeader = YahooWeatherRefreshHeader() 18 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: yahooHeader) { 19 | [weak self] in 20 | print("excute refreshBlock") 21 | self?.refresh() 22 | } 23 | self.tableView.triggerRefreshing() 24 | } 25 | 26 | 27 | func refresh() { 28 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 29 | } 30 | 31 | @objc func endRefresing() { 32 | self.tableView.endRefreshing(isSuccess: true) 33 | }} 34 | -------------------------------------------------------------------------------- /GTMRefreshExample/YouKu/YoukuRefreshHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YoukuRefreshHeader.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import GTMRefresh 10 | import UIKit 11 | 12 | class YoukuRefreshHeader: GTMRefreshHeader, SubGTMRefreshHeaderProtocol { 13 | let iconImageView = UIImageView()// 这个ImageView用来显示下拉箭头 14 | let rotatingImageView = UIImageView() //这个ImageView用来播放动图 15 | let backgroundImageView = UIImageView() //这个ImageView用来显示广告的 16 | let frameHeight: CGFloat = UIScreen.main.bounds.size.width * 328.0/571.0 17 | 18 | override init(frame: CGRect) { 19 | 20 | // let adjustFrame = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.size.width, height: frameHeight) 21 | super.init(frame: frame) 22 | iconImageView.image = UIImage(named: "youku_down") 23 | rotatingImageView.image = UIImage(named: "youku_refreshing") 24 | backgroundImageView.image = UIImage(named: "youku_ad.jpeg") 25 | 26 | self.contentView.addSubview(backgroundImageView) 27 | self.contentView.addSubview(rotatingImageView) 28 | self.contentView.addSubview(iconImageView) 29 | } 30 | // override func willMove(toSuperview newSuperview: UIView?) { 31 | // super.willMove(toSuperview: newSuperview) 32 | // if let superView = newSuperview{ 33 | // self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: superView.frame.size.width, height: frameHeight) 34 | // } 35 | // } 36 | override func layoutSubviews() { 37 | super.layoutSubviews() 38 | 39 | let x = self.frame.origin.x, y = self.frame.origin.y, w = self.frame.size.width, h = self.frame.size.height 40 | 41 | backgroundImageView.frame = CGRect(x: x, y: y, width: w, height: frameHeight) 42 | backgroundImageView.center = CGPoint(x: w/2, y: h - frameHeight/2) 43 | 44 | iconImageView.frame = CGRect(x: 0, y: 0, width: 25, height: 25) 45 | iconImageView.center = CGPoint(x: w/2, y: h/2) 46 | 47 | rotatingImageView.frame = iconImageView.frame 48 | rotatingImageView.center = iconImageView.center 49 | } 50 | required init?(coder aDecoder: NSCoder) { 51 | fatalError("init(coder:) has not been implemented") 52 | } 53 | // override func willRefresHeight() -> CGFloat { 54 | // return 60 55 | // } 56 | override func refreshingHoldHeight() -> CGFloat { 57 | return self.backgroundImageView.isHidden ? 60 : frameHeight 58 | } 59 | 60 | 61 | func toNormalState() { 62 | UIView.animate(withDuration: 0.4, animations: { 63 | self.iconImageView.transform = CGAffineTransform.identity 64 | }) 65 | } 66 | func toRefreshingState() { 67 | self.iconImageView.isHidden = true 68 | self.rotatingImageView.isHidden = false 69 | let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 70 | rotateAnimation.toValue = NSNumber(value: Double.pi * 2.0 as Double) 71 | rotateAnimation.duration = 0.8 72 | rotateAnimation.isCumulative = true 73 | rotateAnimation.repeatCount = 10000000 74 | self.rotatingImageView.layer.add(rotateAnimation, forKey: "rotate") 75 | } 76 | func toPullingState() { 77 | // UIView.animate(withDuration: 0.4, animations: { 78 | // self.iconImageView.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+0.000001)) 79 | // }) 80 | } 81 | func toWillRefreshState() { 82 | } 83 | func changePullingPercent(percent: CGFloat) { 84 | self.iconImageView.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi+Double.pi*2*Double(percent))) 85 | } 86 | func willEndRefreshing(isSuccess: Bool) { 87 | self.rotatingImageView.isHidden = true 88 | self.iconImageView.isHidden = false 89 | self.iconImageView.layer.removeAllAnimations() 90 | self.iconImageView.layer.transform = CATransform3DIdentity 91 | self.iconImageView.image = UIImage(named: "youku_down") 92 | } 93 | func didEndRefreshing() { 94 | } 95 | func contentHeight()->CGFloat{ 96 | return 60 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /GTMRefreshExample/YouKu/YoukuTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YoukuTableViewController.swift 3 | // PullToRefreshKit 4 | // 5 | // Created by luoyang on 2016/12/8. 6 | // Copyright © 2016年 luoyang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class YoukuTableViewController:BaseTableViewController{ 13 | var refreshHeader:YoukuRefreshHeader? 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | //Setup 17 | //self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0) 18 | let youkuHeader = YoukuRefreshHeader() 19 | youkuHeader.backgroundImageView.isHidden = true 20 | self.refreshHeader = youkuHeader 21 | 22 | self.navigationItem.title = "Try switch" 23 | //Set up switch 24 | let sw = UISwitch() 25 | sw.isOn = !refreshHeader!.backgroundImageView.isHidden 26 | let rightItem = UIBarButtonItem(customView: sw) 27 | sw.addTarget(self, action: #selector(YoukuTableViewController.switchValueChanged(_:)), for: UIControl.Event.valueChanged) 28 | self.navigationItem.rightBarButtonItem = rightItem 29 | self.tableView.gtm_addRefreshHeaderView(refreshHeader: youkuHeader) { 30 | [weak self] in 31 | print("excute refreshBlock") 32 | self?.refresh() 33 | } 34 | self.tableView.triggerRefreshing() 35 | } 36 | 37 | 38 | func refresh() { 39 | perform(#selector(endRefresing), with: nil, afterDelay: 3) 40 | } 41 | 42 | @objc func endRefresing() { 43 | self.tableView.endRefreshing(isSuccess: true) 44 | } 45 | @objc func switchValueChanged(_ sender:UISwitch){ 46 | refreshHeader?.backgroundImageView.isHidden = !sender.isOn 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /GTMRefreshExample/YouKu/youku_ad.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YouKu/youku_ad.jpeg -------------------------------------------------------------------------------- /GTMRefreshExample/YouKu/youku_down@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YouKu/youku_down@3x.png -------------------------------------------------------------------------------- /GTMRefreshExample/YouKu/youku_refreshing@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/GTMRefreshExample/YouKu/youku_refreshing@3x.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016年 GTMYang 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 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GTMYang/GTMRefresh/12bab1591c5fc4dc9f41258a1bdcf30f0e185c56/logo.png --------------------------------------------------------------------------------