├── UzysAnimatedGifPullToRefresh.gif ├── UzysAnimatedGifPullToRefresh ├── UzysAnimatedGifPullToRefresh │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── resource │ │ ├── jgr@2x.gif │ │ ├── run@2x.gif │ │ ├── cupido@2x.gif │ │ ├── Preloader_10@2x.gif │ │ ├── spinner_dropbox@2x.gif │ │ └── Sprites │ │ │ ├── Preloader_9_00000@2x.png │ │ │ ├── Preloader_9_00001@2x.png │ │ │ ├── Preloader_9_00002@2x.png │ │ │ ├── Preloader_9_00003@2x.png │ │ │ ├── Preloader_9_00004@2x.png │ │ │ ├── Preloader_9_00005@2x.png │ │ │ ├── Preloader_9_00006@2x.png │ │ │ ├── Preloader_9_00007@2x.png │ │ │ ├── Preloader_9_00008@2x.png │ │ │ ├── Preloader_9_00009@2x.png │ │ │ ├── Preloader_9_00010@2x.png │ │ │ ├── Preloader_9_00011@2x.png │ │ │ ├── Preloader_9_00012@2x.png │ │ │ ├── Preloader_9_00013@2x.png │ │ │ ├── Preloader_9_00014@2x.png │ │ │ ├── Preloader_9_00015@2x.png │ │ │ ├── Preloader_9_00016@2x.png │ │ │ ├── Preloader_9_00017@2x.png │ │ │ ├── Preloader_9_00018@2x.png │ │ │ ├── Preloader_9_00019@2x.png │ │ │ ├── Preloader_9_00020@2x.png │ │ │ ├── Preloader_9_00021@2x.png │ │ │ ├── Preloader_9_00022@2x.png │ │ │ ├── Preloader_9_00023@2x.png │ │ │ ├── Preloader_9_00024@2x.png │ │ │ ├── Preloader_9_00025@2x.png │ │ │ ├── Preloader_9_00026@2x.png │ │ │ ├── Preloader_9_00027@2x.png │ │ │ ├── Preloader_9_00028@2x.png │ │ │ ├── Preloader_9_00029@2x.png │ │ │ ├── Preloader_9_00030@2x.png │ │ │ ├── Preloader_9_00031@2x.png │ │ │ ├── Preloader_9_00032@2x.png │ │ │ ├── Preloader_9_00033@2x.png │ │ │ ├── Preloader_9_00034@2x.png │ │ │ ├── Preloader_9_00035@2x.png │ │ │ ├── Preloader_9_00036@2x.png │ │ │ ├── Preloader_9_00037@2x.png │ │ │ ├── Preloader_9_00038@2x.png │ │ │ ├── Preloader_9_00039@2x.png │ │ │ ├── Preloader_9_00040@2x.png │ │ │ ├── Preloader_9_00041@2x.png │ │ │ ├── Preloader_9_00042@2x.png │ │ │ ├── Preloader_9_00043@2x.png │ │ │ ├── Preloader_9_00044@2x.png │ │ │ ├── Preloader_9_00045@2x.png │ │ │ ├── Preloader_9_00046@2x.png │ │ │ ├── Preloader_9_00047@2x.png │ │ │ ├── Preloader_9_00048@2x.png │ │ │ ├── Preloader_9_00049@2x.png │ │ │ ├── Preloader_9_00050@2x.png │ │ │ ├── Preloader_9_00051@2x.png │ │ │ ├── Preloader_9_00052@2x.png │ │ │ ├── Preloader_9_00053@2x.png │ │ │ ├── Preloader_9_00054@2x.png │ │ │ ├── Preloader_9_00055@2x.png │ │ │ ├── Preloader_9_00056@2x.png │ │ │ ├── Preloader_9_00057@2x.png │ │ │ ├── Preloader_9_00058@2x.png │ │ │ ├── Preloader_9_00059@2x.png │ │ │ ├── Preloader_9_00060@2x.png │ │ │ ├── Preloader_9_00061@2x.png │ │ │ ├── Preloader_9_00062@2x.png │ │ │ ├── Preloader_9_00063@2x.png │ │ │ ├── Preloader_9_00064@2x.png │ │ │ ├── Preloader_9_00065@2x.png │ │ │ ├── Preloader_9_00066@2x.png │ │ │ ├── Preloader_9_00067@2x.png │ │ │ ├── Preloader_9_00068@2x.png │ │ │ ├── Preloader_9_00069@2x.png │ │ │ ├── Preloader_9_00070@2x.png │ │ │ ├── Preloader_9_00071@2x.png │ │ │ ├── Preloader_9_00072@2x.png │ │ │ ├── Preloader_9_00073@2x.png │ │ │ ├── Preloader_9_00074@2x.png │ │ │ ├── Preloader_9_00075@2x.png │ │ │ ├── Preloader_9_00076@2x.png │ │ │ ├── Preloader_9_00077@2x.png │ │ │ ├── Preloader_9_00078@2x.png │ │ │ ├── Preloader_9_00079@2x.png │ │ │ ├── Preloader_9_00080@2x.png │ │ │ ├── Preloader_9_00081@2x.png │ │ │ └── Preloader_9_00082@2x.png │ ├── uzysViewController.h │ ├── uzysAppDelegate.h │ ├── Library │ │ ├── UzysAnimatedGifPullToRefreshConfiguration.h │ │ ├── UzysAnimatedGifActivityIndicator.h │ │ ├── UIScrollView+UzysAnimatedGifPullToRefresh.h │ │ ├── UIScrollView+UzysAnimatedGifPullToRefresh.m │ │ └── UzysAnimatedGifActivityIndicator.m │ ├── main.m │ ├── UzysAnimatedGifPullToRefresh-Prefix.pch │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── UzysAnimatedGifPullToRefresh-Info.plist │ ├── uzysAppDelegate.m │ ├── Base.lproj │ │ └── Main.storyboard │ └── uzysViewController.m ├── UzysAnimatedGifPullToRefreshTests │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── UzysAnimatedGifPullToRefreshTests-Info.plist │ └── UzysAnimatedGifPullToRefreshTests.m ├── Podfile ├── Pods │ ├── Target Support Files │ │ ├── AnimatedGIFImageSerialization │ │ │ ├── AnimatedGIFImageSerialization-prefix.pch │ │ │ ├── AnimatedGIFImageSerialization-dummy.m │ │ │ └── AnimatedGIFImageSerialization.xcconfig │ │ └── Pods-UzysAnimatedGifPullToRefresh │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh-dummy.m │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh.release.xcconfig │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh-acknowledgements.markdown │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh-acknowledgements.plist │ │ │ ├── Pods-UzysAnimatedGifPullToRefresh-frameworks.sh │ │ │ └── Pods-UzysAnimatedGifPullToRefresh-resources.sh │ ├── Headers │ │ ├── Private │ │ │ └── AnimatedGIFImageSerialization │ │ │ │ └── AnimatedGIFImageSerialization.h │ │ └── Public │ │ │ └── AnimatedGIFImageSerialization │ │ │ └── AnimatedGIFImageSerialization.h │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ ├── xcuserdata │ │ │ └── uzysjung.xcuserdatad │ │ │ │ └── xcschemes │ │ │ │ ├── xcschememanagement.plist │ │ │ │ ├── AnimatedGIFImageSerialization.xcscheme │ │ │ │ └── Pods-UzysAnimatedGifPullToRefresh.xcscheme │ │ └── project.pbxproj │ └── AnimatedGIFImageSerialization │ │ ├── LICENSE │ │ ├── README.md │ │ └── AnimatedGIFImageSerialization │ │ ├── AnimatedGIFImageSerialization.h │ │ └── AnimatedGIFImageSerialization.m ├── UzysAnimatedGifPullToRefresh.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── uzysjung.xcuserdatad │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ └── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ └── xcshareddata │ │ └── UzysAnimatedGifPullToRefresh.xccheckout ├── Podfile.lock ├── UzysAnimatedGifPullToRefresh.xcodeproj │ └── project.xcworkspace │ │ └── xcshareddata │ │ └── UzysAnimatedGifPullToRefresh.xccheckout └── Launch Screen.xib ├── .gitignore ├── UzysAnimatedGifPullToRefresh.podspec ├── LICENSE └── README.md /UzysAnimatedGifPullToRefresh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefreshTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '6.1' 2 | 3 | target 'UzysAnimatedGifPullToRefresh' do 4 | pod 'AnimatedGIFImageSerialization', '~> 0.2.0' 5 | end -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Headers/Private/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h: -------------------------------------------------------------------------------- 1 | ../../../AnimatedGIFImageSerialization/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Headers/Public/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h: -------------------------------------------------------------------------------- 1 | ../../../AnimatedGIFImageSerialization/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/jgr@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/jgr@2x.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/run@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/run@2x.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/cupido@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/cupido@2x.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Preloader_10@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Preloader_10@2x.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/spinner_dropbox@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/spinner_dropbox@2x.gif -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00000@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00000@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00001@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00001@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00002@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00002@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00003@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00003@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00004@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00004@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00005@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00005@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00006@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00006@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00007@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00007@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00008@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00008@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00009@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00009@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00010@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00010@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00011@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00011@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00012@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00012@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00013@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00013@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00014@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00014@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00015@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00015@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00016@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00016@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00017@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00017@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00018@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00018@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00019@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00019@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00020@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00020@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00021@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00021@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00022@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00022@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00023@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00023@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00024@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00024@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00025@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00025@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00026@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00026@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00027@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00027@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00028@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00028@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00029@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00029@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00030@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00030@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00031@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00031@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00032@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00032@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00033@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00033@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00034@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00034@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00035@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00035@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00036@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00036@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00037@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00037@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00038@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00038@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00039@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00039@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00040@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00040@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00041@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00041@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00042@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00042@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00043@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00043@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00044@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00044@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00045@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00045@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00046@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00046@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00047@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00047@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00048@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00048@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00049@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00049@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00050@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00050@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00051@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00051@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00052@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00052@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00053@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00053@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00054@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00054@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00055@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00055@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00056@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00056@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00057@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00057@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00058@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00058@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00059@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00059@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00060@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00060@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00061@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00061@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00062@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00062@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00063@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00063@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00064@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00064@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00065@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00065@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00066@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00066@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00067@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00067@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00068@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00068@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00069@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00069@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00070@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00070@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00071@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00071@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00072@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00072@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00073@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00073@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00074@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00074@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00075@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00075@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00076@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00076@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00077@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00077@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00078@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00078@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00079@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00079@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00080@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00080@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00081@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00081@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00082@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/resource/Sprites/Preloader_9_00082@2x.png -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_AnimatedGIFImageSerialization : NSObject 3 | @end 4 | @implementation PodsDummy_AnimatedGIFImageSerialization 5 | @end 6 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_UzysAnimatedGifPullToRefresh : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_UzysAnimatedGifPullToRefresh 5 | @end 6 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace/xcuserdata/uzysjung.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/HEAD/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace/xcuserdata/uzysjung.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # CocoaPods 2 | # 3 | # We recommend against adding the Pods directory to your .gitignore. However 4 | # you should judge for yourself, the pros and cons are mentioned at: 5 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control? 6 | # 7 | # Pods/ 8 | 9 | *.DS_Store 10 | *.gitignore 11 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AnimatedGIFImageSerialization (0.2.0) 3 | 4 | DEPENDENCIES: 5 | - AnimatedGIFImageSerialization (~> 0.2.0) 6 | 7 | SPEC CHECKSUMS: 8 | AnimatedGIFImageSerialization: b0f0cfe71eac1ee45a3d57ae533c23b8e6f29501 9 | 10 | PODFILE CHECKSUM: 0126e7974555640c060d3b0c88fe938e1fad2012 11 | 12 | COCOAPODS: 1.0.1 13 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/uzysViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // uzysViewController.h 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface uzysViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AnimatedGIFImageSerialization (0.2.0) 3 | 4 | DEPENDENCIES: 5 | - AnimatedGIFImageSerialization (~> 0.2.0) 6 | 7 | SPEC CHECKSUMS: 8 | AnimatedGIFImageSerialization: b0f0cfe71eac1ee45a3d57ae533c23b8e6f29501 9 | 10 | PODFILE CHECKSUM: 0126e7974555640c060d3b0c88fe938e1fad2012 11 | 12 | COCOAPODS: 1.0.1 13 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/uzysAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // uzysAppDelegate.h 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface uzysAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/UzysAnimatedGifPullToRefreshConfiguration.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject_UzysAnimatedGifPullToRefreshConfiguration.h 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 16.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #define initialPulltoRefreshThreshold 50.0 10 | #define StartPosition 10.0 11 | #define ProgressImageMargin 2.0 12 | #define LoadingImageMargin 2.0 -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "uzysAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([uzysAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "60x60", 21 | "scale" : "3x" 22 | } 23 | ], 24 | "info" : { 25 | "version" : 1, 26 | "author" : "xcode" 27 | } 28 | } -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AnimatedGIFImageSerialization 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AnimatedGIFImageSerialization" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AnimatedGIFImageSerialization" 4 | OTHER_LDFLAGS = -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AnimatedGIFImageSerialization" 3 | LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AnimatedGIFImageSerialization" 4 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AnimatedGIFImageSerialization" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"AnimatedGIFImageSerialization" -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AnimatedGIFImageSerialization" 3 | LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AnimatedGIFImageSerialization" 4 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AnimatedGIFImageSerialization" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"AnimatedGIFImageSerialization" -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefreshTests/UzysAnimatedGifPullToRefreshTests-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 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "UzysAnimatedGifPullToRefresh" 4 | s.version = "0.9.8" 5 | s.summary = "Add PullToRefresh using animated GIF to any scrollView with just simple code" 6 | s.author = { "Uzysjung" => "uzysjung@gmail.com" } 7 | 8 | s.homepage = "https://github.com/uzysjung/UzysAnimatedGifPullToRefresh" 9 | s.license = { :type => "MIT", :file => "LICENSE" } 10 | 11 | s.platform = :ios 12 | s.source = { :git => "https://github.com/uzysjung/UzysAnimatedGifPullToRefresh.git", :tag => "0.9.8" } 13 | s.requires_arc = true 14 | s.source_files = 'UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library' 15 | s.public_header_files = 'UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/*.h' 16 | s.dependency 'AnimatedGIFImageSerialization', '~> 0.2.0' 17 | s.ios.deployment_target = "6.0" 18 | 19 | end 20 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Pods.xcodeproj/xcuserdata/uzysjung.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | AnimatedGIFImageSerialization.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Pods-UzysAnimatedGifPullToRefresh.xcscheme 13 | 14 | isShown 15 | 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 372134479973790B9EFB36D12016B94B 21 | 22 | primary 23 | 24 | 25 | 6387037F36566267FB25B8B579D1DA83 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefreshTests/UzysAnimatedGifPullToRefreshTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // UzysAnimatedGifPullToRefreshTests.m 3 | // UzysAnimatedGifPullToRefreshTests 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UzysAnimatedGifPullToRefreshTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation UzysAnimatedGifPullToRefreshTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/AnimatedGIFImageSerialization/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## AnimatedGIFImageSerialization 5 | 6 | Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | Launch Screen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/AnimatedGIFImageSerialization/README.md: -------------------------------------------------------------------------------- 1 | AnimatedGIFImageSerialization 2 | ============================= 3 | 4 | `AnimatedGIFImageSerialization` decodes an `UIImage` from [Animated GIFs](http://en.wikipedia.org/wiki/Graphics_Interchange_Format) image data, following the API conventions of Foundation's `NSJSONSerialization` class. 5 | 6 | As it ships with iOS, `UIImage` does not support decoding animated gifs into an animated `UIImage`. But so long as `ANIMATED_GIF_NO_UIIMAGE_INITIALIZER_SWIZZLING` is not `#define`'d, the this library will swizzle the `UIImage` initializers to automatically support animated GIFs. 7 | 8 | ## Usage 9 | 10 | ### Decoding 11 | 12 | ```objective-c 13 | UIImageView *imageView = ...; 14 | imageView.image = [UIImage imageNamed:@"animated.gif"]; 15 | ``` 16 | 17 | ![Animated GIF](https://raw.githubusercontent.com/mattt/AnimatedGIFImageSerialization/master/Example/Animated%20GIF%20Example/animated.gif) 18 | 19 | ### Encoding 20 | 21 | ```objective-c 22 | UIImage *image = ...; 23 | NSData *data = [AnimatedGIFImageSerialization animatedGIFDataWithImage:image 24 | duration:1.0 25 | loopCount:1 26 | error:nil]; 27 | ``` 28 | 29 | --- 30 | 31 | ## Contact 32 | 33 | Mattt Thompson 34 | 35 | - http://github.com/mattt 36 | - http://twitter.com/mattt 37 | - m@mattt.me 38 | 39 | ## License 40 | 41 | AnimatedGIFImageSerialization is available under the MIT license. See the LICENSE file for more info. 42 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace/xcshareddata/UzysAnimatedGifPullToRefresh.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | F193A798-646E-4518-A959-358E30CC4B30 9 | IDESourceControlProjectName 10 | UzysAnimatedGifPullToRefresh 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 14 | https://github.com/uzysjung/UzysAnimatedGifPullToRefresh.git 15 | 16 | IDESourceControlProjectPath 17 | UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/uzysjung/UzysAnimatedGifPullToRefresh.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 36 | IDESourceControlWCCName 37 | UzysAnimatedGifPullToRefresh 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/UzysAnimatedGifActivityIndicator.h: -------------------------------------------------------------------------------- 1 | // 2 | // UzysAnimatedGifActivityIndicator.h 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 9.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | typedef void (^actionHandler)(void); 11 | typedef NS_ENUM(NSUInteger, UZYSPullToRefreshState) { 12 | UZYSGIFPullToRefreshStateNone =0, 13 | UZYSGIFPullToRefreshStateStopped, 14 | UZYSGIFPullToRefreshStateTriggering, 15 | UZYSGIFPullToRefreshStateTriggered, 16 | UZYSGIFPullToRefreshStateLoading, 17 | UZYSGIFPullToRefreshStateCanFinish 18 | }; 19 | 20 | @interface UzysAnimatedGifActivityIndicator : UIView 21 | @property (nonatomic,assign) BOOL isObserving; 22 | @property (nonatomic,assign) CGFloat originalTopInset; 23 | @property (nonatomic,assign) CGFloat landscapeTopInset; 24 | @property (nonatomic,assign) CGFloat portraitTopInset; 25 | 26 | @property (nonatomic,assign) UZYSPullToRefreshState state; 27 | @property (nonatomic,weak) UIScrollView *scrollView; 28 | @property (nonatomic,copy) actionHandler pullToRefreshHandler; 29 | @property (nonatomic,assign) BOOL showAlphaTransition; 30 | @property (nonatomic,assign) BOOL isVariableSize; 31 | @property (nonatomic,assign) UIActivityIndicatorViewStyle activityIndicatorStyle; 32 | 33 | - (id)initWithProgressImages:(NSArray *)progressImg LoadingImages:(NSArray *)loadingImages ProgressScrollThreshold:(NSInteger)threshold LoadingImagesFrameRate:(NSInteger)lFrameRate; 34 | - (void)stopIndicatorAnimation; 35 | - (void)manuallyTriggered; 36 | - (void)setSize:(CGSize) size; 37 | - (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle) style; 38 | 39 | - (void)setFrameSizeByProgressImage; 40 | - (void)setFrameSizeByLoadingImage; 41 | - (void)orientationChange:(UIDeviceOrientation)orientation; 42 | @end 43 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcodeproj/project.xcworkspace/xcshareddata/UzysAnimatedGifPullToRefresh.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 5AA3AF32-DA0E-42AC-AF32-77CF5635D24A 9 | IDESourceControlProjectName 10 | UzysAnimatedGifPullToRefresh 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 14 | https://github.com/uzysjung/UzysAnimatedGifPullToRefresh.git 15 | 16 | IDESourceControlProjectPath 17 | UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/uzysjung/UzysAnimatedGifPullToRefresh.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 0B1B0F807B4D6C3F443E03442FAC06B65A356E9C 36 | IDESourceControlWCCName 37 | UzysAnimatedGifPullToRefresh 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/uzysAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // uzysAppDelegate.m 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import "uzysAppDelegate.h" 10 | 11 | @implementation uzysAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | return YES; 17 | } 18 | 19 | - (void)applicationWillResignActive:(UIApplication *)application 20 | { 21 | // 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. 22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 23 | } 24 | 25 | - (void)applicationDidEnterBackground:(UIApplication *)application 26 | { 27 | // 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. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | - (void)applicationWillEnterForeground:(UIApplication *)application 32 | { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | - (void)applicationDidBecomeActive:(UIApplication *)application 37 | { 38 | // 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. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application 42 | { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Jaehoon Jung (Uzysjung) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | AnimatedGIFImageSerialization 24 | Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 25 | 26 | Permission is hereby granted, free of charge, to any person obtaining a copy 27 | of this software and associated documentation files (the "Software"), to deal 28 | in the Software without restriction, including without limitation the rights 29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | copies of the Software, and to permit persons to whom the Software is 31 | furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 42 | THE SOFTWARE. -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | AnimatedGIFImageSerialization 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - https://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Pods.xcodeproj/xcuserdata/uzysjung.xcuserdatad/xcschemes/AnimatedGIFImageSerialization.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Pods.xcodeproj/xcuserdata/uzysjung.xcuserdatad/xcschemes/Pods-UzysAnimatedGifPullToRefresh.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/UIScrollView+UzysAnimatedGifPullToRefresh.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIScrollView+UzysAnimatedGifPullToRefresh.h 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "UzysAnimatedGifActivityIndicator.h" 11 | @interface UIScrollView (UzysAnimatedGifPullToRefresh) 12 | @property (nonatomic,assign) BOOL showPullToRefresh; 13 | @property (nonatomic,assign) BOOL pullToRefreshAlphaTransition; 14 | @property (nonatomic,assign) BOOL pullToRefreshShowVariableSize; 15 | @property (nonatomic,assign) UIActivityIndicatorViewStyle activityIndcatorStyle; 16 | @property (nonatomic,strong) UzysAnimatedGifActivityIndicator *pullToRefreshView; 17 | 18 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 19 | ProgressImages:(NSArray *)progressImages 20 | LoadingImages:(NSArray *)loadingImages 21 | ProgressScrollThreshold:(NSInteger)threshold 22 | LoadingImagesFrameRate:(NSInteger)lframe; 23 | 24 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 25 | ProgressImages:(NSArray *)progressImages 26 | ProgressScrollThreshold:(NSInteger)threshold; 27 | 28 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 29 | ProgressImagesGifName:(NSString *)progressGifName 30 | ProgressScrollThreshold:(NSInteger)threshold; 31 | 32 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 33 | ProgressImagesGifName:(NSString *)progressGifName 34 | LoadingImagesGifName:(NSString *)loadingGifName 35 | ProgressScrollThreshold:(NSInteger)threshold; 36 | 37 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 38 | ProgressImagesGifName:(NSString *)progressGifName 39 | LoadingImagesGifName:(NSString *)loadingGifName 40 | ProgressScrollThreshold:(NSInteger)threshold 41 | LoadingImageFrameRate:(NSInteger)frameRate; 42 | 43 | - (void)removePullToRefreshActionHandler; 44 | 45 | - (void)triggerPullToRefresh; 46 | - (void)stopPullToRefreshAnimation; 47 | 48 | //For Orientation Changed 49 | - (void)addTopInsetInPortrait:(CGFloat)pInset TopInsetInLandscape:(CGFloat)lInset; // Should have called after addPullToRefreshActionHandler 50 | 51 | - (void)setPullToRefreshActivityIndcatorStyle:(UIActivityIndicatorViewStyle)activityIndcatorStyle; 52 | - (UIActivityIndicatorViewStyle)pullToRefreshActivityIndcatorStyle; 53 | @end 54 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h: -------------------------------------------------------------------------------- 1 | // AnimatedGIFImageSerialization.h 2 | // 3 | // Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 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 13 | // all 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 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 26 | 27 | #import 28 | 29 | /** 30 | 31 | */ 32 | extern __attribute__((overloadable)) UIImage * UIImageWithAnimatedGIFData(NSData *data); 33 | 34 | /** 35 | 36 | */ 37 | extern __attribute__((overloadable)) UIImage * UIImageWithAnimatedGIFData(NSData *data, CGFloat scale, NSTimeInterval duration, NSError * __autoreleasing *error); 38 | 39 | #pragma mark - 40 | 41 | /** 42 | 43 | */ 44 | extern __attribute__((overloadable)) NSData * UIImageAnimatedGIFRepresentation(UIImage *image); 45 | 46 | /** 47 | 48 | */ 49 | extern __attribute__((overloadable)) NSData * UIImageAnimatedGIFRepresentation(UIImage *image, NSTimeInterval duration, NSUInteger loopCount, NSError * __autoreleasing *error); 50 | 51 | #pragma mark - 52 | 53 | /** 54 | 55 | */ 56 | @interface AnimatedGIFImageSerialization : NSObject 57 | 58 | /// @name Creating an Animated GIF 59 | 60 | /** 61 | 62 | */ 63 | + (UIImage *)imageWithData:(NSData *)data 64 | error:(NSError * __autoreleasing *)error; 65 | 66 | /** 67 | 68 | */ 69 | + (UIImage *)imageWithData:(NSData *)data 70 | scale:(CGFloat)scale 71 | duration:(NSTimeInterval)duration 72 | error:(NSError * __autoreleasing *)error; 73 | 74 | /// @name Creating Animated Gif Data 75 | 76 | /** 77 | 78 | */ 79 | + (NSData *)animatedGIFDataWithImage:(UIImage *)image 80 | error:(NSError * __autoreleasing *)error; 81 | 82 | /** 83 | 84 | */ 85 | + (NSData *)animatedGIFDataWithImage:(UIImage *)image 86 | duration:(NSTimeInterval)duration 87 | loopCount:(NSUInteger)loopCount 88 | error:(NSError * __autoreleasing *)error; 89 | 90 | @end 91 | 92 | /** 93 | 94 | */ 95 | extern NSString * const AnimatedGIFImageErrorDomain; 96 | #endif 97 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "8.0", 8 | "subtype" : "736h", 9 | "scale" : "3x" 10 | }, 11 | { 12 | "orientation" : "landscape", 13 | "idiom" : "iphone", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "8.0", 16 | "subtype" : "736h", 17 | "scale" : "3x" 18 | }, 19 | { 20 | "orientation" : "portrait", 21 | "idiom" : "iphone", 22 | "extent" : "full-screen", 23 | "minimum-system-version" : "8.0", 24 | "subtype" : "667h", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "orientation" : "portrait", 29 | "idiom" : "iphone", 30 | "extent" : "full-screen", 31 | "minimum-system-version" : "7.0", 32 | "scale" : "2x" 33 | }, 34 | { 35 | "orientation" : "portrait", 36 | "idiom" : "iphone", 37 | "extent" : "full-screen", 38 | "minimum-system-version" : "7.0", 39 | "subtype" : "retina4", 40 | "scale" : "2x" 41 | }, 42 | { 43 | "orientation" : "portrait", 44 | "idiom" : "ipad", 45 | "extent" : "full-screen", 46 | "minimum-system-version" : "7.0", 47 | "scale" : "1x" 48 | }, 49 | { 50 | "orientation" : "landscape", 51 | "idiom" : "ipad", 52 | "extent" : "full-screen", 53 | "minimum-system-version" : "7.0", 54 | "scale" : "1x" 55 | }, 56 | { 57 | "orientation" : "portrait", 58 | "idiom" : "ipad", 59 | "extent" : "full-screen", 60 | "minimum-system-version" : "7.0", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "orientation" : "landscape", 65 | "idiom" : "ipad", 66 | "extent" : "full-screen", 67 | "minimum-system-version" : "7.0", 68 | "scale" : "2x" 69 | }, 70 | { 71 | "orientation" : "portrait", 72 | "idiom" : "iphone", 73 | "extent" : "full-screen", 74 | "scale" : "1x" 75 | }, 76 | { 77 | "orientation" : "portrait", 78 | "idiom" : "iphone", 79 | "extent" : "full-screen", 80 | "scale" : "2x" 81 | }, 82 | { 83 | "orientation" : "portrait", 84 | "idiom" : "iphone", 85 | "extent" : "full-screen", 86 | "subtype" : "retina4", 87 | "scale" : "2x" 88 | }, 89 | { 90 | "orientation" : "portrait", 91 | "idiom" : "ipad", 92 | "extent" : "to-status-bar", 93 | "scale" : "1x" 94 | }, 95 | { 96 | "orientation" : "portrait", 97 | "idiom" : "ipad", 98 | "extent" : "full-screen", 99 | "scale" : "1x" 100 | }, 101 | { 102 | "orientation" : "landscape", 103 | "idiom" : "ipad", 104 | "extent" : "to-status-bar", 105 | "scale" : "1x" 106 | }, 107 | { 108 | "orientation" : "landscape", 109 | "idiom" : "ipad", 110 | "extent" : "full-screen", 111 | "scale" : "1x" 112 | }, 113 | { 114 | "orientation" : "portrait", 115 | "idiom" : "ipad", 116 | "extent" : "to-status-bar", 117 | "scale" : "2x" 118 | }, 119 | { 120 | "orientation" : "portrait", 121 | "idiom" : "ipad", 122 | "extent" : "full-screen", 123 | "scale" : "2x" 124 | }, 125 | { 126 | "orientation" : "landscape", 127 | "idiom" : "ipad", 128 | "extent" : "to-status-bar", 129 | "scale" : "2x" 130 | }, 131 | { 132 | "orientation" : "landscape", 133 | "idiom" : "ipad", 134 | "extent" : "full-screen", 135 | "scale" : "2x" 136 | } 137 | ], 138 | "info" : { 139 | "version" : 1, 140 | "author" : "xcode" 141 | } 142 | } -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Launch Screen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/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 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Target Support Files/Pods-UzysAnimatedGifPullToRefresh/Pods-UzysAnimatedGifPullToRefresh-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | *) 22 | TARGET_DEVICE_ARGS="--target-device mac" 23 | ;; 24 | esac 25 | 26 | realpath() { 27 | DIRECTORY="$(cd "${1%/*}" && pwd)" 28 | FILENAME="${1##*/}" 29 | echo "$DIRECTORY/$FILENAME" 30 | } 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | UzysAnimatedGifPullToRefresh 2 | ============================ 3 | [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/master/LICENSE) 4 | [![CocoaPods](https://img.shields.io/cocoapods/v/UzysAnimatedGifPullToRefresh.svg?style=flat)](https://github.com/uzysjung/UzysAnimatedGifPullToRefresh) 5 | [![License MIT](https://img.shields.io/badge/contact-@Uzysjung-blue.svg?style=flat)](http://uzys.net) 6 | 7 | Add PullToRefresh using animated GIF to any scrollView with just simple code 8 | 9 | ![Screenshot](https://raw.githubusercontent.com/uzysjung/UzysAnimatedGifPullToRefresh/master/UzysAnimatedGifPullToRefresh.gif) 10 | 11 | **UzysAnimatedGifPullToRefresh features:** 12 | 13 | * simple to use. 14 | * Support CocoaPods. 15 | * ARC Only (if your project doesn't use ARC , Project -> Build Phases Tab -> Compile Sources Section -> Double Click on the file name Then add -fno-objc-arc to the popup window.) 16 | 17 | ## Information 18 | - Please Visit [UzysAnimatedGifLoadMore](https://github.com/uzysjung/UzysAnimatedGifLoadMore) 19 | 20 | ## Installation 21 | 1. UzysAnimatedGifPullToRefresh in your app is via CocoaPods. 22 | 2. Copy over the files libary folder to your project folder 23 | 24 | ## Usage 25 | ###Import header. 26 | 27 | ``` objective-c 28 | #import "UIScrollView+UzysAnimatedGifPullToRefresh.h" 29 | ``` 30 | 31 | ### Initialize 32 | adding PullToRefreshActionHandler 33 | 34 | ``` objective-c 35 | - (void)viewDidLoad 36 | { 37 | __weak typeof(self) weakSelf =self; 38 | [self.tableView addPullToRefreshActionHandler:^{ 39 | typeof(self) strongSelf = weakSelf; 40 | [strongSelf insertRowAtTop]; 41 | } 42 | ProgressImagesGifName:@"spinner_dropbox@2x.gif" 43 | LoadingImagesGifName:@"run@2x.gif" 44 | ProgressScrollThreshold:60 45 | LoadingImageFrameRate:30]; 46 | } 47 | ``` 48 | ### programmatically trigger PullToRefresh 49 | ``` objective-c 50 | [_tableView triggerPullToRefresh]; 51 | ``` 52 | 53 | ### stop PullToRefresh Activity Animation 54 | ``` objective-c 55 | [_tableView stopRefreshAnimation]; 56 | ``` 57 | 58 | 59 | ### option 60 | #### Progress : Animated GIF , Loading : Animated GIF 61 | ``` objective-c 62 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 63 | ProgressImagesGifName:(NSString *)progressGifName 64 | LoadingImagesGifName:(NSString *)loadingGifName 65 | ProgressScrollThreshold:(NSInteger)threshold; 66 | ``` 67 | #### Progress : Animated GIF , Loading : UIActivitiyIndicator 68 | ``` objective-c 69 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 70 | ProgressImagesGifName:(NSString *)progressGifName 71 | ProgressScrollThreshold:(NSInteger)threshold; 72 | ``` 73 | 74 | #### Progress : Array images , Loading : UIActivitiyIndicator 75 | ``` objective-c 76 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 77 | ProgressImages:(NSArray *)progressImages 78 | ProgressScrollThreshold:(NSInteger)threshold; 79 | ``` 80 | 81 | #### Progress : Array images , Loading : Array images 82 | ``` objective-c 83 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 84 | ProgressImages:(NSArray *)progressImages 85 | LoadingImages:(NSArray *)loadingImages 86 | ProgressScrollThreshold:(NSInteger)threshold 87 | LoadingImagesFrameRate:(NSInteger)lframe; 88 | ``` 89 | #### Setup TopInsets for both landscape and portrait. 90 | ``` objective-c 91 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:52]; 92 | // iOS 7 LandScape Navigationbar size 52 , Portrait Navigationbar size 64 93 | 94 | ``` 95 | #### Non Translucent Navigation Controller. 96 | ``` objective-c 97 | self.navigationController.navigationBar.translucent= NO; 98 | [self.tableView addTopInsetInPortrait:0 TopInsetInLandscape:0]; 99 | 100 | ``` 101 | 102 | ## Contact 103 | - [Uzys.net](http://uzys.net) 104 | 105 | ## License 106 | - See [LICENSE](https://github.com/uzysjung/UzysAnimatedGifPullToRefresh/blob/master/LICENSE). 107 | 108 | ## Acknowledgements 109 | This application makes use of the following third party libraries: 110 | 111 | ### AnimatedGIFImageSerialization 112 | Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 113 | 114 | Permission is hereby granted, free of charge, to any person obtaining a copy 115 | of this software and associated documentation files (the "Software"), to deal 116 | in the Software without restriction, including without limitation the rights 117 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 118 | copies of the Software, and to permit persons to whom the Software is 119 | furnished to do so, subject to the following conditions: 120 | 121 | The above copyright notice and this permission notice shall be included in 122 | all copies or substantial portions of the Software. 123 | 124 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 125 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 126 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 127 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 128 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 129 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 130 | THE SOFTWARE. 131 | 132 | ## Example Project Resources From 133 | * https://dribbble.com/shots/647290-Hold-on-a-sec-animated-Dropbox-logo 134 | * https://dribbble.com/shots/1421536-Cupido 135 | * http://www.justicedavidgutierrez.com/Treats 136 | * http://pixelbuddha.net/freebie/flat-preloaders 137 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/UIScrollView+UzysAnimatedGifPullToRefresh.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIScrollView+UzysAnimatedGifPullToRefresh.m 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import "UIScrollView+UzysAnimatedGifPullToRefresh.h" 10 | #import 11 | #import 12 | #define IS_IOS7 (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) 13 | #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] compare:@"8" options:NSNumericSearch] != NSOrderedAscending) 14 | #define IS_IPHONE6PLUS ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) && [[UIScreen mainScreen] nativeScale] == 3.0f) 15 | #define cDefaultFloatComparisonEpsilon 0.001 16 | #define cEqualFloats(f1, f2, epsilon) ( fabs( (f1) - (f2) ) < epsilon ) 17 | #define cNotEqualFloats(f1, f2, epsilon) ( !cEqualFloats(f1, f2, epsilon) ) 18 | 19 | static char UIScrollViewPullToRefreshView; 20 | 21 | @implementation UIScrollView (UzysAnimatedGifPullToRefresh) 22 | @dynamic pullToRefreshView, showPullToRefresh, activityIndcatorStyle; 23 | 24 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 25 | ProgressImages:(NSArray *)progressImages 26 | LoadingImages:(NSArray *)loadingImages 27 | ProgressScrollThreshold:(NSInteger)threshold 28 | LoadingImagesFrameRate:(NSInteger)lframe 29 | { 30 | if(self.pullToRefreshView == nil) 31 | { 32 | UzysAnimatedGifActivityIndicator *view = [[UzysAnimatedGifActivityIndicator alloc] initWithProgressImages:progressImages LoadingImages:loadingImages ProgressScrollThreshold:threshold LoadingImagesFrameRate:lframe]; 33 | view.pullToRefreshHandler = handler; 34 | view.scrollView = self; 35 | view.frame = CGRectMake((self.bounds.size.width - view.bounds.size.width)/2, 36 | -view.bounds.size.height, view.bounds.size.width, view.bounds.size.height); 37 | view.originalTopInset = self.contentInset.top; 38 | 39 | if(IS_IOS7) 40 | { 41 | if(cEqualFloats(self.contentInset.top, 64.00, cDefaultFloatComparisonEpsilon) && cEqualFloats(self.frame.origin.y, 0.0, cDefaultFloatComparisonEpsilon)) 42 | { 43 | view.portraitTopInset = 64.0; 44 | view.landscapeTopInset = 52.0; 45 | } 46 | } 47 | else if(IS_IOS8) 48 | { 49 | if(cEqualFloats(self.contentInset.top, 0.00, cDefaultFloatComparisonEpsilon) &&cEqualFloats(self.frame.origin.y, 0.0, cDefaultFloatComparisonEpsilon)) 50 | { 51 | view.portraitTopInset = 64.0; 52 | view.originalTopInset = 64.0; 53 | 54 | if(IS_IPHONE6PLUS) 55 | view.landscapeTopInset = 44.0; 56 | else 57 | view.landscapeTopInset = 32.0; 58 | 59 | } 60 | } 61 | [self addSubview:view]; 62 | [self sendSubviewToBack:view]; 63 | self.pullToRefreshView = view; 64 | self.showPullToRefresh = YES; 65 | } 66 | 67 | } 68 | 69 | - (void)addPullToRefreshActionHandler:(actionHandler)handler 70 | ProgressImages:(NSArray *)progressImages 71 | ProgressScrollThreshold:(NSInteger)threshold 72 | { 73 | [self addPullToRefreshActionHandler:handler 74 | ProgressImages:progressImages 75 | LoadingImages:nil 76 | ProgressScrollThreshold:threshold 77 | LoadingImagesFrameRate:0]; 78 | } 79 | 80 | - (void)addPullToRefreshActionHandler:(actionHandler)handler ProgressImagesGifName:(NSString *)progressGifName LoadingImagesGifName:(NSString *)loadingGifName ProgressScrollThreshold:(NSInteger)threshold 81 | { 82 | UIImage *progressImage = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:progressGifName]]; 83 | UIImage *loadingImage = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:loadingGifName]]; 84 | 85 | [self addPullToRefreshActionHandler:handler 86 | ProgressImages:progressImage.images 87 | LoadingImages:loadingImage.images 88 | ProgressScrollThreshold:threshold 89 | LoadingImagesFrameRate:(NSInteger)ceilf(1.0/(loadingImage.duration/loadingImage.images.count))]; 90 | } 91 | - (void)addPullToRefreshActionHandler:(actionHandler)handler ProgressImagesGifName:(NSString *)progressGifName LoadingImagesGifName:(NSString *)loadingGifName ProgressScrollThreshold:(NSInteger)threshold LoadingImageFrameRate:(NSInteger)frameRate 92 | { 93 | UIImage *progressImage = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:progressGifName]]; 94 | UIImage *loadingImage = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:loadingGifName]]; 95 | 96 | [self addPullToRefreshActionHandler:handler 97 | ProgressImages:progressImage.images 98 | LoadingImages:loadingImage.images 99 | ProgressScrollThreshold:threshold 100 | LoadingImagesFrameRate:frameRate]; 101 | } 102 | - (void)addPullToRefreshActionHandler:(actionHandler)handler ProgressImagesGifName:(NSString *)progressGifName ProgressScrollThreshold:(NSInteger)threshold 103 | { 104 | UIImage *progressImage = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:progressGifName]]; //[UIImage imageNamed:progressGifName]; 105 | 106 | [self addPullToRefreshActionHandler:handler 107 | ProgressImages:progressImage.images 108 | ProgressScrollThreshold:threshold]; 109 | } 110 | 111 | - (void)addTopInsetInPortrait:(CGFloat)pInset TopInsetInLandscape:(CGFloat)lInset 112 | { 113 | self.pullToRefreshView.portraitTopInset = pInset; 114 | self.pullToRefreshView.landscapeTopInset = lInset; 115 | 116 | UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 117 | if(orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) 118 | { 119 | self.pullToRefreshView.originalTopInset = self.pullToRefreshView.portraitTopInset; 120 | } 121 | else 122 | { 123 | self.pullToRefreshView.originalTopInset = self.pullToRefreshView.landscapeTopInset; 124 | } 125 | } 126 | 127 | - (void)removePullToRefreshActionHandler 128 | { 129 | self.showPullToRefresh = NO; 130 | [self.pullToRefreshView removeFromSuperview]; 131 | self.pullToRefreshView = nil; 132 | } 133 | - (void)triggerPullToRefresh 134 | { 135 | [self.pullToRefreshView manuallyTriggered]; 136 | } 137 | - (void)stopPullToRefreshAnimation 138 | { 139 | [self.pullToRefreshView stopIndicatorAnimation]; 140 | } 141 | #pragma mark - property 142 | - (void)setPullToRefreshView:(UzysAnimatedGifActivityIndicator *)pullToRefreshView 143 | { 144 | [self willChangeValueForKey:@"UzysAnimatedGifActivityIndicator"]; 145 | objc_setAssociatedObject(self, &UIScrollViewPullToRefreshView, pullToRefreshView, OBJC_ASSOCIATION_ASSIGN); 146 | [self didChangeValueForKey:@"UzysAnimatedGifActivityIndicator"]; 147 | } 148 | - (UzysAnimatedGifActivityIndicator *)pullToRefreshView 149 | { 150 | return objc_getAssociatedObject(self, &UIScrollViewPullToRefreshView); 151 | } 152 | 153 | - (void)setShowPullToRefresh:(BOOL)showPullToRefresh { 154 | self.pullToRefreshView.hidden = !showPullToRefresh; 155 | 156 | if(showPullToRefresh) 157 | { 158 | if(!self.pullToRefreshView.isObserving) 159 | { 160 | [self addObserver:self.pullToRefreshView forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil]; 161 | [self addObserver:self.pullToRefreshView forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; 162 | [self addObserver:self.pullToRefreshView forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; 163 | [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 164 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification 165 | object:[UIDevice currentDevice]]; 166 | 167 | self.pullToRefreshView.isObserving = YES; 168 | } 169 | } 170 | else 171 | { 172 | if(self.pullToRefreshView.isObserving) 173 | { 174 | [self removeObserver:self.pullToRefreshView forKeyPath:@"contentOffset"]; 175 | [self removeObserver:self.pullToRefreshView forKeyPath:@"contentSize"]; 176 | [self removeObserver:self.pullToRefreshView forKeyPath:@"frame"]; 177 | [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 178 | [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]]; 179 | 180 | self.pullToRefreshView.isObserving = NO; 181 | } 182 | } 183 | } 184 | 185 | - (BOOL)showPullToRefresh 186 | { 187 | return !self.pullToRefreshView.hidden; 188 | } 189 | 190 | - (void)setPullToRefreshAlphaTransition:(BOOL)showAlphaTransition 191 | { 192 | self.pullToRefreshView.showAlphaTransition = showAlphaTransition; 193 | } 194 | - (BOOL)pullToRefreshAlphaTransition 195 | { 196 | return self.pullToRefreshView.showAlphaTransition; 197 | } 198 | - (void)setPullToRefreshShowVariableSize:(BOOL)showVariableSize 199 | { 200 | self.pullToRefreshView.isVariableSize = showVariableSize; 201 | } 202 | -(BOOL)pullToRefreshShowVariableSize 203 | { 204 | return self.pullToRefreshView.isVariableSize; 205 | } 206 | - (void)setPullToRefreshActivityIndcatorStyle:(UIActivityIndicatorViewStyle)activityIndcatorStyle 207 | { 208 | [self.pullToRefreshView setActivityIndicatorViewStyle:activityIndcatorStyle]; 209 | } 210 | - (UIActivityIndicatorViewStyle)pullToRefreshActivityIndcatorStyle 211 | { 212 | return self.pullToRefreshView.activityIndicatorStyle; 213 | } 214 | - (void) orientationChanged:(NSNotification *)note 215 | { 216 | UIDevice * device = note.object; 217 | dispatch_async(dispatch_get_main_queue(), ^{ 218 | [self.pullToRefreshView orientationChange:device.orientation]; 219 | }); 220 | } 221 | - (void)willMoveToSuperview:(UIView *)newSuperview { 222 | if(newSuperview == nil) { 223 | [self removePullToRefreshActionHandler]; 224 | } 225 | } 226 | 227 | @end 228 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.m: -------------------------------------------------------------------------------- 1 | // AnimatedGIFImageSerialization.m 2 | // 3 | // Copyright (c) 2014 Mattt Thompson (http://mattt.me/) 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 13 | // all 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 21 | // THE SOFTWARE. 22 | 23 | #import "AnimatedGIFImageSerialization.h" 24 | 25 | #import 26 | #import 27 | 28 | NSString * const AnimatedGIFImageErrorDomain = @"com.compuserve.gif.image.error"; 29 | 30 | __attribute__((overloadable)) UIImage * UIImageWithAnimatedGIFData(NSData *data) { 31 | return UIImageWithAnimatedGIFData(data, [[UIScreen mainScreen] scale], 0.0f, nil); 32 | } 33 | 34 | __attribute__((overloadable)) UIImage * UIImageWithAnimatedGIFData(NSData *data, CGFloat scale, NSTimeInterval duration, NSError * __autoreleasing *error) { 35 | if (!data) { 36 | return nil; 37 | } 38 | 39 | NSDictionary *userInfo = nil; 40 | { 41 | NSMutableDictionary *mutableOptions = [NSMutableDictionary dictionary]; 42 | [mutableOptions setObject:@(YES) forKey:(NSString *)kCGImageSourceShouldCache]; 43 | [mutableOptions setObject:(NSString *)kUTTypeGIF forKey:(NSString *)kCGImageSourceTypeIdentifierHint]; 44 | 45 | CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)mutableOptions); 46 | 47 | size_t numberOfFrames = CGImageSourceGetCount(imageSource); 48 | NSMutableArray *mutableImages = [NSMutableArray arrayWithCapacity:numberOfFrames]; 49 | 50 | NSTimeInterval calculatedDuration = 0.0f; 51 | for (size_t idx = 0; idx < numberOfFrames; idx++) { 52 | CGImageRef imageRef = CGImageSourceCreateImageAtIndex(imageSource, idx, (__bridge CFDictionaryRef)mutableOptions); 53 | 54 | NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, idx, NULL); 55 | calculatedDuration += [[[properties objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary] objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime] doubleValue]; 56 | 57 | [mutableImages addObject:[UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp]]; 58 | 59 | CGImageRelease(imageRef); 60 | } 61 | 62 | CFRelease(imageSource); 63 | 64 | if (numberOfFrames == 1) { 65 | return [mutableImages firstObject]; 66 | } else { 67 | return [UIImage animatedImageWithImages:mutableImages duration:(duration <= 0.0f ? calculatedDuration : duration)]; 68 | } 69 | } 70 | _error: { 71 | if (error) { 72 | *error = [[NSError alloc] initWithDomain:AnimatedGIFImageErrorDomain code:-1 userInfo:userInfo]; 73 | } 74 | 75 | return nil; 76 | } 77 | } 78 | 79 | static BOOL AnimatedGifDataIsValid(NSData *data) { 80 | if (data.length > 4) { 81 | const unsigned char * bytes = [data bytes]; 82 | 83 | return bytes[0] == 0x47 && bytes[1] == 0x49 && bytes[2] == 0x46; 84 | } 85 | 86 | return NO; 87 | } 88 | 89 | __attribute__((overloadable)) NSData * UIImageAnimatedGIFRepresentation(UIImage *image) { 90 | return UIImageAnimatedGIFRepresentation(image, 0.0f, 0, nil); 91 | } 92 | 93 | __attribute__((overloadable)) NSData * UIImageAnimatedGIFRepresentation(UIImage *image, NSTimeInterval duration, NSUInteger loopCount, NSError * __autoreleasing *error) { 94 | if (!image.images) { 95 | return nil; 96 | } 97 | 98 | NSDictionary *userInfo = nil; 99 | { 100 | size_t frameCount = image.images.count; 101 | NSTimeInterval frameDuration = (duration <= 0.0 ? image.duration / frameCount : duration / frameCount); 102 | NSDictionary *frameProperties = @{ 103 | (__bridge NSString *)kCGImagePropertyGIFDictionary: @{ 104 | (__bridge NSString *)kCGImagePropertyGIFDelayTime: @(frameDuration) 105 | } 106 | }; 107 | 108 | NSMutableData *mutableData = [NSMutableData data]; 109 | CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)mutableData, kUTTypeGIF, frameCount, NULL); 110 | 111 | NSDictionary *imageProperties = @{ (__bridge NSString *)kCGImagePropertyGIFDictionary: @{ 112 | (__bridge NSString *)kCGImagePropertyGIFLoopCount: @(loopCount) 113 | } 114 | }; 115 | CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)imageProperties); 116 | 117 | for (size_t idx = 0; idx < image.images.count; idx++) { 118 | CGImageDestinationAddImage(destination, [[image.images objectAtIndex:idx] CGImage], (__bridge CFDictionaryRef)frameProperties); 119 | } 120 | 121 | BOOL success = CGImageDestinationFinalize(destination); 122 | CFRelease(destination); 123 | 124 | if (!success) { 125 | userInfo = @{ 126 | NSLocalizedDescriptionKey: NSLocalizedString(@"Could not finalize image destination", nil) 127 | }; 128 | 129 | goto _error; 130 | } 131 | 132 | return [NSData dataWithData:mutableData]; 133 | } 134 | _error: { 135 | if (error) { 136 | *error = [[NSError alloc] initWithDomain:AnimatedGIFImageErrorDomain code:-1 userInfo:userInfo]; 137 | } 138 | 139 | return nil; 140 | } 141 | } 142 | 143 | @implementation AnimatedGIFImageSerialization 144 | 145 | + (UIImage *)imageWithData:(NSData *)data 146 | error:(NSError * __autoreleasing *)error 147 | { 148 | return [self imageWithData:data scale:1.0f duration:0.0f error:error]; 149 | } 150 | 151 | + (UIImage *)imageWithData:(NSData *)data 152 | scale:(CGFloat)scale 153 | duration:(NSTimeInterval)duration 154 | error:(NSError * __autoreleasing *)error 155 | { 156 | return UIImageWithAnimatedGIFData(data, scale, duration, error); 157 | } 158 | 159 | #pragma mark - 160 | 161 | + (NSData *)animatedGIFDataWithImage:(UIImage *)image 162 | error:(NSError * __autoreleasing *)error 163 | { 164 | return [self animatedGIFDataWithImage:image duration:0.0f loopCount:0 error:error]; 165 | } 166 | 167 | + (NSData *)animatedGIFDataWithImage:(UIImage *)image 168 | duration:(NSTimeInterval)duration 169 | loopCount:(NSUInteger)loopCount 170 | error:(NSError *__autoreleasing *)error 171 | { 172 | return UIImageAnimatedGIFRepresentation(image, duration, loopCount, error); 173 | } 174 | 175 | @end 176 | 177 | #pragma mark - 178 | 179 | #ifndef ANIMATED_GIF_NO_UIIMAGE_INITIALIZER_SWIZZLING 180 | #import 181 | 182 | static inline void animated_gif_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) { 183 | Method originalMethod = class_getInstanceMethod(class, originalSelector); 184 | Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 185 | if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) { 186 | class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); 187 | } else { 188 | method_exchangeImplementations(originalMethod, swizzledMethod); 189 | } 190 | } 191 | 192 | @interface UIImage (_AnimatedGIFImageSerialization) 193 | @end 194 | 195 | @implementation UIImage (_AnimatedGIFImageSerialization) 196 | 197 | + (void)load { 198 | static dispatch_once_t onceToken; 199 | dispatch_once(&onceToken, ^{ 200 | @autoreleasepool { 201 | animated_gif_swizzleSelector(object_getClass((id)self), @selector(imageNamed:), @selector(animated_gif_imageNamed:)); 202 | animated_gif_swizzleSelector(object_getClass((id)self), @selector(imageWithData:), @selector(animated_gif_imageWithData:)); 203 | animated_gif_swizzleSelector(object_getClass((id)self), @selector(imageWithData:scale:), @selector(animated_gif_imageWithData:scale:)); 204 | animated_gif_swizzleSelector(object_getClass((id)self), @selector(imageWithContentsOfFile:), @selector(animated_gif_imageWithContentsOfFile:)); 205 | animated_gif_swizzleSelector(self, @selector(initWithContentsOfFile:), @selector(animated_gif_initWithContentsOfFile:)); 206 | animated_gif_swizzleSelector(self, @selector(initWithData:), @selector(animated_gif_initWithData:)); 207 | animated_gif_swizzleSelector(self, @selector(initWithData:scale:), @selector(animated_gif_initWithData:scale:)); 208 | } 209 | }); 210 | } 211 | 212 | #pragma mark - 213 | 214 | + (UIImage *)animated_gif_imageNamed:(NSString *)name __attribute__((objc_method_family(new))) { 215 | NSString *path = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension] ofType:[name pathExtension]]; 216 | if (!path) { 217 | path = [[NSBundle mainBundle] pathForResource:[[name stringByDeletingPathExtension] stringByAppendingString:@"@2x"] ofType:[name pathExtension]]; 218 | } 219 | 220 | if (path) { 221 | NSData *data = [NSData dataWithContentsOfFile:path]; 222 | if (AnimatedGifDataIsValid(data)) { 223 | return UIImageWithAnimatedGIFData(data); 224 | } 225 | } 226 | 227 | return [self animated_gif_imageNamed:name]; 228 | } 229 | 230 | + (UIImage *)animated_gif_imageWithContentsOfFile:(NSString *)path __attribute__((objc_method_family(new))) { 231 | if (path) { 232 | NSData *data = [NSData dataWithContentsOfFile:path]; 233 | if (AnimatedGifDataIsValid(data)) { 234 | if ([[path stringByDeletingPathExtension] hasSuffix:@"@2x"]) { 235 | return UIImageWithAnimatedGIFData(data, 2.0f, 0.0f, nil); 236 | } else { 237 | return UIImageWithAnimatedGIFData(data); 238 | } 239 | } 240 | } 241 | 242 | return [self animated_gif_imageWithContentsOfFile:path]; 243 | } 244 | 245 | + (UIImage *)animated_gif_imageWithData:(NSData *)data __attribute__((objc_method_family(init))) { 246 | if (AnimatedGifDataIsValid(data)) { 247 | return UIImageWithAnimatedGIFData(data); 248 | } 249 | 250 | return [self animated_gif_imageWithData:data]; 251 | } 252 | 253 | + (UIImage *)animated_gif_imageWithData:(NSData *)data 254 | scale:(CGFloat)scale __attribute__((objc_method_family(init))) 255 | { 256 | if (AnimatedGifDataIsValid(data)) { 257 | return UIImageWithAnimatedGIFData(data, scale, 0.0f, nil); 258 | } 259 | 260 | return [self animated_gif_imageWithData:data]; 261 | } 262 | 263 | #pragma mark - 264 | 265 | - (id)animated_gif_initWithContentsOfFile:(NSString *)path __attribute__((objc_method_family(init))) { 266 | NSData *data = [NSData dataWithContentsOfFile:path]; 267 | if (AnimatedGifDataIsValid(data)) { 268 | if ([[path stringByDeletingPathExtension] hasSuffix:@"@2x"]) { 269 | return UIImageWithAnimatedGIFData(data, 2.0, 0.0f, nil); 270 | } else { 271 | return UIImageWithAnimatedGIFData(data); 272 | } 273 | } 274 | 275 | return [self animated_gif_initWithContentsOfFile:path]; 276 | } 277 | 278 | - (id)animated_gif_initWithData:(NSData *)data __attribute__((objc_method_family(init))) { 279 | if (AnimatedGifDataIsValid(data)) { 280 | return UIImageWithAnimatedGIFData(data); 281 | } 282 | 283 | return [self animated_gif_initWithData:data]; 284 | } 285 | 286 | - (id)animated_gif_initWithData:(NSData *)data 287 | scale:(CGFloat)scale __attribute__((objc_method_family(init))) 288 | { 289 | if (AnimatedGifDataIsValid(data)) { 290 | return UIImageWithAnimatedGIFData(data, scale, 0.0f, nil); 291 | } 292 | 293 | return [self animated_gif_initWithData:data scale:scale]; 294 | } 295 | 296 | @end 297 | #endif 298 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/uzysViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // uzysViewController.m 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 8.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | // Animated Gif Sources From 9 | // https://dribbble.com/shots/1418440-Twisted-gif?list=searches&tag=animated_gif&offset=3 10 | // https://dribbble.com/shots/1262399-The-End-gif?list=searches&tag=animated_gif&offset=51 11 | // https://dribbble.com/shots/1421536-Cupido 12 | // http://pixelbuddha.net/freebie/flat-preloaders 13 | 14 | #import "uzysViewController.h" 15 | #import "UIScrollView+UzysAnimatedGifPullToRefresh.h" 16 | @interface uzysViewController () 17 | //@property (nonatomic,strong) UITableView *tableView; 18 | @property (nonatomic,strong) NSMutableArray *pData; 19 | @property (nonatomic,assign) BOOL isLoading; 20 | @property (nonatomic,assign) BOOL useActivityIndicator; 21 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 22 | @end 23 | #define IS_IOS7 (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) 24 | #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] compare:@"8" options:NSNumericSearch] != NSOrderedAscending) 25 | #define IS_IPHONE6PLUS ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) && [[UIScreen mainScreen] nativeScale] == 3.0f) 26 | 27 | #define CELLIDENTIFIER @"CELL" 28 | @implementation uzysViewController 29 | 30 | - (void)viewDidLoad 31 | { 32 | [super viewDidLoad]; 33 | // Do any additional setup after loading the view. 34 | [self setupDataSource]; 35 | if(IS_IOS7 || IS_IOS8) 36 | self.automaticallyAdjustsScrollViewInsets = YES; 37 | self.view.backgroundColor = [UIColor whiteColor]; 38 | self.title = @"UzysAnimatedGifPullToRefresh"; 39 | self.tableView.delegate = self; 40 | self.tableView.dataSource = self; 41 | self.tableView.backgroundColor = [UIColor clearColor]; 42 | [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CELLIDENTIFIER]; 43 | 44 | __weak typeof(self) weakSelf =self; 45 | [self.tableView addPullToRefreshActionHandler:^{ 46 | typeof(self) strongSelf = weakSelf; 47 | [strongSelf insertRowAtTop]; 48 | 49 | } ProgressImagesGifName:@"spinner_dropbox@2x.gif" LoadingImagesGifName:@"run@2x.gif" ProgressScrollThreshold:70 LoadingImageFrameRate:30]; 50 | 51 | // If you did not change scrollview inset, you don't need code below. 52 | if(IS_IOS7) 53 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:52]; 54 | else if(IS_IOS8) 55 | { 56 | CGFloat landscapeTopInset = 32.0; 57 | if(IS_IPHONE6PLUS) 58 | landscapeTopInset = 44.0; 59 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:landscapeTopInset]; 60 | } 61 | } 62 | - (void)didReceiveMemoryWarning 63 | { 64 | [super didReceiveMemoryWarning]; 65 | // Dispose of any resources that can be recreated. 66 | } 67 | 68 | -(void)viewWillAppear:(BOOL)animated 69 | { 70 | [super viewWillAppear:animated]; 71 | 72 | } 73 | - (void)viewDidAppear:(BOOL)animated 74 | { 75 | [super viewDidAppear:animated]; 76 | // Manually trigger 77 | [self.tableView triggerPullToRefresh]; 78 | } 79 | 80 | #pragma mark UITableView DataManagement 81 | - (void)setupDataSource { 82 | self.pData = [NSMutableArray array]; 83 | [self.pData addObject:@"0"]; 84 | [self.pData addObject:@"1"]; 85 | [self.pData addObject:@"2"]; 86 | [self.pData addObject:@"3"]; 87 | [self.pData addObject:@"4"]; 88 | [self.pData addObject:@"5"]; 89 | [self.pData addObject:@"6"]; 90 | 91 | for(int i=0; i<20; i++) 92 | [self.pData addObject:[NSDate dateWithTimeIntervalSinceNow:-(i*100)]]; 93 | } 94 | 95 | - (void)insertRowAtTop { 96 | __weak typeof(self) weakSelf = self; 97 | self.isLoading =YES; 98 | int64_t delayInSeconds = 2.2; 99 | dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 100 | dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 101 | typeof(self) strongSelf = weakSelf; 102 | [strongSelf.tableView beginUpdates]; 103 | [strongSelf.pData insertObject:[NSDate date] atIndex:0]; 104 | [strongSelf.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom]; 105 | [strongSelf.tableView endUpdates]; 106 | 107 | //Stop PullToRefresh Activity Animation 108 | [strongSelf.tableView stopPullToRefreshAnimation]; 109 | strongSelf.isLoading =NO; 110 | }); 111 | } 112 | 113 | #pragma mark UITableViewDataSource 114 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 115 | return 1; 116 | } 117 | 118 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 119 | return self.pData.count; 120 | } 121 | 122 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 123 | UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CELLIDENTIFIER]; 124 | 125 | if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"0"]) 126 | { 127 | cell.textLabel.textColor = [UIColor blackColor]; 128 | cell.textLabel.text = @"Progress Image by Array"; 129 | } 130 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"1"]) 131 | { 132 | cell.textLabel.textColor = [UIColor blackColor]; 133 | cell.textLabel.text = @"DropBox"; 134 | } 135 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"2"]) 136 | { 137 | cell.textLabel.textColor = [UIColor blackColor]; 138 | cell.textLabel.text = @"Cupido"; 139 | } 140 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"3"]) 141 | { 142 | cell.textLabel.textColor = [UIColor blackColor]; 143 | 144 | NSString *strLabel = [NSString stringWithFormat:@"Alpha Transition %@",self.tableView.pullToRefreshAlphaTransition ?@"ON":@"OFF"]; 145 | cell.textLabel.text = strLabel; 146 | } 147 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"4"]) 148 | { 149 | cell.textLabel.textColor = [UIColor blackColor]; 150 | 151 | NSString *strLabel = [NSString stringWithFormat:@"Variable Size %@",self.tableView.pullToRefreshShowVariableSize ?@"ON":@"OFF"]; 152 | cell.textLabel.text = strLabel; 153 | } 154 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"5"]) 155 | { 156 | cell.textLabel.textColor = [UIColor blackColor]; 157 | NSString *strLabel; 158 | if(self.useActivityIndicator) 159 | { 160 | NSArray *IndicatorStyle = @[@"WhiteLarge",@"White",@"Gray"]; 161 | strLabel = [NSString stringWithFormat:@"Indcator Style %@",IndicatorStyle[self.tableView.pullToRefreshActivityIndcatorStyle]]; 162 | } 163 | else 164 | { 165 | strLabel = @"UIActivityIndicator non-exist. (Tap \'Progress Image by Array\')"; 166 | } 167 | cell.textLabel.text = strLabel; 168 | } 169 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] &&[[self.pData objectAtIndex:indexPath.row] isEqualToString:@"6"]) 170 | { 171 | cell.textLabel.textColor = [UIColor blackColor]; 172 | NSString *strLabel; 173 | if(self.navigationController.navigationBar.translucent) 174 | { 175 | strLabel = @"navigationBar translucent NO"; 176 | } 177 | else 178 | { 179 | strLabel = @"navigationBar translucent YES"; 180 | } 181 | cell.textLabel.text = strLabel; 182 | } 183 | else 184 | { 185 | NSDate *date = [self.pData objectAtIndex:indexPath.row]; 186 | cell.textLabel.textColor = [UIColor grayColor]; 187 | cell.textLabel.text = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterLongStyle timeStyle:NSDateFormatterMediumStyle]; 188 | } 189 | 190 | cell.contentView.backgroundColor = [UIColor whiteColor]; 191 | 192 | 193 | return cell; 194 | } 195 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 196 | { 197 | if(self.isLoading) 198 | { 199 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 200 | return; 201 | } 202 | if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"0"]) 203 | { 204 | [self.tableView removePullToRefreshActionHandler]; 205 | 206 | __weak typeof(self) weakSelf =self; 207 | 208 | NSMutableArray *progress =[NSMutableArray array]; 209 | for (int i=0;i<83;i++) 210 | { 211 | NSString *fname = [NSString stringWithFormat:@"Preloader_9_%05d",i]; 212 | [progress addObject:[UIImage imageNamed:fname]]; 213 | } 214 | [self.tableView addPullToRefreshActionHandler:^{ 215 | typeof(self) strongSelf = weakSelf; 216 | [strongSelf insertRowAtTop]; 217 | 218 | } ProgressImages:progress ProgressScrollThreshold:60]; 219 | self.useActivityIndicator = YES; 220 | } 221 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"1"]) 222 | { 223 | [self.tableView removePullToRefreshActionHandler]; 224 | 225 | __weak typeof(self) weakSelf =self; 226 | [self.tableView addPullToRefreshActionHandler:^{ 227 | typeof(self) strongSelf = weakSelf; 228 | [strongSelf insertRowAtTop]; 229 | 230 | } ProgressImagesGifName:@"spinner_dropbox@2x.gif" LoadingImagesGifName:@"run@2x.gif" ProgressScrollThreshold:60 LoadingImageFrameRate:30]; 231 | self.useActivityIndicator = NO; 232 | 233 | if(IS_IOS7) 234 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:52]; 235 | else if(IS_IOS8) 236 | { 237 | CGFloat landscapeTopInset = 32.0; 238 | if(IS_IPHONE6PLUS) 239 | landscapeTopInset = 44.0; 240 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:landscapeTopInset]; 241 | } 242 | 243 | } 244 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"2"]) 245 | { 246 | [self.tableView removePullToRefreshActionHandler]; 247 | 248 | __weak typeof(self) weakSelf =self; 249 | [self.tableView addPullToRefreshActionHandler:^{ 250 | typeof(self) strongSelf = weakSelf; 251 | [strongSelf insertRowAtTop]; 252 | 253 | } ProgressImagesGifName:@"cupido@2x.gif" LoadingImagesGifName:@"jgr@2x.gif" ProgressScrollThreshold:70]; 254 | self.useActivityIndicator = NO; 255 | 256 | if(IS_IOS7) 257 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:52]; 258 | else if(IS_IOS8) 259 | { 260 | CGFloat landscapeTopInset = 32.0; 261 | if(IS_IPHONE6PLUS) 262 | landscapeTopInset = 44.0; 263 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:landscapeTopInset]; 264 | } 265 | } 266 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"3"]) 267 | { 268 | self.tableView.pullToRefreshAlphaTransition = !self.tableView.pullToRefreshAlphaTransition; 269 | 270 | } 271 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"4"]) 272 | { 273 | self.tableView.pullToRefreshShowVariableSize = !self.tableView.pullToRefreshShowVariableSize; 274 | } 275 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"5"]) 276 | { 277 | static NSInteger styleCnt =0; 278 | styleCnt++; 279 | if(styleCnt >2) 280 | styleCnt = 0; 281 | self.tableView.pullToRefreshActivityIndcatorStyle = styleCnt; 282 | } 283 | else if([[self.pData objectAtIndex:indexPath.row] isKindOfClass:[NSString class]] && [[self.pData objectAtIndex:indexPath.row] isEqualToString:@"6"]) 284 | { 285 | [self.tableView removePullToRefreshActionHandler]; 286 | 287 | 288 | __weak typeof(self) weakSelf =self; 289 | [self.tableView addPullToRefreshActionHandler:^{ 290 | typeof(self) strongSelf = weakSelf; 291 | [strongSelf insertRowAtTop]; 292 | 293 | } ProgressImagesGifName:@"cupido@2x.gif" LoadingImagesGifName:@"jgr@2x.gif" ProgressScrollThreshold:70]; 294 | 295 | 296 | if(self.navigationController.navigationBar.translucent) 297 | { 298 | self.navigationController.navigationBar.translucent = NO; 299 | [self.tableView addTopInsetInPortrait:0 TopInsetInLandscape:0]; 300 | } 301 | else 302 | { 303 | self.navigationController.navigationBar.translucent = YES; 304 | if(IS_IOS7) 305 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:52]; 306 | else if(IS_IOS8) 307 | { 308 | CGFloat landscapeTopInset = 32.0; 309 | if(IS_IPHONE6PLUS) 310 | landscapeTopInset = 44.0; 311 | [self.tableView addTopInsetInPortrait:64 TopInsetInLandscape:landscapeTopInset]; 312 | } 313 | } 314 | 315 | } 316 | [self.tableView reloadData]; 317 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 318 | } 319 | 320 | - (UIInterfaceOrientationMask)supportedInterfaceOrientations 321 | { 322 | return UIInterfaceOrientationMaskAll; 323 | } 324 | 325 | @end 326 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh/Library/UzysAnimatedGifActivityIndicator.m: -------------------------------------------------------------------------------- 1 | // 2 | // UzysAnimatedGifActivityIndicator.m 3 | // UzysAnimatedGifPullToRefresh 4 | // 5 | // Created by Uzysjung on 2014. 4. 9.. 6 | // Copyright (c) 2014년 Uzys. All rights reserved. 7 | // 8 | 9 | #import "UzysAnimatedGifActivityIndicator.h" 10 | #import "UIScrollView+UzysAnimatedGifPullToRefresh.h" 11 | #import "UzysAnimatedGifPullToRefreshConfiguration.h" 12 | #define DEGREES_TO_RADIANS(x) (x)/180.0*M_PI 13 | #define RADIANS_TO_DEGREES(x) (x)/M_PI*180.0 14 | #define cDefaultFloatComparisonEpsilon 0.001 15 | #define cEqualFloats(f1, f2, epsilon) ( fabs( (f1) - (f2) ) < epsilon ) 16 | #define cNotEqualFloats(f1, f2, epsilon) ( !cEqualFloats(f1, f2, epsilon) ) 17 | 18 | 19 | @interface UzysAnimatedGifActivityIndicator() 20 | @property (nonatomic,strong) UIImageView *imageViewProgress; 21 | @property (nonatomic,strong) UIImageView *imageViewLoading; 22 | 23 | @property (nonatomic,strong) NSArray *pImgArrProgress; 24 | @property (nonatomic,strong) NSArray *pImgArrLoading; 25 | 26 | @property (nonatomic, strong) UIActivityIndicatorView *activityIndicatorView; //Loading Indicator 27 | @property (nonatomic, assign) double progress; 28 | @property (nonatomic, assign) NSInteger progressThreshold; 29 | @property (nonatomic, assign) NSInteger LoadingFrameRate; 30 | - (void)_commonInit; 31 | - (void)_initAnimationView; 32 | @end 33 | @implementation UzysAnimatedGifActivityIndicator 34 | 35 | - (id)initWithProgressImages:(NSArray *)progressImg LoadingImages:(NSArray *)loadingImages ProgressScrollThreshold:(NSInteger)threshold LoadingImagesFrameRate:(NSInteger)lFrameRate 36 | { 37 | if(threshold <=0) 38 | { 39 | threshold = initialPulltoRefreshThreshold; 40 | } 41 | UIImage *image1 = progressImg.firstObject; 42 | self = [super initWithFrame:CGRectMake(0, -image1.size.height, image1.size.width, image1.size.height)]; 43 | if(self) { 44 | self.pImgArrProgress = progressImg; 45 | self.pImgArrLoading = loadingImages; 46 | self.progressThreshold = threshold; 47 | self.LoadingFrameRate = lFrameRate; 48 | [self _commonInit]; 49 | } 50 | return self; 51 | } 52 | 53 | - (void)_commonInit 54 | { 55 | self.activityIndicatorStyle = UIActivityIndicatorViewStyleGray; 56 | self.contentMode = UIViewContentModeRedraw; 57 | 58 | 59 | self.state = UZYSGIFPullToRefreshStateNone; 60 | self.backgroundColor = [UIColor clearColor]; 61 | 62 | NSAssert([self.pImgArrProgress.lastObject isKindOfClass:[UIImage class]], @"pImgArrProgress Array has object that is not image"); 63 | self.imageViewProgress = [[UIImageView alloc] initWithImage:[self.pImgArrProgress lastObject]]; 64 | self.imageViewProgress.contentMode = UIViewContentModeScaleAspectFit; 65 | self.imageViewProgress.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; 66 | self.imageViewProgress.frame = self.bounds; 67 | self.imageViewProgress.backgroundColor = [UIColor clearColor]; 68 | [self addSubview:self.imageViewProgress]; 69 | 70 | if(self.pImgArrLoading==nil) 71 | { 72 | _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorStyle]; 73 | _activityIndicatorView.hidesWhenStopped = YES; 74 | _activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; 75 | _activityIndicatorView.frame = self.bounds; 76 | [self addSubview:_activityIndicatorView]; 77 | } 78 | else 79 | { 80 | NSAssert([self.pImgArrLoading.lastObject isKindOfClass:[UIImage class]], @"pImgArrLoading Array has object that is not image"); 81 | self.imageViewLoading = [[UIImageView alloc] initWithImage:[self.pImgArrLoading firstObject]]; 82 | self.imageViewLoading.contentMode = UIViewContentModeScaleAspectFit; 83 | self.imageViewLoading.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; 84 | self.imageViewLoading.frame = self.bounds; 85 | self.imageViewLoading.animationImages = self.pImgArrLoading; 86 | self.imageViewLoading.animationDuration = (CGFloat)ceilf((1.0/(CGFloat)self.LoadingFrameRate) * (CGFloat)self.imageViewLoading.animationImages.count); 87 | self.imageViewLoading.alpha = 0.0f; 88 | self.imageViewLoading.backgroundColor = [UIColor clearColor]; 89 | [self addSubview:self.imageViewLoading]; 90 | } 91 | self.alpha = 0.0f; 92 | [self actionStopState]; 93 | } 94 | 95 | - (void)_initAnimationView { 96 | 97 | if(self.pImgArrLoading.count>0) 98 | { 99 | [self.imageViewLoading stopAnimating]; 100 | self.imageViewLoading.alpha = 0.0f; 101 | 102 | } 103 | else 104 | { 105 | self.activityIndicatorView.transform = CGAffineTransformIdentity; 106 | [self.activityIndicatorView stopAnimating]; 107 | self.activityIndicatorView.alpha = 0.0f; 108 | } 109 | // self.alpha = 0.0f; 110 | } 111 | - (void)layoutSubviews{ 112 | [super layoutSubviews]; 113 | } 114 | 115 | 116 | #pragma mark - ScrollViewInset 117 | - (void)setupScrollViewContentInsetForLoadingIndicator:(actionHandler)handler animation:(BOOL)animation 118 | { 119 | 120 | UIEdgeInsets currentInsets = self.scrollView.contentInset; 121 | float idealOffset = self.originalTopInset + self.bounds.size.height + 20.0; 122 | currentInsets.top = idealOffset; 123 | 124 | [self setScrollViewContentInset:currentInsets handler:handler animation:animation]; 125 | } 126 | - (void)resetScrollViewContentInset:(actionHandler)handler animation:(BOOL)animation 127 | { 128 | UIEdgeInsets currentInsets = self.scrollView.contentInset; 129 | currentInsets.top = self.originalTopInset; 130 | [self setScrollViewContentInset:currentInsets handler:handler animation:animation]; 131 | } 132 | - (void)setScrollViewContentInset:(UIEdgeInsets)contentInset handler:(actionHandler)handler animation:(BOOL)animation 133 | { 134 | // NSLog(@"offset %f",self.scrollView.contentOffset.y); 135 | if(animation) 136 | { 137 | [UIView animateWithDuration:0.3 138 | delay:0 139 | options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState 140 | animations:^{ 141 | self.scrollView.contentInset = contentInset; 142 | if(self.state == UZYSGIFPullToRefreshStateLoading && self.scrollView.contentOffset.y <10) { 143 | self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, -1*contentInset.top); 144 | } 145 | } 146 | completion:^(BOOL finished) { 147 | if(handler) 148 | handler(); 149 | }]; 150 | } 151 | else 152 | { 153 | self.scrollView.contentInset = contentInset; 154 | 155 | if(self.state == UZYSGIFPullToRefreshStateLoading && self.scrollView.contentOffset.y <10) { 156 | self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, -1*contentInset.top); 157 | } 158 | 159 | if(handler) 160 | handler(); 161 | } 162 | } 163 | #pragma mark - property 164 | - (void)setProgress:(double)progress 165 | { 166 | static double prevProgress; 167 | if(progress > 1.0) 168 | { 169 | progress = 1.0; 170 | } 171 | if(self.showAlphaTransition) 172 | { 173 | if(self.state < UZYSGIFPullToRefreshStateTriggered) 174 | self.alpha = 1.0 * progress; 175 | else 176 | self.alpha = 1.0; 177 | } 178 | else 179 | { 180 | CGFloat alphaValue = 1.0 * progress *5; 181 | if(alphaValue > 1.0) 182 | alphaValue = 1.0f; 183 | self.alpha = alphaValue; 184 | 185 | } 186 | if (progress >= 0.0f && progress <=1.0f) { 187 | //Animation 188 | NSInteger index = (NSInteger)roundf((self.pImgArrProgress.count ) * progress); 189 | if(index ==0) 190 | { 191 | self.imageViewProgress.image = nil; 192 | } 193 | else 194 | { 195 | self.imageViewProgress.image = [self.pImgArrProgress objectAtIndex:index-1]; 196 | } 197 | } 198 | _progress = progress; 199 | prevProgress = progress; 200 | } 201 | - (void)dealloc 202 | { 203 | self.imageViewLoading = nil; 204 | self.imageViewProgress = nil; 205 | self.pImgArrLoading = nil; 206 | self.pImgArrProgress = nil; 207 | self.activityIndicatorView = nil; 208 | 209 | } 210 | #pragma mark - KVO 211 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 212 | { 213 | if([keyPath isEqualToString:@"contentOffset"]) 214 | { 215 | [self scrollViewDidScroll:[[change valueForKey:NSKeyValueChangeNewKey] CGPointValue]]; 216 | } 217 | else if([keyPath isEqualToString:@"contentSize"]) 218 | { 219 | [self setNeedsLayout]; 220 | [self setNeedsDisplay]; 221 | self.center = CGPointMake(self.scrollView.center.x, self.center.y); 222 | } 223 | else if([keyPath isEqualToString:@"frame"]) 224 | { 225 | [self setFrameSizeByProgressImage]; 226 | 227 | [self setNeedsLayout]; 228 | [self setNeedsDisplay]; 229 | } 230 | } 231 | - (void)scrollViewDidScroll:(CGPoint)contentOffset 232 | { 233 | static double prevProgress; 234 | CGFloat yOffset = contentOffset.y; 235 | self.progress = ((yOffset+ self.originalTopInset + StartPosition)/(-self.progressThreshold )); 236 | self.center = CGPointMake(self.scrollView.center.x, (contentOffset.y+ self.originalTopInset)/2); 237 | 238 | switch (_state) { 239 | case UZYSGIFPullToRefreshStateStopped: //finish (1) 240 | break; 241 | case UZYSGIFPullToRefreshStateNone: //detect action (0) 242 | { 243 | if(self.scrollView.isDragging && yOffset < 0.0f ) 244 | { 245 | self.imageViewProgress.alpha = 1.0f; 246 | [self setFrameSizeByProgressImage]; 247 | self.state = UZYSGIFPullToRefreshStateTriggering; 248 | } 249 | } 250 | break; 251 | case UZYSGIFPullToRefreshStateTriggering: //progress (2) 252 | { 253 | if(self.progress >= 1.0f) 254 | self.state = UZYSGIFPullToRefreshStateTriggered; 255 | } 256 | break; 257 | case UZYSGIFPullToRefreshStateTriggered: //fire actionhandler (3) 258 | if(self.scrollView.isDragging == NO && prevProgress > 0.98f) 259 | { 260 | [self actionTriggeredState]; 261 | } 262 | break; 263 | case UZYSGIFPullToRefreshStateLoading: //wait until stopIndicatorAnimation (4) 264 | break; 265 | case UZYSGIFPullToRefreshStateCanFinish: //(5) 266 | if(self.progress < 0.01f + ((CGFloat)StartPosition/-self.progressThreshold) && self.progress > -0.01f +((CGFloat)StartPosition/-self.progressThreshold)) 267 | { 268 | self.state = UZYSGIFPullToRefreshStateNone; 269 | } 270 | break; 271 | default: 272 | break; 273 | } 274 | //because of iOS6 KVO performance 275 | prevProgress = self.progress; 276 | 277 | } 278 | 279 | - (void)willMoveToSuperview:(UIView *)newSuperview { 280 | if (self.superview && newSuperview == nil) { 281 | UIScrollView *scrollView = (UIScrollView *)self.superview; 282 | if (scrollView.showPullToRefresh) { 283 | if (self.isObserving) { 284 | [scrollView removeObserver:self forKeyPath:@"contentOffset"]; 285 | [scrollView removeObserver:self forKeyPath:@"contentSize"]; 286 | [scrollView removeObserver:self forKeyPath:@"frame"]; 287 | self.isObserving = NO; 288 | } 289 | } 290 | } 291 | } 292 | 293 | -(void)actionStopState 294 | { 295 | self.state = UZYSGIFPullToRefreshStateCanFinish; 296 | [UIView animateWithDuration:0.2f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction animations:^{ 297 | if(self.pImgArrLoading.count>0) 298 | { 299 | 300 | } 301 | else 302 | { 303 | self.activityIndicatorView.transform = CGAffineTransformMakeScale(0.1, 0.1); 304 | } 305 | } completion:^(BOOL finished) { 306 | 307 | }]; 308 | 309 | [self resetScrollViewContentInset:^{ 310 | } animation:YES]; 311 | 312 | [self _initAnimationView]; 313 | } 314 | -(void)actionTriggeredState 315 | { 316 | self.state = UZYSGIFPullToRefreshStateLoading; 317 | 318 | [UIView animateWithDuration:0.2f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState animations:^{ 319 | self.imageViewProgress.alpha = 0.0f; 320 | // NSLog(@"state : %d",self.isVariableSize); 321 | 322 | if(self.isVariableSize) 323 | { 324 | [self setFrameSizeByLoadingImage]; 325 | } 326 | if(self.pImgArrLoading.count>0) 327 | { 328 | self.imageViewLoading.alpha = 1.0f; 329 | } 330 | else 331 | { 332 | self.activityIndicatorView.alpha = 1.0f; 333 | } 334 | 335 | } completion:^(BOOL finished) { 336 | 337 | }]; 338 | 339 | if(self.pImgArrLoading.count>0) 340 | { 341 | [self.imageViewLoading startAnimating]; 342 | } 343 | else 344 | { 345 | [self.activityIndicatorView startAnimating]; 346 | } 347 | 348 | [self setupScrollViewContentInsetForLoadingIndicator:^{ 349 | 350 | } animation:YES]; 351 | 352 | if(self.pullToRefreshHandler) 353 | self.pullToRefreshHandler(); 354 | 355 | 356 | 357 | } 358 | - (void)setFrameSizeByProgressImage 359 | { 360 | UIImage *image1 = self.pImgArrProgress.lastObject; 361 | if(image1) 362 | self.frame = CGRectMake((self.scrollView.bounds.size.width - image1.size.width)/2, -image1.size.height, image1.size.width, image1.size.height); 363 | } 364 | - (void)setFrameSizeByLoadingImage 365 | { 366 | UIImage *image1 = self.pImgArrLoading.lastObject; 367 | if(image1) 368 | { 369 | self.frame = CGRectMake((self.scrollView.bounds.size.width - image1.size.width)/2, -image1.size.height, image1.size.width, image1.size.height); 370 | } 371 | } 372 | - (void)orientationChange:(UIDeviceOrientation)orientation { 373 | 374 | UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 375 | UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 376 | 377 | if((NSInteger)deviceOrientation !=(NSInteger)statusBarOrientation){ 378 | return; 379 | } 380 | 381 | if(UIDeviceOrientationIsLandscape(orientation)) 382 | { 383 | if(cNotEqualFloats( self.landscapeTopInset , 0.0 , cDefaultFloatComparisonEpsilon)) 384 | self.originalTopInset = self.landscapeTopInset; 385 | } 386 | else 387 | { 388 | if(cNotEqualFloats( self.portraitTopInset , 0.0 , cDefaultFloatComparisonEpsilon)) 389 | self.originalTopInset = self.portraitTopInset; 390 | } 391 | 392 | if(self.state == UZYSGIFPullToRefreshStateLoading) 393 | { 394 | if( self.isVariableSize ) { 395 | [self setFrameSizeByLoadingImage]; 396 | 397 | } else { 398 | [self setFrameSizeByProgressImage]; 399 | } 400 | [self setupScrollViewContentInsetForLoadingIndicator:^{ 401 | 402 | } animation:NO]; 403 | } 404 | else 405 | { 406 | [self setFrameSizeByProgressImage]; 407 | [self resetScrollViewContentInset:^{ 408 | 409 | } animation:NO]; 410 | } 411 | self.alpha = 1.0f; 412 | 413 | 414 | } 415 | 416 | #pragma mark - public method 417 | - (void)stopIndicatorAnimation 418 | { 419 | [self actionStopState]; 420 | } 421 | - (void)manuallyTriggered 422 | { 423 | UIEdgeInsets currentInsets = self.scrollView.contentInset; 424 | currentInsets.top = self.originalTopInset + self.bounds.size.height + 20.0f; 425 | [UIView animateWithDuration:0.3f delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 426 | self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, -currentInsets.top); 427 | } completion:^(BOOL finished) { 428 | [self actionTriggeredState]; 429 | }]; 430 | } 431 | - (void)setSize:(CGSize) size 432 | { 433 | CGRect rect = CGRectMake((self.scrollView.bounds.size.width - size.width)/2, 434 | -size.height, size.width, size.height); 435 | self.frame=rect; 436 | self.activityIndicatorView.frame = self.bounds; 437 | self.imageViewProgress.frame = self.bounds; 438 | self.imageViewLoading.frame = self.bounds; 439 | } 440 | - (void)setIsVariableSize:(BOOL)isVariableSize 441 | { 442 | _isVariableSize = isVariableSize; 443 | if(!_isVariableSize) 444 | { 445 | [self setFrameSizeByProgressImage]; 446 | } 447 | } 448 | -(void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)style 449 | { 450 | if(self.activityIndicatorView) 451 | { 452 | _activityIndicatorStyle = style; 453 | [self.activityIndicatorView removeFromSuperview]; 454 | self.activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:style]; 455 | self.activityIndicatorView.hidesWhenStopped = YES; 456 | [self insertSubview:self.activityIndicatorView belowSubview:self.imageViewProgress]; 457 | self.activityIndicatorView.frame = self.bounds; 458 | } 459 | } 460 | 461 | @end 462 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/UzysAnimatedGifPullToRefresh.xcworkspace/xcuserdata/uzysjung.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 40 | 52 | 53 | 54 | 56 | 68 | 69 | 70 | 72 | 84 | 85 | 86 | 88 | 100 | 101 | 102 | 104 | 116 | 117 | 118 | 120 | 132 | 133 | 134 | 136 | 148 | 149 | 150 | 152 | 164 | 165 | 166 | 168 | 180 | 181 | 182 | 184 | 196 | 197 | 198 | 200 | 212 | 213 | 214 | 216 | 228 | 229 | 230 | 232 | 244 | 245 | 246 | 248 | 260 | 261 | 262 | 264 | 276 | 277 | 278 | 280 | 292 | 293 | 294 | 296 | 308 | 309 | 310 | 312 | 324 | 325 | 326 | 328 | 340 | 341 | 342 | 344 | 356 | 357 | 358 | 360 | 372 | 373 | 374 | 376 | 388 | 389 | 390 | 392 | 404 | 405 | 406 | 408 | 420 | 421 | 422 | 424 | 436 | 437 | 438 | 439 | 440 | -------------------------------------------------------------------------------- /UzysAnimatedGifPullToRefresh/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 05187894C18E65CC9E01BDF84B8E0BED /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AEAEF844FE491ED10062CD215F47CD5 /* ImageIO.framework */; }; 11 | 0A07C03EBC73FB5AEABB10F5274242B8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A83867DB03163F70C45809352B2ACF /* Foundation.framework */; }; 12 | 19C46278134445E6A61F5934ADA4193C /* AnimatedGIFImageSerialization-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 615275D4E5C58241D61EFD9DB1936DF9 /* AnimatedGIFImageSerialization-dummy.m */; }; 13 | 287BE8ACB8EAE441ED9C109741072664 /* AnimatedGIFImageSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = EBB06D3710D725058371161B5402A813 /* AnimatedGIFImageSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 56F6E92E8BC1DA120BB1093656049F60 /* AnimatedGIFImageSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = BA3A37A1BCB0F0DBB88DFA4562BE684F /* AnimatedGIFImageSerialization.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 15 | 69F2600EFBE2D40D893D535AB1798CF6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 258995475E13BAC869E577FDA733B16A /* CoreGraphics.framework */; }; 16 | 959DC5A160BFD4F00843681989AEFE37 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFA841020320F343F53128013A80DF53 /* MobileCoreServices.framework */; }; 17 | ACF83B4D7E6675A777329506DC7E4B1E /* Pods-UzysAnimatedGifPullToRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 136CE2038D42CB57E8F353A979146014 /* Pods-UzysAnimatedGifPullToRefresh-dummy.m */; }; 18 | F60FDABA5CD094B07369D625BD403538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A83867DB03163F70C45809352B2ACF /* Foundation.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 436529F6B1013AFEEAE992C3D08EFB88 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 372134479973790B9EFB36D12016B94B; 27 | remoteInfo = AnimatedGIFImageSerialization; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 0AEAEF844FE491ED10062CD215F47CD5 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; 33 | 136CE2038D42CB57E8F353A979146014 /* Pods-UzysAnimatedGifPullToRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-UzysAnimatedGifPullToRefresh-dummy.m"; sourceTree = ""; }; 34 | 258995475E13BAC869E577FDA733B16A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; 35 | 3407197CDB3F3F46FD69149037D2256F /* Pods-UzysAnimatedGifPullToRefresh-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-UzysAnimatedGifPullToRefresh-acknowledgements.plist"; sourceTree = ""; }; 36 | 3C57CEB03D48D0BD67B75F1C96F24249 /* Pods-UzysAnimatedGifPullToRefresh-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-UzysAnimatedGifPullToRefresh-acknowledgements.markdown"; sourceTree = ""; }; 37 | 53A83867DB03163F70C45809352B2ACF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 38 | 615275D4E5C58241D61EFD9DB1936DF9 /* AnimatedGIFImageSerialization-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AnimatedGIFImageSerialization-dummy.m"; sourceTree = ""; }; 39 | 7B26D6AFD744D747592363AA37DADAFF /* Pods-UzysAnimatedGifPullToRefresh-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-UzysAnimatedGifPullToRefresh-frameworks.sh"; sourceTree = ""; }; 40 | 7DCF243AD00C8505606F47F836A7D3E1 /* libAnimatedGIFImageSerialization.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAnimatedGIFImageSerialization.a; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 8371ACE293276A89B3CE961DDA86212F /* Pods-UzysAnimatedGifPullToRefresh-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-UzysAnimatedGifPullToRefresh-resources.sh"; sourceTree = ""; }; 42 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 43 | A753F678F2B7160B0F715516A100F0BF /* AnimatedGIFImageSerialization.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AnimatedGIFImageSerialization.xcconfig; sourceTree = ""; }; 44 | B02FFA7D6330AFA2EE795A42B51FD793 /* Pods-UzysAnimatedGifPullToRefresh.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-UzysAnimatedGifPullToRefresh.release.xcconfig"; sourceTree = ""; }; 45 | BA3A37A1BCB0F0DBB88DFA4562BE684F /* AnimatedGIFImageSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AnimatedGIFImageSerialization.m; path = AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.m; sourceTree = ""; }; 46 | D310EF43841AF04C47B97DAE875754B0 /* AnimatedGIFImageSerialization-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AnimatedGIFImageSerialization-prefix.pch"; sourceTree = ""; }; 47 | DFA841020320F343F53128013A80DF53 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; 48 | EBB06D3710D725058371161B5402A813 /* AnimatedGIFImageSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AnimatedGIFImageSerialization.h; path = AnimatedGIFImageSerialization/AnimatedGIFImageSerialization.h; sourceTree = ""; }; 49 | F45E452EDA024074456753DD67204A54 /* Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig"; sourceTree = ""; }; 50 | F4FE79E2095637924F3380B4132DAA39 /* libPods-UzysAnimatedGifPullToRefresh.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-UzysAnimatedGifPullToRefresh.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | /* End PBXFileReference section */ 52 | 53 | /* Begin PBXFrameworksBuildPhase section */ 54 | 332E30CB8447FE87D608EC41256A484F /* Frameworks */ = { 55 | isa = PBXFrameworksBuildPhase; 56 | buildActionMask = 2147483647; 57 | files = ( 58 | F60FDABA5CD094B07369D625BD403538 /* Foundation.framework in Frameworks */, 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | F30D92F2BD2D99470D8C6C09B35C83EA /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | 69F2600EFBE2D40D893D535AB1798CF6 /* CoreGraphics.framework in Frameworks */, 67 | 0A07C03EBC73FB5AEABB10F5274242B8 /* Foundation.framework in Frameworks */, 68 | 05187894C18E65CC9E01BDF84B8E0BED /* ImageIO.framework in Frameworks */, 69 | 959DC5A160BFD4F00843681989AEFE37 /* MobileCoreServices.framework in Frameworks */, 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | /* End PBXFrameworksBuildPhase section */ 74 | 75 | /* Begin PBXGroup section */ 76 | 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | A69C31DFE961C91C5127EB914757A920 /* iOS */, 80 | ); 81 | name = Frameworks; 82 | sourceTree = ""; 83 | }; 84 | 2AE6D8484F9578D64F6B2CB3C85714DD /* Pods-UzysAnimatedGifPullToRefresh */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 3C57CEB03D48D0BD67B75F1C96F24249 /* Pods-UzysAnimatedGifPullToRefresh-acknowledgements.markdown */, 88 | 3407197CDB3F3F46FD69149037D2256F /* Pods-UzysAnimatedGifPullToRefresh-acknowledgements.plist */, 89 | 136CE2038D42CB57E8F353A979146014 /* Pods-UzysAnimatedGifPullToRefresh-dummy.m */, 90 | 7B26D6AFD744D747592363AA37DADAFF /* Pods-UzysAnimatedGifPullToRefresh-frameworks.sh */, 91 | 8371ACE293276A89B3CE961DDA86212F /* Pods-UzysAnimatedGifPullToRefresh-resources.sh */, 92 | F45E452EDA024074456753DD67204A54 /* Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig */, 93 | B02FFA7D6330AFA2EE795A42B51FD793 /* Pods-UzysAnimatedGifPullToRefresh.release.xcconfig */, 94 | ); 95 | name = "Pods-UzysAnimatedGifPullToRefresh"; 96 | path = "Target Support Files/Pods-UzysAnimatedGifPullToRefresh"; 97 | sourceTree = ""; 98 | }; 99 | 30EF9CAF49BFAF1F8B1DA6E515D3F92D /* Products */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 7DCF243AD00C8505606F47F836A7D3E1 /* libAnimatedGIFImageSerialization.a */, 103 | F4FE79E2095637924F3380B4132DAA39 /* libPods-UzysAnimatedGifPullToRefresh.a */, 104 | ); 105 | name = Products; 106 | sourceTree = ""; 107 | }; 108 | 376C85D0FF31540981D230869F12DCB6 /* Targets Support Files */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | 2AE6D8484F9578D64F6B2CB3C85714DD /* Pods-UzysAnimatedGifPullToRefresh */, 112 | ); 113 | name = "Targets Support Files"; 114 | sourceTree = ""; 115 | }; 116 | 4243C55155BE0133913D96D31028F1A7 /* AnimatedGIFImageSerialization */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | EBB06D3710D725058371161B5402A813 /* AnimatedGIFImageSerialization.h */, 120 | BA3A37A1BCB0F0DBB88DFA4562BE684F /* AnimatedGIFImageSerialization.m */, 121 | 6999F022F32702BB3B1AEC20E88E70F1 /* Support Files */, 122 | ); 123 | path = AnimatedGIFImageSerialization; 124 | sourceTree = ""; 125 | }; 126 | 6999F022F32702BB3B1AEC20E88E70F1 /* Support Files */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | A753F678F2B7160B0F715516A100F0BF /* AnimatedGIFImageSerialization.xcconfig */, 130 | 615275D4E5C58241D61EFD9DB1936DF9 /* AnimatedGIFImageSerialization-dummy.m */, 131 | D310EF43841AF04C47B97DAE875754B0 /* AnimatedGIFImageSerialization-prefix.pch */, 132 | ); 133 | name = "Support Files"; 134 | path = "../Target Support Files/AnimatedGIFImageSerialization"; 135 | sourceTree = ""; 136 | }; 137 | 7DB346D0F39D3F0E887471402A8071AB = { 138 | isa = PBXGroup; 139 | children = ( 140 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 141 | 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */, 142 | 92990DE2160C48C51D3AF41BEDA7CCE5 /* Pods */, 143 | 30EF9CAF49BFAF1F8B1DA6E515D3F92D /* Products */, 144 | 376C85D0FF31540981D230869F12DCB6 /* Targets Support Files */, 145 | ); 146 | sourceTree = ""; 147 | }; 148 | 92990DE2160C48C51D3AF41BEDA7CCE5 /* Pods */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 4243C55155BE0133913D96D31028F1A7 /* AnimatedGIFImageSerialization */, 152 | ); 153 | name = Pods; 154 | sourceTree = ""; 155 | }; 156 | A69C31DFE961C91C5127EB914757A920 /* iOS */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 258995475E13BAC869E577FDA733B16A /* CoreGraphics.framework */, 160 | 53A83867DB03163F70C45809352B2ACF /* Foundation.framework */, 161 | 0AEAEF844FE491ED10062CD215F47CD5 /* ImageIO.framework */, 162 | DFA841020320F343F53128013A80DF53 /* MobileCoreServices.framework */, 163 | ); 164 | name = iOS; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXHeadersBuildPhase section */ 170 | E4EF707ED0F955EB07AECB04813D75AF /* Headers */ = { 171 | isa = PBXHeadersBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | 287BE8ACB8EAE441ED9C109741072664 /* AnimatedGIFImageSerialization.h in Headers */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | /* End PBXHeadersBuildPhase section */ 179 | 180 | /* Begin PBXNativeTarget section */ 181 | 372134479973790B9EFB36D12016B94B /* AnimatedGIFImageSerialization */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = 9E4A4BDF8270CBFEFC3A8D457522DE20 /* Build configuration list for PBXNativeTarget "AnimatedGIFImageSerialization" */; 184 | buildPhases = ( 185 | 19F2FBE4DC4FCE34CEEBF039D552B5CE /* Sources */, 186 | F30D92F2BD2D99470D8C6C09B35C83EA /* Frameworks */, 187 | E4EF707ED0F955EB07AECB04813D75AF /* Headers */, 188 | ); 189 | buildRules = ( 190 | ); 191 | dependencies = ( 192 | ); 193 | name = AnimatedGIFImageSerialization; 194 | productName = AnimatedGIFImageSerialization; 195 | productReference = 7DCF243AD00C8505606F47F836A7D3E1 /* libAnimatedGIFImageSerialization.a */; 196 | productType = "com.apple.product-type.library.static"; 197 | }; 198 | 6387037F36566267FB25B8B579D1DA83 /* Pods-UzysAnimatedGifPullToRefresh */ = { 199 | isa = PBXNativeTarget; 200 | buildConfigurationList = B563135AE53958154409D51DB5BDD3F4 /* Build configuration list for PBXNativeTarget "Pods-UzysAnimatedGifPullToRefresh" */; 201 | buildPhases = ( 202 | 53A8F5694B0177A97C65EE310A10B2E8 /* Sources */, 203 | 332E30CB8447FE87D608EC41256A484F /* Frameworks */, 204 | ); 205 | buildRules = ( 206 | ); 207 | dependencies = ( 208 | 566A25961E077076F9217A57586CF7CA /* PBXTargetDependency */, 209 | ); 210 | name = "Pods-UzysAnimatedGifPullToRefresh"; 211 | productName = "Pods-UzysAnimatedGifPullToRefresh"; 212 | productReference = F4FE79E2095637924F3380B4132DAA39 /* libPods-UzysAnimatedGifPullToRefresh.a */; 213 | productType = "com.apple.product-type.library.static"; 214 | }; 215 | /* End PBXNativeTarget section */ 216 | 217 | /* Begin PBXProject section */ 218 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 219 | isa = PBXProject; 220 | attributes = { 221 | LastSwiftUpdateCheck = 0730; 222 | LastUpgradeCheck = 0700; 223 | }; 224 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = English; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | en, 230 | ); 231 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 232 | productRefGroup = 30EF9CAF49BFAF1F8B1DA6E515D3F92D /* Products */; 233 | projectDirPath = ""; 234 | projectRoot = ""; 235 | targets = ( 236 | 372134479973790B9EFB36D12016B94B /* AnimatedGIFImageSerialization */, 237 | 6387037F36566267FB25B8B579D1DA83 /* Pods-UzysAnimatedGifPullToRefresh */, 238 | ); 239 | }; 240 | /* End PBXProject section */ 241 | 242 | /* Begin PBXSourcesBuildPhase section */ 243 | 19F2FBE4DC4FCE34CEEBF039D552B5CE /* Sources */ = { 244 | isa = PBXSourcesBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | 19C46278134445E6A61F5934ADA4193C /* AnimatedGIFImageSerialization-dummy.m in Sources */, 248 | 56F6E92E8BC1DA120BB1093656049F60 /* AnimatedGIFImageSerialization.m in Sources */, 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | 53A8F5694B0177A97C65EE310A10B2E8 /* Sources */ = { 253 | isa = PBXSourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | ACF83B4D7E6675A777329506DC7E4B1E /* Pods-UzysAnimatedGifPullToRefresh-dummy.m in Sources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXSourcesBuildPhase section */ 261 | 262 | /* Begin PBXTargetDependency section */ 263 | 566A25961E077076F9217A57586CF7CA /* PBXTargetDependency */ = { 264 | isa = PBXTargetDependency; 265 | name = AnimatedGIFImageSerialization; 266 | target = 372134479973790B9EFB36D12016B94B /* AnimatedGIFImageSerialization */; 267 | targetProxy = 436529F6B1013AFEEAE992C3D08EFB88 /* PBXContainerItemProxy */; 268 | }; 269 | /* End PBXTargetDependency section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | 0357A43B85CF5ADFDE3E1B85B9983FEE /* Release */ = { 273 | isa = XCBuildConfiguration; 274 | baseConfigurationReference = A753F678F2B7160B0F715516A100F0BF /* AnimatedGIFImageSerialization.xcconfig */; 275 | buildSettings = { 276 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 277 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 278 | ENABLE_STRICT_OBJC_MSGSEND = YES; 279 | GCC_NO_COMMON_BLOCKS = YES; 280 | GCC_PREFIX_HEADER = "Target Support Files/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization-prefix.pch"; 281 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 282 | MTL_ENABLE_DEBUG_INFO = NO; 283 | OTHER_LDFLAGS = ""; 284 | OTHER_LIBTOOLFLAGS = ""; 285 | PRIVATE_HEADERS_FOLDER_PATH = ""; 286 | PRODUCT_NAME = "$(TARGET_NAME)"; 287 | PUBLIC_HEADERS_FOLDER_PATH = ""; 288 | SDKROOT = iphoneos; 289 | SKIP_INSTALL = YES; 290 | }; 291 | name = Release; 292 | }; 293 | 2A8EF26B6A6A866A61EAF2BB8DD0711A /* Debug */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ALWAYS_SEARCH_USER_PATHS = NO; 297 | CLANG_ANALYZER_NONNULL = YES; 298 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 299 | CLANG_CXX_LIBRARY = "libc++"; 300 | CLANG_ENABLE_MODULES = YES; 301 | CLANG_ENABLE_OBJC_ARC = YES; 302 | CLANG_WARN_BOOL_CONVERSION = YES; 303 | CLANG_WARN_CONSTANT_CONVERSION = YES; 304 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 305 | CLANG_WARN_EMPTY_BODY = YES; 306 | CLANG_WARN_ENUM_CONVERSION = YES; 307 | CLANG_WARN_INT_CONVERSION = YES; 308 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 309 | CLANG_WARN_UNREACHABLE_CODE = YES; 310 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 311 | COPY_PHASE_STRIP = NO; 312 | ENABLE_TESTABILITY = YES; 313 | GCC_C_LANGUAGE_STANDARD = gnu99; 314 | GCC_DYNAMIC_NO_PIC = NO; 315 | GCC_OPTIMIZATION_LEVEL = 0; 316 | GCC_PREPROCESSOR_DEFINITIONS = ( 317 | "POD_CONFIGURATION_DEBUG=1", 318 | "DEBUG=1", 319 | "$(inherited)", 320 | ); 321 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 322 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 323 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 324 | GCC_WARN_UNDECLARED_SELECTOR = YES; 325 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 326 | GCC_WARN_UNUSED_FUNCTION = YES; 327 | GCC_WARN_UNUSED_VARIABLE = YES; 328 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 329 | ONLY_ACTIVE_ARCH = YES; 330 | STRIP_INSTALLED_PRODUCT = NO; 331 | SYMROOT = "${SRCROOT}/../build"; 332 | }; 333 | name = Debug; 334 | }; 335 | 7AAC4767C73D3218DD69C2F8B8501322 /* Release */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | ALWAYS_SEARCH_USER_PATHS = NO; 339 | CLANG_ANALYZER_NONNULL = YES; 340 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 341 | CLANG_CXX_LIBRARY = "libc++"; 342 | CLANG_ENABLE_MODULES = YES; 343 | CLANG_ENABLE_OBJC_ARC = YES; 344 | CLANG_WARN_BOOL_CONVERSION = YES; 345 | CLANG_WARN_CONSTANT_CONVERSION = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INT_CONVERSION = YES; 350 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 351 | CLANG_WARN_UNREACHABLE_CODE = YES; 352 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 353 | COPY_PHASE_STRIP = YES; 354 | ENABLE_NS_ASSERTIONS = NO; 355 | GCC_C_LANGUAGE_STANDARD = gnu99; 356 | GCC_PREPROCESSOR_DEFINITIONS = ( 357 | "POD_CONFIGURATION_RELEASE=1", 358 | "$(inherited)", 359 | ); 360 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 361 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 362 | GCC_WARN_UNDECLARED_SELECTOR = YES; 363 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 364 | GCC_WARN_UNUSED_FUNCTION = YES; 365 | GCC_WARN_UNUSED_VARIABLE = YES; 366 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 367 | STRIP_INSTALLED_PRODUCT = NO; 368 | SYMROOT = "${SRCROOT}/../build"; 369 | VALIDATE_PRODUCT = YES; 370 | }; 371 | name = Release; 372 | }; 373 | 8B3FCE70434A8E71F039B943186BBEBA /* Release */ = { 374 | isa = XCBuildConfiguration; 375 | baseConfigurationReference = B02FFA7D6330AFA2EE795A42B51FD793 /* Pods-UzysAnimatedGifPullToRefresh.release.xcconfig */; 376 | buildSettings = { 377 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 378 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 379 | ENABLE_STRICT_OBJC_MSGSEND = YES; 380 | GCC_NO_COMMON_BLOCKS = YES; 381 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 382 | MACH_O_TYPE = staticlib; 383 | MTL_ENABLE_DEBUG_INFO = NO; 384 | OTHER_LDFLAGS = ""; 385 | OTHER_LIBTOOLFLAGS = ""; 386 | PODS_ROOT = "$(SRCROOT)"; 387 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 388 | PRODUCT_NAME = "$(TARGET_NAME)"; 389 | SDKROOT = iphoneos; 390 | SKIP_INSTALL = YES; 391 | }; 392 | name = Release; 393 | }; 394 | A524E5BBD3F3620921B32933DE4E9116 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | baseConfigurationReference = A753F678F2B7160B0F715516A100F0BF /* AnimatedGIFImageSerialization.xcconfig */; 397 | buildSettings = { 398 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 399 | DEBUG_INFORMATION_FORMAT = dwarf; 400 | ENABLE_STRICT_OBJC_MSGSEND = YES; 401 | GCC_NO_COMMON_BLOCKS = YES; 402 | GCC_PREFIX_HEADER = "Target Support Files/AnimatedGIFImageSerialization/AnimatedGIFImageSerialization-prefix.pch"; 403 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 404 | MTL_ENABLE_DEBUG_INFO = YES; 405 | OTHER_LDFLAGS = ""; 406 | OTHER_LIBTOOLFLAGS = ""; 407 | PRIVATE_HEADERS_FOLDER_PATH = ""; 408 | PRODUCT_NAME = "$(TARGET_NAME)"; 409 | PUBLIC_HEADERS_FOLDER_PATH = ""; 410 | SDKROOT = iphoneos; 411 | SKIP_INSTALL = YES; 412 | }; 413 | name = Debug; 414 | }; 415 | B4B3A3F1E04ACA5E960F1EAF1735E347 /* Debug */ = { 416 | isa = XCBuildConfiguration; 417 | baseConfigurationReference = F45E452EDA024074456753DD67204A54 /* Pods-UzysAnimatedGifPullToRefresh.debug.xcconfig */; 418 | buildSettings = { 419 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 420 | DEBUG_INFORMATION_FORMAT = dwarf; 421 | ENABLE_STRICT_OBJC_MSGSEND = YES; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 424 | MACH_O_TYPE = staticlib; 425 | MTL_ENABLE_DEBUG_INFO = YES; 426 | OTHER_LDFLAGS = ""; 427 | OTHER_LIBTOOLFLAGS = ""; 428 | PODS_ROOT = "$(SRCROOT)"; 429 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 430 | PRODUCT_NAME = "$(TARGET_NAME)"; 431 | SDKROOT = iphoneos; 432 | SKIP_INSTALL = YES; 433 | }; 434 | name = Debug; 435 | }; 436 | /* End XCBuildConfiguration section */ 437 | 438 | /* Begin XCConfigurationList section */ 439 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 440 | isa = XCConfigurationList; 441 | buildConfigurations = ( 442 | 2A8EF26B6A6A866A61EAF2BB8DD0711A /* Debug */, 443 | 7AAC4767C73D3218DD69C2F8B8501322 /* Release */, 444 | ); 445 | defaultConfigurationIsVisible = 0; 446 | defaultConfigurationName = Release; 447 | }; 448 | 9E4A4BDF8270CBFEFC3A8D457522DE20 /* Build configuration list for PBXNativeTarget "AnimatedGIFImageSerialization" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | A524E5BBD3F3620921B32933DE4E9116 /* Debug */, 452 | 0357A43B85CF5ADFDE3E1B85B9983FEE /* Release */, 453 | ); 454 | defaultConfigurationIsVisible = 0; 455 | defaultConfigurationName = Release; 456 | }; 457 | B563135AE53958154409D51DB5BDD3F4 /* Build configuration list for PBXNativeTarget "Pods-UzysAnimatedGifPullToRefresh" */ = { 458 | isa = XCConfigurationList; 459 | buildConfigurations = ( 460 | B4B3A3F1E04ACA5E960F1EAF1735E347 /* Debug */, 461 | 8B3FCE70434A8E71F039B943186BBEBA /* Release */, 462 | ); 463 | defaultConfigurationIsVisible = 0; 464 | defaultConfigurationName = Release; 465 | }; 466 | /* End XCConfigurationList section */ 467 | }; 468 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 469 | } 470 | --------------------------------------------------------------------------------