├── README.md ├── Untitled.gif ├── WaterDropTest.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── linyunfeng.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── linyunfeng.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── WaterDropTest.xcscheme │ └── xcschememanagement.plist ├── WaterDropTest ├── 1.jpg ├── 2.jpg ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── LKAppDelegate.h ├── LKAppDelegate.m ├── LKViewController.h ├── LKViewController.m ├── LKViewController.xib ├── SYHeadInfoView3.h ├── SYHeadInfoView3.m ├── SYHeadInfoView3.xib ├── WaterDropTest-Info.plist ├── WaterDropTest-Prefix.pch ├── en.lproj │ └── InfoPlist.strings ├── main.m └── waterDrop │ ├── SYWaterDropView.h │ ├── SYWaterDropView.m │ ├── first_timetowlight.png │ └── first_timetowlight@2x.png └── WaterDropTestTests ├── WaterDropTestTests-Info.plist ├── WaterDropTestTests.m └── en.lproj └── InfoPlist.strings /README.md: -------------------------------------------------------------------------------- 1 | WaterDropRefresh 2 | ================ 3 | 4 | path refresh effect 5 | 6 | ![](https://github.com/li6185377/WaterDropRefresh/blob/master/Untitled.gif?raw=true) 7 | -------------------------------------------------------------------------------- /Untitled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/Untitled.gif -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C52D6E98187FDCD000CEEAEB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6E97187FDCD000CEEAEB /* Foundation.framework */; }; 11 | C52D6E9A187FDCD000CEEAEB /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6E99187FDCD000CEEAEB /* CoreGraphics.framework */; }; 12 | C52D6E9C187FDCD000CEEAEB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6E9B187FDCD000CEEAEB /* UIKit.framework */; }; 13 | C52D6EA2187FDCD000CEEAEB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C52D6EA0187FDCD000CEEAEB /* InfoPlist.strings */; }; 14 | C52D6EA4187FDCD000CEEAEB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6EA3187FDCD000CEEAEB /* main.m */; }; 15 | C52D6EA8187FDCD000CEEAEB /* LKAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6EA7187FDCD000CEEAEB /* LKAppDelegate.m */; }; 16 | C52D6EAE187FDCD000CEEAEB /* LKViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6EAD187FDCD000CEEAEB /* LKViewController.m */; }; 17 | C52D6EB0187FDCD000CEEAEB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C52D6EAF187FDCD000CEEAEB /* Images.xcassets */; }; 18 | C52D6EB7187FDCD000CEEAEB /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6EB6187FDCD000CEEAEB /* XCTest.framework */; }; 19 | C52D6EB8187FDCD000CEEAEB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6E97187FDCD000CEEAEB /* Foundation.framework */; }; 20 | C52D6EB9187FDCD000CEEAEB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C52D6E9B187FDCD000CEEAEB /* UIKit.framework */; }; 21 | C52D6EC1187FDCD000CEEAEB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C52D6EBF187FDCD000CEEAEB /* InfoPlist.strings */; }; 22 | C52D6EC3187FDCD000CEEAEB /* WaterDropTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6EC2187FDCD000CEEAEB /* WaterDropTestTests.m */; }; 23 | C52D6ECD187FDD5700CEEAEB /* LKViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C52D6ECC187FDD5700CEEAEB /* LKViewController.xib */; }; 24 | C52D6ED1187FDDF800CEEAEB /* SYWaterDropView.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6ED0187FDDF800CEEAEB /* SYWaterDropView.m */; }; 25 | C52D6ED4187FE11C00CEEAEB /* first_timetowlight.png in Resources */ = {isa = PBXBuildFile; fileRef = C52D6ED2187FE11C00CEEAEB /* first_timetowlight.png */; }; 26 | C52D6ED5187FE11C00CEEAEB /* first_timetowlight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C52D6ED3187FE11C00CEEAEB /* first_timetowlight@2x.png */; }; 27 | C52D6ED9187FE1B200CEEAEB /* SYHeadInfoView3.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D6ED7187FE1B200CEEAEB /* SYHeadInfoView3.m */; }; 28 | C52D6EDA187FE1B200CEEAEB /* SYHeadInfoView3.xib in Resources */ = {isa = PBXBuildFile; fileRef = C52D6ED8187FE1B200CEEAEB /* SYHeadInfoView3.xib */; }; 29 | C52D6EDD187FE21600CEEAEB /* 1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C52D6EDB187FE21600CEEAEB /* 1.jpg */; }; 30 | C52D6EDE187FE21600CEEAEB /* 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C52D6EDC187FE21600CEEAEB /* 2.jpg */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXContainerItemProxy section */ 34 | C52D6EBA187FDCD000CEEAEB /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = C52D6E8C187FDCD000CEEAEB /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = C52D6E93187FDCD000CEEAEB; 39 | remoteInfo = WaterDropTest; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXFileReference section */ 44 | C52D6E94187FDCD000CEEAEB /* WaterDropTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WaterDropTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | C52D6E97187FDCD000CEEAEB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 46 | C52D6E99187FDCD000CEEAEB /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 47 | C52D6E9B187FDCD000CEEAEB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 48 | C52D6E9F187FDCD000CEEAEB /* WaterDropTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WaterDropTest-Info.plist"; sourceTree = ""; }; 49 | C52D6EA1187FDCD000CEEAEB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 50 | C52D6EA3187FDCD000CEEAEB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 51 | C52D6EA5187FDCD000CEEAEB /* WaterDropTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WaterDropTest-Prefix.pch"; sourceTree = ""; }; 52 | C52D6EA6187FDCD000CEEAEB /* LKAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LKAppDelegate.h; sourceTree = ""; }; 53 | C52D6EA7187FDCD000CEEAEB /* LKAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LKAppDelegate.m; sourceTree = ""; }; 54 | C52D6EAC187FDCD000CEEAEB /* LKViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LKViewController.h; sourceTree = ""; }; 55 | C52D6EAD187FDCD000CEEAEB /* LKViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LKViewController.m; sourceTree = ""; }; 56 | C52D6EAF187FDCD000CEEAEB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 57 | C52D6EB5187FDCD000CEEAEB /* WaterDropTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WaterDropTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | C52D6EB6187FDCD000CEEAEB /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 59 | C52D6EBE187FDCD000CEEAEB /* WaterDropTestTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WaterDropTestTests-Info.plist"; sourceTree = ""; }; 60 | C52D6EC0187FDCD000CEEAEB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 61 | C52D6EC2187FDCD000CEEAEB /* WaterDropTestTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WaterDropTestTests.m; sourceTree = ""; }; 62 | C52D6ECC187FDD5700CEEAEB /* LKViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LKViewController.xib; sourceTree = ""; }; 63 | C52D6ECF187FDDF800CEEAEB /* SYWaterDropView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SYWaterDropView.h; sourceTree = ""; }; 64 | C52D6ED0187FDDF800CEEAEB /* SYWaterDropView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SYWaterDropView.m; sourceTree = ""; }; 65 | C52D6ED2187FE11C00CEEAEB /* first_timetowlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = first_timetowlight.png; sourceTree = ""; }; 66 | C52D6ED3187FE11C00CEEAEB /* first_timetowlight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "first_timetowlight@2x.png"; sourceTree = ""; }; 67 | C52D6ED6187FE1B200CEEAEB /* SYHeadInfoView3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SYHeadInfoView3.h; sourceTree = ""; }; 68 | C52D6ED7187FE1B200CEEAEB /* SYHeadInfoView3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SYHeadInfoView3.m; sourceTree = ""; }; 69 | C52D6ED8187FE1B200CEEAEB /* SYHeadInfoView3.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SYHeadInfoView3.xib; sourceTree = ""; }; 70 | C52D6EDB187FE21600CEEAEB /* 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 1.jpg; sourceTree = ""; }; 71 | C52D6EDC187FE21600CEEAEB /* 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 2.jpg; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | C52D6E91187FDCD000CEEAEB /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | C52D6E9A187FDCD000CEEAEB /* CoreGraphics.framework in Frameworks */, 80 | C52D6E9C187FDCD000CEEAEB /* UIKit.framework in Frameworks */, 81 | C52D6E98187FDCD000CEEAEB /* Foundation.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | C52D6EB2187FDCD000CEEAEB /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | C52D6EB7187FDCD000CEEAEB /* XCTest.framework in Frameworks */, 90 | C52D6EB9187FDCD000CEEAEB /* UIKit.framework in Frameworks */, 91 | C52D6EB8187FDCD000CEEAEB /* Foundation.framework in Frameworks */, 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | /* End PBXFrameworksBuildPhase section */ 96 | 97 | /* Begin PBXGroup section */ 98 | C52D6E8B187FDCD000CEEAEB = { 99 | isa = PBXGroup; 100 | children = ( 101 | C52D6E9D187FDCD000CEEAEB /* WaterDropTest */, 102 | C52D6EBC187FDCD000CEEAEB /* WaterDropTestTests */, 103 | C52D6E96187FDCD000CEEAEB /* Frameworks */, 104 | C52D6E95187FDCD000CEEAEB /* Products */, 105 | ); 106 | sourceTree = ""; 107 | }; 108 | C52D6E95187FDCD000CEEAEB /* Products */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | C52D6E94187FDCD000CEEAEB /* WaterDropTest.app */, 112 | C52D6EB5187FDCD000CEEAEB /* WaterDropTestTests.xctest */, 113 | ); 114 | name = Products; 115 | sourceTree = ""; 116 | }; 117 | C52D6E96187FDCD000CEEAEB /* Frameworks */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | C52D6E97187FDCD000CEEAEB /* Foundation.framework */, 121 | C52D6E99187FDCD000CEEAEB /* CoreGraphics.framework */, 122 | C52D6E9B187FDCD000CEEAEB /* UIKit.framework */, 123 | C52D6EB6187FDCD000CEEAEB /* XCTest.framework */, 124 | ); 125 | name = Frameworks; 126 | sourceTree = ""; 127 | }; 128 | C52D6E9D187FDCD000CEEAEB /* WaterDropTest */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | C52D6ED6187FE1B200CEEAEB /* SYHeadInfoView3.h */, 132 | C52D6ED7187FE1B200CEEAEB /* SYHeadInfoView3.m */, 133 | C52D6ED8187FE1B200CEEAEB /* SYHeadInfoView3.xib */, 134 | C52D6ECE187FDDF800CEEAEB /* waterDrop */, 135 | C52D6EA6187FDCD000CEEAEB /* LKAppDelegate.h */, 136 | C52D6EA7187FDCD000CEEAEB /* LKAppDelegate.m */, 137 | C52D6EAC187FDCD000CEEAEB /* LKViewController.h */, 138 | C52D6EAD187FDCD000CEEAEB /* LKViewController.m */, 139 | C52D6ECC187FDD5700CEEAEB /* LKViewController.xib */, 140 | C52D6EAF187FDCD000CEEAEB /* Images.xcassets */, 141 | C52D6E9E187FDCD000CEEAEB /* Supporting Files */, 142 | ); 143 | path = WaterDropTest; 144 | sourceTree = ""; 145 | }; 146 | C52D6E9E187FDCD000CEEAEB /* Supporting Files */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | C52D6EDB187FE21600CEEAEB /* 1.jpg */, 150 | C52D6EDC187FE21600CEEAEB /* 2.jpg */, 151 | C52D6E9F187FDCD000CEEAEB /* WaterDropTest-Info.plist */, 152 | C52D6EA0187FDCD000CEEAEB /* InfoPlist.strings */, 153 | C52D6EA3187FDCD000CEEAEB /* main.m */, 154 | C52D6EA5187FDCD000CEEAEB /* WaterDropTest-Prefix.pch */, 155 | ); 156 | name = "Supporting Files"; 157 | sourceTree = ""; 158 | }; 159 | C52D6EBC187FDCD000CEEAEB /* WaterDropTestTests */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | C52D6EC2187FDCD000CEEAEB /* WaterDropTestTests.m */, 163 | C52D6EBD187FDCD000CEEAEB /* Supporting Files */, 164 | ); 165 | path = WaterDropTestTests; 166 | sourceTree = ""; 167 | }; 168 | C52D6EBD187FDCD000CEEAEB /* Supporting Files */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | C52D6EBE187FDCD000CEEAEB /* WaterDropTestTests-Info.plist */, 172 | C52D6EBF187FDCD000CEEAEB /* InfoPlist.strings */, 173 | ); 174 | name = "Supporting Files"; 175 | sourceTree = ""; 176 | }; 177 | C52D6ECE187FDDF800CEEAEB /* waterDrop */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | C52D6ED2187FE11C00CEEAEB /* first_timetowlight.png */, 181 | C52D6ED3187FE11C00CEEAEB /* first_timetowlight@2x.png */, 182 | C52D6ECF187FDDF800CEEAEB /* SYWaterDropView.h */, 183 | C52D6ED0187FDDF800CEEAEB /* SYWaterDropView.m */, 184 | ); 185 | path = waterDrop; 186 | sourceTree = ""; 187 | }; 188 | /* End PBXGroup section */ 189 | 190 | /* Begin PBXNativeTarget section */ 191 | C52D6E93187FDCD000CEEAEB /* WaterDropTest */ = { 192 | isa = PBXNativeTarget; 193 | buildConfigurationList = C52D6EC6187FDCD000CEEAEB /* Build configuration list for PBXNativeTarget "WaterDropTest" */; 194 | buildPhases = ( 195 | C52D6E90187FDCD000CEEAEB /* Sources */, 196 | C52D6E91187FDCD000CEEAEB /* Frameworks */, 197 | C52D6E92187FDCD000CEEAEB /* Resources */, 198 | ); 199 | buildRules = ( 200 | ); 201 | dependencies = ( 202 | ); 203 | name = WaterDropTest; 204 | productName = WaterDropTest; 205 | productReference = C52D6E94187FDCD000CEEAEB /* WaterDropTest.app */; 206 | productType = "com.apple.product-type.application"; 207 | }; 208 | C52D6EB4187FDCD000CEEAEB /* WaterDropTestTests */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = C52D6EC9187FDCD000CEEAEB /* Build configuration list for PBXNativeTarget "WaterDropTestTests" */; 211 | buildPhases = ( 212 | C52D6EB1187FDCD000CEEAEB /* Sources */, 213 | C52D6EB2187FDCD000CEEAEB /* Frameworks */, 214 | C52D6EB3187FDCD000CEEAEB /* Resources */, 215 | ); 216 | buildRules = ( 217 | ); 218 | dependencies = ( 219 | C52D6EBB187FDCD000CEEAEB /* PBXTargetDependency */, 220 | ); 221 | name = WaterDropTestTests; 222 | productName = WaterDropTestTests; 223 | productReference = C52D6EB5187FDCD000CEEAEB /* WaterDropTestTests.xctest */; 224 | productType = "com.apple.product-type.bundle.unit-test"; 225 | }; 226 | /* End PBXNativeTarget section */ 227 | 228 | /* Begin PBXProject section */ 229 | C52D6E8C187FDCD000CEEAEB /* Project object */ = { 230 | isa = PBXProject; 231 | attributes = { 232 | CLASSPREFIX = LK; 233 | LastUpgradeCheck = 0500; 234 | ORGANIZATIONNAME = LJH; 235 | TargetAttributes = { 236 | C52D6EB4187FDCD000CEEAEB = { 237 | TestTargetID = C52D6E93187FDCD000CEEAEB; 238 | }; 239 | }; 240 | }; 241 | buildConfigurationList = C52D6E8F187FDCD000CEEAEB /* Build configuration list for PBXProject "WaterDropTest" */; 242 | compatibilityVersion = "Xcode 3.2"; 243 | developmentRegion = English; 244 | hasScannedForEncodings = 0; 245 | knownRegions = ( 246 | en, 247 | Base, 248 | ); 249 | mainGroup = C52D6E8B187FDCD000CEEAEB; 250 | productRefGroup = C52D6E95187FDCD000CEEAEB /* Products */; 251 | projectDirPath = ""; 252 | projectRoot = ""; 253 | targets = ( 254 | C52D6E93187FDCD000CEEAEB /* WaterDropTest */, 255 | C52D6EB4187FDCD000CEEAEB /* WaterDropTestTests */, 256 | ); 257 | }; 258 | /* End PBXProject section */ 259 | 260 | /* Begin PBXResourcesBuildPhase section */ 261 | C52D6E92187FDCD000CEEAEB /* Resources */ = { 262 | isa = PBXResourcesBuildPhase; 263 | buildActionMask = 2147483647; 264 | files = ( 265 | C52D6ED5187FE11C00CEEAEB /* first_timetowlight@2x.png in Resources */, 266 | C52D6EB0187FDCD000CEEAEB /* Images.xcassets in Resources */, 267 | C52D6ED4187FE11C00CEEAEB /* first_timetowlight.png in Resources */, 268 | C52D6ECD187FDD5700CEEAEB /* LKViewController.xib in Resources */, 269 | C52D6EDA187FE1B200CEEAEB /* SYHeadInfoView3.xib in Resources */, 270 | C52D6EA2187FDCD000CEEAEB /* InfoPlist.strings in Resources */, 271 | C52D6EDE187FE21600CEEAEB /* 2.jpg in Resources */, 272 | C52D6EDD187FE21600CEEAEB /* 1.jpg in Resources */, 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | }; 276 | C52D6EB3187FDCD000CEEAEB /* Resources */ = { 277 | isa = PBXResourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | C52D6EC1187FDCD000CEEAEB /* InfoPlist.strings in Resources */, 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | }; 284 | /* End PBXResourcesBuildPhase section */ 285 | 286 | /* Begin PBXSourcesBuildPhase section */ 287 | C52D6E90187FDCD000CEEAEB /* Sources */ = { 288 | isa = PBXSourcesBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | C52D6EA4187FDCD000CEEAEB /* main.m in Sources */, 292 | C52D6EA8187FDCD000CEEAEB /* LKAppDelegate.m in Sources */, 293 | C52D6ED9187FE1B200CEEAEB /* SYHeadInfoView3.m in Sources */, 294 | C52D6EAE187FDCD000CEEAEB /* LKViewController.m in Sources */, 295 | C52D6ED1187FDDF800CEEAEB /* SYWaterDropView.m in Sources */, 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | }; 299 | C52D6EB1187FDCD000CEEAEB /* Sources */ = { 300 | isa = PBXSourcesBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | C52D6EC3187FDCD000CEEAEB /* WaterDropTestTests.m in Sources */, 304 | ); 305 | runOnlyForDeploymentPostprocessing = 0; 306 | }; 307 | /* End PBXSourcesBuildPhase section */ 308 | 309 | /* Begin PBXTargetDependency section */ 310 | C52D6EBB187FDCD000CEEAEB /* PBXTargetDependency */ = { 311 | isa = PBXTargetDependency; 312 | target = C52D6E93187FDCD000CEEAEB /* WaterDropTest */; 313 | targetProxy = C52D6EBA187FDCD000CEEAEB /* PBXContainerItemProxy */; 314 | }; 315 | /* End PBXTargetDependency section */ 316 | 317 | /* Begin PBXVariantGroup section */ 318 | C52D6EA0187FDCD000CEEAEB /* InfoPlist.strings */ = { 319 | isa = PBXVariantGroup; 320 | children = ( 321 | C52D6EA1187FDCD000CEEAEB /* en */, 322 | ); 323 | name = InfoPlist.strings; 324 | sourceTree = ""; 325 | }; 326 | C52D6EBF187FDCD000CEEAEB /* InfoPlist.strings */ = { 327 | isa = PBXVariantGroup; 328 | children = ( 329 | C52D6EC0187FDCD000CEEAEB /* en */, 330 | ); 331 | name = InfoPlist.strings; 332 | sourceTree = ""; 333 | }; 334 | /* End PBXVariantGroup section */ 335 | 336 | /* Begin XCBuildConfiguration section */ 337 | C52D6EC4187FDCD000CEEAEB /* Debug */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ALWAYS_SEARCH_USER_PATHS = NO; 341 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 342 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 343 | CLANG_CXX_LIBRARY = "libc++"; 344 | CLANG_ENABLE_MODULES = YES; 345 | CLANG_ENABLE_OBJC_ARC = YES; 346 | CLANG_WARN_BOOL_CONVERSION = YES; 347 | CLANG_WARN_CONSTANT_CONVERSION = YES; 348 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 349 | CLANG_WARN_EMPTY_BODY = YES; 350 | CLANG_WARN_ENUM_CONVERSION = YES; 351 | CLANG_WARN_INT_CONVERSION = YES; 352 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 353 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 354 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 355 | COPY_PHASE_STRIP = NO; 356 | GCC_C_LANGUAGE_STANDARD = gnu99; 357 | GCC_DYNAMIC_NO_PIC = NO; 358 | GCC_OPTIMIZATION_LEVEL = 0; 359 | GCC_PREPROCESSOR_DEFINITIONS = ( 360 | "DEBUG=1", 361 | "$(inherited)", 362 | ); 363 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 364 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 365 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 366 | GCC_WARN_UNDECLARED_SELECTOR = YES; 367 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 368 | GCC_WARN_UNUSED_FUNCTION = YES; 369 | GCC_WARN_UNUSED_VARIABLE = YES; 370 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 371 | ONLY_ACTIVE_ARCH = YES; 372 | SDKROOT = iphoneos; 373 | }; 374 | name = Debug; 375 | }; 376 | C52D6EC5187FDCD000CEEAEB /* Release */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | ALWAYS_SEARCH_USER_PATHS = NO; 380 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_MODULES = YES; 384 | CLANG_ENABLE_OBJC_ARC = YES; 385 | CLANG_WARN_BOOL_CONVERSION = YES; 386 | CLANG_WARN_CONSTANT_CONVERSION = YES; 387 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 388 | CLANG_WARN_EMPTY_BODY = YES; 389 | CLANG_WARN_ENUM_CONVERSION = YES; 390 | CLANG_WARN_INT_CONVERSION = YES; 391 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 394 | COPY_PHASE_STRIP = YES; 395 | ENABLE_NS_ASSERTIONS = NO; 396 | GCC_C_LANGUAGE_STANDARD = gnu99; 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 404 | SDKROOT = iphoneos; 405 | VALIDATE_PRODUCT = YES; 406 | }; 407 | name = Release; 408 | }; 409 | C52D6EC7187FDCD000CEEAEB /* Debug */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 414 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 415 | GCC_PREFIX_HEADER = "WaterDropTest/WaterDropTest-Prefix.pch"; 416 | INFOPLIST_FILE = "WaterDropTest/WaterDropTest-Info.plist"; 417 | IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; 418 | PRODUCT_NAME = "$(TARGET_NAME)"; 419 | WRAPPER_EXTENSION = app; 420 | }; 421 | name = Debug; 422 | }; 423 | C52D6EC8187FDCD000CEEAEB /* Release */ = { 424 | isa = XCBuildConfiguration; 425 | buildSettings = { 426 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 427 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 428 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 429 | GCC_PREFIX_HEADER = "WaterDropTest/WaterDropTest-Prefix.pch"; 430 | INFOPLIST_FILE = "WaterDropTest/WaterDropTest-Info.plist"; 431 | IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; 432 | PRODUCT_NAME = "$(TARGET_NAME)"; 433 | WRAPPER_EXTENSION = app; 434 | }; 435 | name = Release; 436 | }; 437 | C52D6ECA187FDCD000CEEAEB /* Debug */ = { 438 | isa = XCBuildConfiguration; 439 | buildSettings = { 440 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 441 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/WaterDropTest.app/WaterDropTest"; 442 | FRAMEWORK_SEARCH_PATHS = ( 443 | "$(SDKROOT)/Developer/Library/Frameworks", 444 | "$(inherited)", 445 | "$(DEVELOPER_FRAMEWORKS_DIR)", 446 | ); 447 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 448 | GCC_PREFIX_HEADER = "WaterDropTest/WaterDropTest-Prefix.pch"; 449 | GCC_PREPROCESSOR_DEFINITIONS = ( 450 | "DEBUG=1", 451 | "$(inherited)", 452 | ); 453 | INFOPLIST_FILE = "WaterDropTestTests/WaterDropTestTests-Info.plist"; 454 | PRODUCT_NAME = "$(TARGET_NAME)"; 455 | TEST_HOST = "$(BUNDLE_LOADER)"; 456 | WRAPPER_EXTENSION = xctest; 457 | }; 458 | name = Debug; 459 | }; 460 | C52D6ECB187FDCD000CEEAEB /* Release */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 464 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/WaterDropTest.app/WaterDropTest"; 465 | FRAMEWORK_SEARCH_PATHS = ( 466 | "$(SDKROOT)/Developer/Library/Frameworks", 467 | "$(inherited)", 468 | "$(DEVELOPER_FRAMEWORKS_DIR)", 469 | ); 470 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 471 | GCC_PREFIX_HEADER = "WaterDropTest/WaterDropTest-Prefix.pch"; 472 | INFOPLIST_FILE = "WaterDropTestTests/WaterDropTestTests-Info.plist"; 473 | PRODUCT_NAME = "$(TARGET_NAME)"; 474 | TEST_HOST = "$(BUNDLE_LOADER)"; 475 | WRAPPER_EXTENSION = xctest; 476 | }; 477 | name = Release; 478 | }; 479 | /* End XCBuildConfiguration section */ 480 | 481 | /* Begin XCConfigurationList section */ 482 | C52D6E8F187FDCD000CEEAEB /* Build configuration list for PBXProject "WaterDropTest" */ = { 483 | isa = XCConfigurationList; 484 | buildConfigurations = ( 485 | C52D6EC4187FDCD000CEEAEB /* Debug */, 486 | C52D6EC5187FDCD000CEEAEB /* Release */, 487 | ); 488 | defaultConfigurationIsVisible = 0; 489 | defaultConfigurationName = Release; 490 | }; 491 | C52D6EC6187FDCD000CEEAEB /* Build configuration list for PBXNativeTarget "WaterDropTest" */ = { 492 | isa = XCConfigurationList; 493 | buildConfigurations = ( 494 | C52D6EC7187FDCD000CEEAEB /* Debug */, 495 | C52D6EC8187FDCD000CEEAEB /* Release */, 496 | ); 497 | defaultConfigurationIsVisible = 0; 498 | }; 499 | C52D6EC9187FDCD000CEEAEB /* Build configuration list for PBXNativeTarget "WaterDropTestTests" */ = { 500 | isa = XCConfigurationList; 501 | buildConfigurations = ( 502 | C52D6ECA187FDCD000CEEAEB /* Debug */, 503 | C52D6ECB187FDCD000CEEAEB /* Release */, 504 | ); 505 | defaultConfigurationIsVisible = 0; 506 | }; 507 | /* End XCConfigurationList section */ 508 | }; 509 | rootObject = C52D6E8C187FDCD000CEEAEB /* Project object */; 510 | } 511 | -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/project.xcworkspace/xcuserdata/linyunfeng.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/WaterDropTest.xcodeproj/project.xcworkspace/xcuserdata/linyunfeng.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/xcuserdata/linyunfeng.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/xcuserdata/linyunfeng.xcuserdatad/xcschemes/WaterDropTest.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /WaterDropTest.xcodeproj/xcuserdata/linyunfeng.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | WaterDropTest.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C52D6E93187FDCD000CEEAEB 16 | 17 | primary 18 | 19 | 20 | C52D6EB4187FDCD000CEEAEB 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /WaterDropTest/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/WaterDropTest/1.jpg -------------------------------------------------------------------------------- /WaterDropTest/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/WaterDropTest/2.jpg -------------------------------------------------------------------------------- /WaterDropTest/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 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /WaterDropTest/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /WaterDropTest/LKAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // LKAppDelegate.h 3 | // WaterDropTest 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LKAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /WaterDropTest/LKAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // LKAppDelegate.m 3 | // WaterDropTest 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import "LKAppDelegate.h" 10 | #import "LKViewController.h" 11 | @implementation LKAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; 16 | _window.backgroundColor = [UIColor whiteColor]; 17 | _window.rootViewController = [[LKViewController alloc]initWithNibName:@"LKViewController" bundle:nil]; 18 | [_window makeKeyAndVisible]; 19 | 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application 24 | { 25 | // 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. 26 | // 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. 27 | } 28 | 29 | - (void)applicationDidEnterBackground:(UIApplication *)application 30 | { 31 | // 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. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | - (void)applicationWillEnterForeground:(UIApplication *)application 36 | { 37 | // 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. 38 | } 39 | 40 | - (void)applicationDidBecomeActive:(UIApplication *)application 41 | { 42 | // 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. 43 | } 44 | 45 | - (void)applicationWillTerminate:(UIApplication *)application 46 | { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /WaterDropTest/LKViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LKViewController.h 3 | // WaterDropTest 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SYHeadInfoView3.h" 11 | @interface LKViewController : UIViewController 12 | @property (strong, nonatomic) SYHeadInfoView3 *headView; 13 | 14 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 15 | @end 16 | -------------------------------------------------------------------------------- /WaterDropTest/LKViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LKViewController.m 3 | // WaterDropTest 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import "LKViewController.h" 10 | 11 | @interface LKViewController () 12 | 13 | @end 14 | 15 | @implementation LKViewController 16 | - (void)viewDidLoad 17 | { 18 | [super viewDidLoad]; 19 | 20 | self.headView = [[[NSBundle mainBundle] loadNibNamed:@"SYHeadInfoView3" owner:nil options:nil] lastObject]; 21 | _tableView.tableHeaderView = _headView; 22 | 23 | __weak LKViewController* wself = self; 24 | [_headView setHandleRefreshEvent:^{ 25 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 26 | [wself.headView stopRefresh]; 27 | }); 28 | }]; 29 | } 30 | #pragma mark- scroll delegate 31 | -(void)scrollViewDidScroll:(UIScrollView *)scrollView 32 | { 33 | self.headView.offsetY = scrollView.contentOffset.y; 34 | } 35 | -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 36 | { 37 | _headView.touching = NO; 38 | } 39 | -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 40 | { 41 | if(decelerate==NO) 42 | { 43 | _headView.touching = NO; 44 | } 45 | } 46 | -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 47 | { 48 | _headView.touching = YES; 49 | } 50 | #pragma mark- 51 | 52 | 53 | -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 54 | { 55 | return 10000; 56 | } 57 | -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 58 | { 59 | return [UITableViewCell new]; 60 | } 61 | - (void)didReceiveMemoryWarning 62 | { 63 | [super didReceiveMemoryWarning]; 64 | // Dispose of any resources that can be recreated. 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /WaterDropTest/LKViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /WaterDropTest/SYHeadInfoView3.h: -------------------------------------------------------------------------------- 1 | // 2 | // SYHeadInfoView3.h 3 | // Seeyou 4 | // 5 | // Created by upin on 13-12-20. 6 | // Copyright (c) 2013年 linggan. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SYWaterDropView.h" 11 | 12 | @interface SYHeadInfoView3 : UIView 13 | { 14 | BOOL touch1,touch2,hasStop; 15 | BOOL isrefreshed; 16 | } 17 | @property (weak, nonatomic) IBOutlet UIImageView *img_banner; 18 | @property (weak, nonatomic) IBOutlet UIButton *bt_avatar; 19 | @property (weak, nonatomic) IBOutlet SYWaterDropView *waterView; 20 | @property (weak, nonatomic) IBOutlet UIView *showView; 21 | 22 | //注意看 scrollView 的回调 23 | @property(nonatomic) BOOL touching; 24 | @property(nonatomic) float offsetY; 25 | 26 | @property(copy,nonatomic)void(^handleRefreshEvent)(void) ; 27 | -(void)stopRefresh; 28 | @end 29 | -------------------------------------------------------------------------------- /WaterDropTest/SYHeadInfoView3.m: -------------------------------------------------------------------------------- 1 | // 2 | // SYHeadInfoView3.m 3 | // Seeyou 4 | // 5 | // Created by upin on 13-12-20. 6 | // Copyright (c) 2013年 linggan. All rights reserved. 7 | // 8 | 9 | #import "SYHeadInfoView3.h" 10 | @interface SYHeadInfoView3() 11 | 12 | @property BOOL requested; 13 | @property BOOL requesting; 14 | @end 15 | 16 | @implementation SYHeadInfoView3 17 | -(void)willMoveToSuperview:(UIView *)newSuperview 18 | { 19 | [super willMoveToSuperview:newSuperview]; 20 | if(newSuperview) 21 | { 22 | [self initWaterView]; 23 | } 24 | } 25 | -(void)setValue:(id)value forUndefinedKey:(NSString *)key 26 | { 27 | NSLog(@""); 28 | } 29 | -(void)refresh 30 | { 31 | if(_waterView.isRefreshing) 32 | { 33 | [_waterView startRefreshAnimation]; 34 | } 35 | } 36 | -(void)setIsRefreshed:(BOOL)b 37 | { 38 | isrefreshed = b; 39 | } 40 | -(void)initWaterView 41 | { 42 | __weak SYHeadInfoView3* wself =self; 43 | //采用默认参数 44 | [_waterView loadWaterView]; 45 | [_waterView setHandleRefreshEvent:^{ 46 | [wself setIsRefreshed:YES]; 47 | if(wself.handleRefreshEvent) 48 | { 49 | wself.handleRefreshEvent(); 50 | } 51 | }]; 52 | } 53 | -(void)setTouching:(BOOL)touching 54 | { 55 | if(touching) 56 | { 57 | if(hasStop) 58 | { 59 | [self resetTouch]; 60 | } 61 | 62 | if(touch1) 63 | { 64 | touch2 = YES; 65 | } 66 | else if(touch2 == NO && _waterView.isRefreshing == NO) 67 | { 68 | touch1 = YES; 69 | } 70 | } 71 | else if(_waterView.isRefreshing == NO) 72 | { 73 | [self resetTouch]; 74 | } 75 | _touching = touching; 76 | } 77 | -(void)resetTouch 78 | { 79 | touch1 = NO; 80 | touch2 = NO; 81 | hasStop = NO; 82 | isrefreshed = NO; 83 | } 84 | -(void)stopRefresh 85 | { 86 | [_waterView stopRefresh]; 87 | if(_touching == NO) 88 | { 89 | [self resetTouch]; 90 | } 91 | else 92 | { 93 | hasStop = YES; 94 | } 95 | } 96 | -(void)setOffsetY:(float)y 97 | { 98 | _offsetY = y; 99 | CGRect frame = _showView.frame; 100 | if(y<0) 101 | { 102 | //头像位置调整 103 | if((_waterView.isRefreshing) || hasStop) 104 | { 105 | if(touch1 && touch2 == NO) 106 | { 107 | frame.origin.y = 20+y; 108 | _showView.frame = frame; 109 | } 110 | else 111 | { 112 | if(frame.origin.y != 20) 113 | { 114 | frame.origin.y = 20; 115 | _showView.frame = frame; 116 | } 117 | } 118 | } 119 | else 120 | { 121 | frame.origin.y = 20+y; 122 | _showView.frame = frame; 123 | } 124 | } 125 | else{ 126 | if(touch1 && _touching && isrefreshed) 127 | { 128 | touch2 = YES; 129 | } 130 | if(frame.origin.y != 20) 131 | { 132 | frame.origin.y = 20; 133 | _showView.frame = frame; 134 | } 135 | } 136 | if (hasStop == NO) { 137 | //水滴拉伸效果 138 | _waterView.currentOffset = y; 139 | } 140 | 141 | // 视差滚动 142 | UIView* bannerSuper = _img_banner.superview; 143 | CGRect bframe = bannerSuper.frame; 144 | if(y<0) 145 | { 146 | bframe.origin.y = y; 147 | bframe.size.height = -y + bannerSuper.superview.frame.size.height; 148 | bannerSuper.frame = bframe; 149 | 150 | CGPoint center = _img_banner.center; 151 | center.y = bannerSuper.frame.size.height/2; 152 | _img_banner.center = center; 153 | } 154 | else{ 155 | if(bframe.origin.y != 0) 156 | { 157 | bframe.origin.y = 0; 158 | bframe.size.height = bannerSuper.superview.frame.size.height; 159 | bannerSuper.frame = bframe; 160 | } 161 | if(y 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 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /WaterDropTest/WaterDropTest-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | LK.${PRODUCT_NAME:rfc1034identifier} 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 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /WaterDropTest/WaterDropTest-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 | -------------------------------------------------------------------------------- /WaterDropTest/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /WaterDropTest/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // WaterDropTest 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "LKAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([LKAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /WaterDropTest/waterDrop/SYWaterDropView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SYWaterDropView.h 3 | // Seeyou 4 | // 5 | // Created by ljh on 14-1-1. 6 | // Copyright (c) 2014年 linggan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SYWaterDropView : UIView 12 | 13 | @property float waterTop; //水滴 距离底部的距离 14 | @property float maxDropLength; //最长拖动距离 15 | @property float radius; //水滴的半径 16 | 17 | //设置完参数后 需要手动调用此方法 18 | -(void)loadWaterView; 19 | 20 | @property(strong,nonatomic)CAShapeLayer* shapeLayer; 21 | @property(strong,nonatomic)CAShapeLayer* lineLayer; 22 | @property(strong,nonatomic)UIImageView* refreshView; 23 | 24 | @property(readonly,nonatomic)BOOL isRefreshing; 25 | 26 | -(void)stopRefresh; 27 | -(void)startRefreshAnimation; 28 | 29 | @property(copy,nonatomic)void(^handleRefreshEvent)(void) ; 30 | @property(nonatomic) float currentOffset; 31 | @end 32 | -------------------------------------------------------------------------------- /WaterDropTest/waterDrop/SYWaterDropView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SYWaterDropView.m 3 | // Seeyou 4 | // 5 | // Created by ljh on 14-1-1. 6 | // Copyright (c) 2014年 linggan. All rights reserved. 7 | // 8 | 9 | #import "SYWaterDropView.h" 10 | 11 | #ifndef RGBCOLOR 12 | #define RGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1] 13 | #endif 14 | 15 | #ifndef RGBCOLORA 16 | #define RGBACOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)] 17 | #endif 18 | 19 | @interface SYWaterDropView() 20 | { 21 | BOOL _animationing; 22 | BOOL _isRefresh; 23 | float _centerX; 24 | } 25 | @property(strong,nonatomic)CAShapeLayer* doudongLayer; 26 | @property(strong,nonatomic)NSTimer* timer; 27 | @end 28 | 29 | @implementation SYWaterDropView 30 | -(BOOL)isRefreshing 31 | { 32 | return _isRefresh; 33 | } 34 | -(void)parameterInit 35 | { 36 | if(_waterTop == 0) 37 | _waterTop = 30; 38 | if(_maxDropLength == 0) 39 | _maxDropLength = 60; 40 | if(_radius == 0) 41 | _radius = 3.5; 42 | 43 | _centerX = self.bounds.size.width/2; 44 | } 45 | -(void)loadWaterView 46 | { 47 | [self parameterInit]; 48 | 49 | _lineLayer = [CAShapeLayer layer]; 50 | _lineLayer.fillColor = RGBACOLOR(222, 216, 211, 0.5).CGColor; 51 | [self.layer addSublayer:_lineLayer]; 52 | 53 | _shapeLayer = [CAShapeLayer layer]; 54 | _shapeLayer.fillColor = RGBCOLOR(222, 216, 211).CGColor; 55 | _shapeLayer.strokeColor = [[UIColor whiteColor] CGColor]; 56 | _shapeLayer.lineWidth = 3; 57 | [self.layer addSublayer:_shapeLayer]; 58 | 59 | _doudongLayer = [CAShapeLayer layer]; 60 | _doudongLayer.fillColor = RGBCOLOR(222, 216, 211).CGColor; 61 | _doudongLayer.strokeColor = [[UIColor whiteColor] CGColor]; 62 | _doudongLayer.lineWidth = 3; 63 | _doudongLayer.frame = CGRectMake(_centerX - _radius,self.bounds.size.height - _waterTop, _radius*2, _radius*2); 64 | _doudongLayer.path = CGPathCreateWithEllipseInRect(_doudongLayer.bounds, NULL); 65 | _doudongLayer.opacity = 0; 66 | [self.layer addSublayer:_doudongLayer]; 67 | 68 | self.currentOffset = 0; 69 | } 70 | 71 | -(CGMutablePathRef)createPathWithOffset:(float)currentOffset 72 | { 73 | CGMutablePathRef path = CGPathCreateMutable(); 74 | float top = self.bounds.size.height - _waterTop - currentOffset; 75 | float wdiff = currentOffset* 0.2; 76 | 77 | if(currentOffset==0) 78 | { 79 | CGPathAddEllipseInRect(path, NULL, CGRectMake(_centerX-_radius, top, _radius*2, _radius*2)); 80 | } 81 | else 82 | { 83 | CGPathAddArc(path, NULL, _centerX,top+_radius, _radius, 0, M_PI, YES); 84 | float bottom = top + wdiff+_radius*2; 85 | if(currentOffset<10) 86 | { 87 | CGPathAddCurveToPoint(path, NULL,_centerX - _radius,bottom,_centerX,bottom, _centerX,bottom); 88 | CGPathAddCurveToPoint(path, NULL, _centerX,bottom,_centerX+_radius,bottom, _centerX+_radius, top+_radius); 89 | } 90 | else 91 | { 92 | CGPathAddCurveToPoint(path, NULL,_centerX-_radius ,top +_radius, _centerX - _radius ,bottom-2,_centerX , bottom); 93 | CGPathAddCurveToPoint(path,NULL, _centerX + _radius, bottom-2, _centerX+_radius,top +_radius , _centerX+_radius, top+_radius); 94 | } 95 | } 96 | CGPathCloseSubpath(path); 97 | 98 | return path; 99 | } 100 | -(void)setCurrentOffset:(float)currentOffset 101 | { 102 | if(_isRefresh) 103 | return; 104 | 105 | _refreshView.layer.opacity = 0; 106 | [self privateSetCurrentOffset:currentOffset]; 107 | } 108 | -(void)privateSetCurrentOffset:(float)currentOffset 109 | { 110 | currentOffset = currentOffset>0?0:currentOffset; 111 | currentOffset = -currentOffset; 112 | _currentOffset = currentOffset; 113 | if(currentOffset < _maxDropLength) 114 | { 115 | float top = self.bounds.size.height - _waterTop - currentOffset; 116 | 117 | CGMutablePathRef path = [self createPathWithOffset:currentOffset]; 118 | _shapeLayer.path = path; 119 | CGPathRelease(path); 120 | 121 | 122 | CGMutablePathRef line = CGPathCreateMutable(); 123 | float w = ((_maxDropLength - currentOffset)/_maxDropLength) + 1; 124 | float lt = top + _radius*2; 125 | float lb = self.bounds.size.height; 126 | 127 | if(currentOffset==0) 128 | { 129 | CGPathAddRect(line, NULL, CGRectMake(_centerX-w/2, lt , 2 , lb-lt)); 130 | } 131 | else{ 132 | 133 | CGPathMoveToPoint(line, NULL, _centerX- w/2,lt); 134 | CGPathAddLineToPoint(line, NULL, _centerX + w/2,lt); 135 | 136 | CGPathAddCurveToPoint(line, NULL,_centerX + w/2,lt+ 5, _centerX + w/2,lt+(lb-lt)/2 -5, _centerX+1 , lb); 137 | CGPathAddLineToPoint(line, NULL, _centerX - 1, lb); 138 | CGPathAddCurveToPoint(line, NULL,_centerX- w/2,lt + 5, _centerX- w/2,lt+(lb-lt)/2 - 5,_centerX-w/2, lt); 139 | } 140 | CGPathCloseSubpath(line); 141 | _lineLayer.path = line; 142 | CGPathRelease(line); 143 | self.transform = CGAffineTransformMakeScale(0.85+0.15*(w-1), 1); 144 | } 145 | else 146 | { 147 | if(self.timer == nil) 148 | { 149 | _isRefresh = YES; 150 | self.transform = CGAffineTransformIdentity; 151 | self.timer = [NSTimer timerWithTimeInterval:0.02 target:self selector:@selector(resetWater) userInfo:nil repeats:YES]; 152 | [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; 153 | [_timer fire]; 154 | } 155 | } 156 | } 157 | -(void)resetWater 158 | { 159 | [self privateSetCurrentOffset:-(_currentOffset-(_maxDropLength/8))]; 160 | if(_currentOffset==0) 161 | { 162 | [self.timer invalidate]; 163 | self.timer = nil; 164 | 165 | if(self.handleRefreshEvent!= nil) 166 | { 167 | self.handleRefreshEvent(); 168 | } 169 | [self doudong]; 170 | } 171 | } 172 | -(void)stopRefresh 173 | { 174 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startRefreshAnimation) object:nil]; 175 | _isRefresh = NO; 176 | 177 | CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 178 | anim.fromValue = @(1); 179 | anim.toValue = @(0); 180 | anim.duration = 0.2; 181 | anim.delegate = self; 182 | [_refreshView.layer addAnimation:anim forKey:nil]; 183 | _refreshView.layer.opacity = 0; 184 | _doudongLayer.opacity = 0; 185 | 186 | anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 187 | anim.fromValue = @(0); 188 | anim.toValue = @(1); 189 | anim.beginTime = 0.2; 190 | anim.duration = 0.2; 191 | anim.delegate = self; 192 | [_shapeLayer addAnimation:anim forKey:nil]; 193 | _shapeLayer.opacity = 0; 194 | } 195 | -(void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag 196 | { 197 | if(anim.beginTime > 0) 198 | { 199 | _shapeLayer.opacity = 1; 200 | } 201 | else 202 | { 203 | [_refreshView.layer removeAllAnimations]; 204 | } 205 | } 206 | 207 | -(void)startRefreshAnimation 208 | { 209 | if(self.refreshView == nil) 210 | { 211 | self.refreshView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"first_timetowlight"]]; 212 | [self addSubview:_refreshView]; 213 | } 214 | 215 | _doudongLayer.opacity = 0; 216 | _shapeLayer.opacity = 0; 217 | 218 | _refreshView.center = CGPointMake(_centerX, _doudongLayer.frame.origin.y + _doudongLayer.frame.size.height/2); 219 | [_refreshView.layer removeAllAnimations]; 220 | _refreshView.layer.opacity = 1; 221 | 222 | CABasicAnimation* alpha = [CABasicAnimation animationWithKeyPath:@"opacity"]; 223 | alpha.duration = 0.2; 224 | alpha.fromValue = @0.5; 225 | alpha.toValue = @1; 226 | 227 | CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 228 | animation.duration = 1; 229 | animation.beginTime = 0.1; 230 | animation.fromValue = @0; 231 | animation.toValue = @(M_PI*2); 232 | animation.repeatCount = INT_MAX; 233 | 234 | [_refreshView.layer addAnimation:alpha forKey:nil]; 235 | [_refreshView.layer addAnimation:animation forKey:@"rotation"]; 236 | } 237 | NS_INLINE CATransform3D CATransform3DMakeRotationScale(CGFloat angle,CGFloat sx, CGFloat sy, 238 | CGFloat sz) 239 | { 240 | CATransform3D transform = CATransform3DIdentity; 241 | transform = CATransform3DRotate(transform, angle, 0, 0, 1); 242 | transform = CATransform3DScale(transform, sx, sy, sz); 243 | transform = CATransform3DRotate(transform, -angle, 0, 0, 1); 244 | return transform; 245 | } 246 | -(void)doudong 247 | { 248 | _doudongLayer.opacity = 1; 249 | _shapeLayer.opacity = 0; 250 | 251 | float kDuration = 0.5; 252 | float angle = M_PI; 253 | float w = 1.3 , h = 1.3; 254 | 255 | CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 256 | animation.values = [NSArray arrayWithObjects: 257 | [NSValue valueWithCATransform3D:_doudongLayer.transform], 258 | [NSValue valueWithCATransform3D:CATransform3DMakeRotationScale(angle,w, 2-h, 1)], 259 | [NSValue valueWithCATransform3D:CATransform3DMakeRotationScale(angle,1-(w-1)*0.5, 1+(h-1)*0.5, 1)], 260 | [NSValue valueWithCATransform3D:CATransform3DMakeRotationScale(angle,1+(w-1)*0.25, 1-(h-1)*0.25, 1)], 261 | [NSValue valueWithCATransform3D:CATransform3DMakeRotationScale(angle,1, 1, 1)], nil]; 262 | animation.keyTimes = [NSArray arrayWithObjects: 263 | [NSNumber numberWithFloat:0], 264 | [NSNumber numberWithFloat:0.3], 265 | [NSNumber numberWithFloat:0.6], 266 | [NSNumber numberWithFloat:0.9], 267 | [NSNumber numberWithFloat:1], nil]; 268 | _doudongLayer.transform = CATransform3DIdentity; 269 | animation.timingFunctions = [NSArray arrayWithObjects: 270 | [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], 271 | [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 272 | [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 273 | [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], nil]; 274 | 275 | animation.duration = kDuration; 276 | [_doudongLayer addAnimation:animation forKey:nil]; 277 | 278 | __weak SYWaterDropView* wself = self; 279 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((kDuration-0.1f) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 280 | [wself startRefreshAnimation]; 281 | }); 282 | } 283 | @end 284 | -------------------------------------------------------------------------------- /WaterDropTest/waterDrop/first_timetowlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/WaterDropTest/waterDrop/first_timetowlight.png -------------------------------------------------------------------------------- /WaterDropTest/waterDrop/first_timetowlight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/li6185377/WaterDropRefresh/78e8c57a8bdb391fa9f5a3e9d711c20cd2d65d88/WaterDropTest/waterDrop/first_timetowlight@2x.png -------------------------------------------------------------------------------- /WaterDropTestTests/WaterDropTestTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | LK.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /WaterDropTestTests/WaterDropTestTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // WaterDropTestTests.m 3 | // WaterDropTestTests 4 | // 5 | // Created by ljh on 14-1-10. 6 | // Copyright (c) 2014年 LJH. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface WaterDropTestTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation WaterDropTestTests 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 | -------------------------------------------------------------------------------- /WaterDropTestTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | --------------------------------------------------------------------------------