├── MBParallaxScrollView.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── MBParallaxScrollView.xccheckout │ └── xcuserdata │ │ └── mbabiy.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── mbabiy.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── MBParallaxScrollView.xcscheme │ └── xcschememanagement.plist ├── MBParallaxScrollView ├── AppDelegate.swift ├── Base.lproj │ └── Main.storyboard ├── HomeViewController.swift ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── Info.plist ├── ParallaxCollectionViewCell.swift ├── Splash.storyboard └── images │ ├── 0@2x.png │ ├── 10@2x.png │ ├── 11@2x.png │ ├── 12@2x.png │ ├── 13@2x.png │ ├── 14@2x.png │ ├── 1@2x.png │ ├── 2@2x.png │ ├── 3@2x.png │ ├── 4@2x.png │ ├── 5@2x.png │ ├── 6@2x.png │ ├── 7@2x.png │ ├── 8@2x.png │ └── 9@2x.png └── README.md /MBParallaxScrollView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1C290616196D71E000D4636F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C290615196D71E000D4636F /* AppDelegate.swift */; }; 11 | 1C290618196D71E000D4636F /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C290617196D71E000D4636F /* HomeViewController.swift */; }; 12 | 1C29061B196D71E000D4636F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C290619196D71E000D4636F /* Main.storyboard */; }; 13 | 1C29061D196D71E000D4636F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1C29061C196D71E000D4636F /* Images.xcassets */; }; 14 | 1C290633196D724000D4636F /* ParallaxCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C290632196D724000D4636F /* ParallaxCollectionViewCell.swift */; }; 15 | 1C357E3E1C13D28A009F3539 /* Splash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C357E3D1C13D28A009F3539 /* Splash.storyboard */; }; 16 | 1C5BFDC1196ED20000192323 /* 0@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDB5196ED20000192323 /* 0@2x.png */; }; 17 | 1C5BFDC2196ED20000192323 /* 10@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDB6196ED20000192323 /* 10@2x.png */; }; 18 | 1C5BFDC3196ED20000192323 /* 11@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDB7196ED20000192323 /* 11@2x.png */; }; 19 | 1C5BFDC4196ED20000192323 /* 1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDB8196ED20000192323 /* 1@2x.png */; }; 20 | 1C5BFDC5196ED20000192323 /* 2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDB9196ED20000192323 /* 2@2x.png */; }; 21 | 1C5BFDC6196ED20000192323 /* 3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBA196ED20000192323 /* 3@2x.png */; }; 22 | 1C5BFDC7196ED20000192323 /* 4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBB196ED20000192323 /* 4@2x.png */; }; 23 | 1C5BFDC8196ED20000192323 /* 5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBC196ED20000192323 /* 5@2x.png */; }; 24 | 1C5BFDC9196ED20000192323 /* 6@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBD196ED20000192323 /* 6@2x.png */; }; 25 | 1C5BFDCA196ED20000192323 /* 7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBE196ED20000192323 /* 7@2x.png */; }; 26 | 1C5BFDCB196ED20000192323 /* 8@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDBF196ED20000192323 /* 8@2x.png */; }; 27 | 1C5BFDCC196ED20000192323 /* 9@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDC0196ED20000192323 /* 9@2x.png */; }; 28 | 1C5BFDD0196ED2DE00192323 /* 12@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDCD196ED2DE00192323 /* 12@2x.png */; }; 29 | 1C5BFDD1196ED2DE00192323 /* 13@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDCE196ED2DE00192323 /* 13@2x.png */; }; 30 | 1C5BFDD2196ED2DE00192323 /* 14@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C5BFDCF196ED2DE00192323 /* 14@2x.png */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 1C290610196D71E000D4636F /* MBParallaxScrollView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MBParallaxScrollView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 1C290614196D71E000D4636F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 1C290615196D71E000D4636F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 1C290617196D71E000D4636F /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; 38 | 1C29061A196D71E000D4636F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 39 | 1C29061C196D71E000D4636F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 40 | 1C290632196D724000D4636F /* ParallaxCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParallaxCollectionViewCell.swift; sourceTree = ""; }; 41 | 1C357E3D1C13D28A009F3539 /* Splash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Splash.storyboard; sourceTree = ""; }; 42 | 1C5BFDB5196ED20000192323 /* 0@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "0@2x.png"; sourceTree = ""; }; 43 | 1C5BFDB6196ED20000192323 /* 10@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "10@2x.png"; sourceTree = ""; }; 44 | 1C5BFDB7196ED20000192323 /* 11@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "11@2x.png"; sourceTree = ""; }; 45 | 1C5BFDB8196ED20000192323 /* 1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "1@2x.png"; sourceTree = ""; }; 46 | 1C5BFDB9196ED20000192323 /* 2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "2@2x.png"; sourceTree = ""; }; 47 | 1C5BFDBA196ED20000192323 /* 3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "3@2x.png"; sourceTree = ""; }; 48 | 1C5BFDBB196ED20000192323 /* 4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "4@2x.png"; sourceTree = ""; }; 49 | 1C5BFDBC196ED20000192323 /* 5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "5@2x.png"; sourceTree = ""; }; 50 | 1C5BFDBD196ED20000192323 /* 6@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "6@2x.png"; sourceTree = ""; }; 51 | 1C5BFDBE196ED20000192323 /* 7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "7@2x.png"; sourceTree = ""; }; 52 | 1C5BFDBF196ED20000192323 /* 8@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "8@2x.png"; sourceTree = ""; }; 53 | 1C5BFDC0196ED20000192323 /* 9@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "9@2x.png"; sourceTree = ""; }; 54 | 1C5BFDCD196ED2DE00192323 /* 12@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "12@2x.png"; sourceTree = ""; }; 55 | 1C5BFDCE196ED2DE00192323 /* 13@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "13@2x.png"; sourceTree = ""; }; 56 | 1C5BFDCF196ED2DE00192323 /* 14@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "14@2x.png"; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | 1C29060D196D71E000D4636F /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | /* End PBXFrameworksBuildPhase section */ 68 | 69 | /* Begin PBXGroup section */ 70 | 1C290607196D71E000D4636F = { 71 | isa = PBXGroup; 72 | children = ( 73 | 1C290612196D71E000D4636F /* MBParallaxScrollView */, 74 | 1C290611196D71E000D4636F /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 1C290611196D71E000D4636F /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 1C290610196D71E000D4636F /* MBParallaxScrollView.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 1C290612196D71E000D4636F /* MBParallaxScrollView */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 1C418CC81D41451B0086F1F3 /* App Global */, 90 | 1C418CC91D4145270086F1F3 /* Controller */, 91 | 1C418CCA1D41452F0086F1F3 /* View */, 92 | 1C290613196D71E000D4636F /* Supporting Files */, 93 | ); 94 | path = MBParallaxScrollView; 95 | sourceTree = ""; 96 | }; 97 | 1C290613196D71E000D4636F /* Supporting Files */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 1C29061C196D71E000D4636F /* Images.xcassets */, 101 | 1C5BFDB4196ED20000192323 /* images */, 102 | ); 103 | name = "Supporting Files"; 104 | sourceTree = ""; 105 | }; 106 | 1C418CC81D41451B0086F1F3 /* App Global */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 1C290615196D71E000D4636F /* AppDelegate.swift */, 110 | 1C290614196D71E000D4636F /* Info.plist */, 111 | ); 112 | name = "App Global"; 113 | sourceTree = ""; 114 | }; 115 | 1C418CC91D4145270086F1F3 /* Controller */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 1C290617196D71E000D4636F /* HomeViewController.swift */, 119 | ); 120 | name = Controller; 121 | sourceTree = ""; 122 | }; 123 | 1C418CCA1D41452F0086F1F3 /* View */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 1C290619196D71E000D4636F /* Main.storyboard */, 127 | 1C290632196D724000D4636F /* ParallaxCollectionViewCell.swift */, 128 | 1C357E3D1C13D28A009F3539 /* Splash.storyboard */, 129 | ); 130 | name = View; 131 | sourceTree = ""; 132 | }; 133 | 1C5BFDB4196ED20000192323 /* images */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 1C5BFDCD196ED2DE00192323 /* 12@2x.png */, 137 | 1C5BFDCE196ED2DE00192323 /* 13@2x.png */, 138 | 1C5BFDCF196ED2DE00192323 /* 14@2x.png */, 139 | 1C5BFDB5196ED20000192323 /* 0@2x.png */, 140 | 1C5BFDB6196ED20000192323 /* 10@2x.png */, 141 | 1C5BFDB7196ED20000192323 /* 11@2x.png */, 142 | 1C5BFDB8196ED20000192323 /* 1@2x.png */, 143 | 1C5BFDB9196ED20000192323 /* 2@2x.png */, 144 | 1C5BFDBA196ED20000192323 /* 3@2x.png */, 145 | 1C5BFDBB196ED20000192323 /* 4@2x.png */, 146 | 1C5BFDBC196ED20000192323 /* 5@2x.png */, 147 | 1C5BFDBD196ED20000192323 /* 6@2x.png */, 148 | 1C5BFDBE196ED20000192323 /* 7@2x.png */, 149 | 1C5BFDBF196ED20000192323 /* 8@2x.png */, 150 | 1C5BFDC0196ED20000192323 /* 9@2x.png */, 151 | ); 152 | path = images; 153 | sourceTree = ""; 154 | }; 155 | /* End PBXGroup section */ 156 | 157 | /* Begin PBXNativeTarget section */ 158 | 1C29060F196D71E000D4636F /* MBParallaxScrollView */ = { 159 | isa = PBXNativeTarget; 160 | buildConfigurationList = 1C29062C196D71E000D4636F /* Build configuration list for PBXNativeTarget "MBParallaxScrollView" */; 161 | buildPhases = ( 162 | 1C29060C196D71E000D4636F /* Sources */, 163 | 1C29060D196D71E000D4636F /* Frameworks */, 164 | 1C29060E196D71E000D4636F /* Resources */, 165 | ); 166 | buildRules = ( 167 | ); 168 | dependencies = ( 169 | ); 170 | name = MBParallaxScrollView; 171 | productName = MBParallaxScrollView; 172 | productReference = 1C290610196D71E000D4636F /* MBParallaxScrollView.app */; 173 | productType = "com.apple.product-type.application"; 174 | }; 175 | /* End PBXNativeTarget section */ 176 | 177 | /* Begin PBXProject section */ 178 | 1C290608196D71E000D4636F /* Project object */ = { 179 | isa = PBXProject; 180 | attributes = { 181 | LastSwiftMigration = 0710; 182 | LastSwiftUpdateCheck = 0710; 183 | LastUpgradeCheck = 0800; 184 | ORGANIZATIONNAME = "Michael Babiy"; 185 | TargetAttributes = { 186 | 1C29060F196D71E000D4636F = { 187 | CreatedOnToolsVersion = 6.0; 188 | DevelopmentTeam = VV4VQB3X2M; 189 | DevelopmentTeamName = "Michael Babiy"; 190 | LastSwiftMigration = 0800; 191 | }; 192 | }; 193 | }; 194 | buildConfigurationList = 1C29060B196D71E000D4636F /* Build configuration list for PBXProject "MBParallaxScrollView" */; 195 | compatibilityVersion = "Xcode 3.2"; 196 | developmentRegion = English; 197 | hasScannedForEncodings = 0; 198 | knownRegions = ( 199 | en, 200 | Base, 201 | ); 202 | mainGroup = 1C290607196D71E000D4636F; 203 | productRefGroup = 1C290611196D71E000D4636F /* Products */; 204 | projectDirPath = ""; 205 | projectRoot = ""; 206 | targets = ( 207 | 1C29060F196D71E000D4636F /* MBParallaxScrollView */, 208 | ); 209 | }; 210 | /* End PBXProject section */ 211 | 212 | /* Begin PBXResourcesBuildPhase section */ 213 | 1C29060E196D71E000D4636F /* Resources */ = { 214 | isa = PBXResourcesBuildPhase; 215 | buildActionMask = 2147483647; 216 | files = ( 217 | 1C5BFDCA196ED20000192323 /* 7@2x.png in Resources */, 218 | 1C5BFDC7196ED20000192323 /* 4@2x.png in Resources */, 219 | 1C5BFDCC196ED20000192323 /* 9@2x.png in Resources */, 220 | 1C5BFDCB196ED20000192323 /* 8@2x.png in Resources */, 221 | 1C5BFDC6196ED20000192323 /* 3@2x.png in Resources */, 222 | 1C357E3E1C13D28A009F3539 /* Splash.storyboard in Resources */, 223 | 1C5BFDC8196ED20000192323 /* 5@2x.png in Resources */, 224 | 1C5BFDC4196ED20000192323 /* 1@2x.png in Resources */, 225 | 1C5BFDD2196ED2DE00192323 /* 14@2x.png in Resources */, 226 | 1C5BFDD0196ED2DE00192323 /* 12@2x.png in Resources */, 227 | 1C5BFDC1196ED20000192323 /* 0@2x.png in Resources */, 228 | 1C5BFDC5196ED20000192323 /* 2@2x.png in Resources */, 229 | 1C5BFDD1196ED2DE00192323 /* 13@2x.png in Resources */, 230 | 1C29061B196D71E000D4636F /* Main.storyboard in Resources */, 231 | 1C5BFDC9196ED20000192323 /* 6@2x.png in Resources */, 232 | 1C5BFDC3196ED20000192323 /* 11@2x.png in Resources */, 233 | 1C29061D196D71E000D4636F /* Images.xcassets in Resources */, 234 | 1C5BFDC2196ED20000192323 /* 10@2x.png in Resources */, 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | /* End PBXResourcesBuildPhase section */ 239 | 240 | /* Begin PBXSourcesBuildPhase section */ 241 | 1C29060C196D71E000D4636F /* Sources */ = { 242 | isa = PBXSourcesBuildPhase; 243 | buildActionMask = 2147483647; 244 | files = ( 245 | 1C290618196D71E000D4636F /* HomeViewController.swift in Sources */, 246 | 1C290616196D71E000D4636F /* AppDelegate.swift in Sources */, 247 | 1C290633196D724000D4636F /* ParallaxCollectionViewCell.swift in Sources */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | /* End PBXSourcesBuildPhase section */ 252 | 253 | /* Begin PBXVariantGroup section */ 254 | 1C290619196D71E000D4636F /* Main.storyboard */ = { 255 | isa = PBXVariantGroup; 256 | children = ( 257 | 1C29061A196D71E000D4636F /* Base */, 258 | ); 259 | name = Main.storyboard; 260 | sourceTree = ""; 261 | }; 262 | /* End PBXVariantGroup section */ 263 | 264 | /* Begin XCBuildConfiguration section */ 265 | 1C29062A196D71E000D4636F /* Debug */ = { 266 | isa = XCBuildConfiguration; 267 | buildSettings = { 268 | ALWAYS_SEARCH_USER_PATHS = NO; 269 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 270 | CLANG_CXX_LIBRARY = "libc++"; 271 | CLANG_ENABLE_MODULES = YES; 272 | CLANG_ENABLE_OBJC_ARC = YES; 273 | CLANG_WARN_BOOL_CONVERSION = YES; 274 | CLANG_WARN_CONSTANT_CONVERSION = YES; 275 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 276 | CLANG_WARN_EMPTY_BODY = YES; 277 | CLANG_WARN_ENUM_CONVERSION = YES; 278 | CLANG_WARN_INT_CONVERSION = YES; 279 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 280 | CLANG_WARN_UNREACHABLE_CODE = YES; 281 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 282 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 283 | COPY_PHASE_STRIP = NO; 284 | ENABLE_STRICT_OBJC_MSGSEND = YES; 285 | ENABLE_TESTABILITY = YES; 286 | GCC_C_LANGUAGE_STANDARD = gnu99; 287 | GCC_DYNAMIC_NO_PIC = NO; 288 | GCC_NO_COMMON_BLOCKS = YES; 289 | GCC_OPTIMIZATION_LEVEL = 0; 290 | GCC_PREPROCESSOR_DEFINITIONS = ( 291 | "DEBUG=1", 292 | "$(inherited)", 293 | ); 294 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 295 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 296 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 297 | GCC_WARN_UNDECLARED_SELECTOR = YES; 298 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 299 | GCC_WARN_UNUSED_FUNCTION = YES; 300 | GCC_WARN_UNUSED_VARIABLE = YES; 301 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 302 | MTL_ENABLE_DEBUG_INFO = YES; 303 | ONLY_ACTIVE_ARCH = YES; 304 | SDKROOT = iphoneos; 305 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 306 | }; 307 | name = Debug; 308 | }; 309 | 1C29062B196D71E000D4636F /* Release */ = { 310 | isa = XCBuildConfiguration; 311 | buildSettings = { 312 | ALWAYS_SEARCH_USER_PATHS = NO; 313 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 314 | CLANG_CXX_LIBRARY = "libc++"; 315 | CLANG_ENABLE_MODULES = YES; 316 | CLANG_ENABLE_OBJC_ARC = YES; 317 | CLANG_WARN_BOOL_CONVERSION = YES; 318 | CLANG_WARN_CONSTANT_CONVERSION = YES; 319 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 320 | CLANG_WARN_EMPTY_BODY = YES; 321 | CLANG_WARN_ENUM_CONVERSION = YES; 322 | CLANG_WARN_INT_CONVERSION = YES; 323 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 324 | CLANG_WARN_UNREACHABLE_CODE = YES; 325 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 326 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 327 | COPY_PHASE_STRIP = YES; 328 | ENABLE_NS_ASSERTIONS = NO; 329 | ENABLE_STRICT_OBJC_MSGSEND = YES; 330 | GCC_C_LANGUAGE_STANDARD = gnu99; 331 | GCC_NO_COMMON_BLOCKS = YES; 332 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 333 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 334 | GCC_WARN_UNDECLARED_SELECTOR = YES; 335 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 336 | GCC_WARN_UNUSED_FUNCTION = YES; 337 | GCC_WARN_UNUSED_VARIABLE = YES; 338 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 339 | MTL_ENABLE_DEBUG_INFO = NO; 340 | SDKROOT = iphoneos; 341 | VALIDATE_PRODUCT = YES; 342 | }; 343 | name = Release; 344 | }; 345 | 1C29062D196D71E000D4636F /* Debug */ = { 346 | isa = XCBuildConfiguration; 347 | buildSettings = { 348 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 349 | INFOPLIST_FILE = MBParallaxScrollView/Info.plist; 350 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 351 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 352 | PRODUCT_BUNDLE_IDENTIFIER = "com.michaelbabiy.${PRODUCT_NAME:rfc1034identifier}"; 353 | PRODUCT_NAME = "$(TARGET_NAME)"; 354 | SWIFT_VERSION = 3.0; 355 | }; 356 | name = Debug; 357 | }; 358 | 1C29062E196D71E000D4636F /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 362 | INFOPLIST_FILE = MBParallaxScrollView/Info.plist; 363 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 364 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 365 | PRODUCT_BUNDLE_IDENTIFIER = "com.michaelbabiy.${PRODUCT_NAME:rfc1034identifier}"; 366 | PRODUCT_NAME = "$(TARGET_NAME)"; 367 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 368 | SWIFT_VERSION = 3.0; 369 | }; 370 | name = Release; 371 | }; 372 | /* End XCBuildConfiguration section */ 373 | 374 | /* Begin XCConfigurationList section */ 375 | 1C29060B196D71E000D4636F /* Build configuration list for PBXProject "MBParallaxScrollView" */ = { 376 | isa = XCConfigurationList; 377 | buildConfigurations = ( 378 | 1C29062A196D71E000D4636F /* Debug */, 379 | 1C29062B196D71E000D4636F /* Release */, 380 | ); 381 | defaultConfigurationIsVisible = 0; 382 | defaultConfigurationName = Release; 383 | }; 384 | 1C29062C196D71E000D4636F /* Build configuration list for PBXNativeTarget "MBParallaxScrollView" */ = { 385 | isa = XCConfigurationList; 386 | buildConfigurations = ( 387 | 1C29062D196D71E000D4636F /* Debug */, 388 | 1C29062E196D71E000D4636F /* Release */, 389 | ); 390 | defaultConfigurationIsVisible = 0; 391 | defaultConfigurationName = Release; 392 | }; 393 | /* End XCConfigurationList section */ 394 | }; 395 | rootObject = 1C290608196D71E000D4636F /* Project object */; 396 | } 397 | -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/project.xcworkspace/xcshareddata/MBParallaxScrollView.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 1D6EF6D4-084B-43F1-9E4C-F5F832EADE6D 9 | IDESourceControlProjectName 10 | MBParallaxScrollView 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 995740B0531DA6E02B4D160F8C0C7667984C48A4 14 | github.com:michaelbabiy/MBParallaxScrollView.git 15 | 16 | IDESourceControlProjectPath 17 | MBParallaxScrollView.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 995740B0531DA6E02B4D160F8C0C7667984C48A4 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | github.com:michaelbabiy/MBParallaxScrollView.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 995740B0531DA6E02B4D160F8C0C7667984C48A4 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 995740B0531DA6E02B4D160F8C0C7667984C48A4 36 | IDESourceControlWCCName 37 | MBParallaxScrollView 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/project.xcworkspace/xcuserdata/mbabiy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView.xcodeproj/project.xcworkspace/xcuserdata/mbabiy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/xcuserdata/mbabiy.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/xcuserdata/mbabiy.xcuserdatad/xcschemes/MBParallaxScrollView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /MBParallaxScrollView.xcodeproj/xcuserdata/mbabiy.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | MBParallaxScrollView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1C29060F196D71E000D4636F 16 | 17 | primary 18 | 19 | 20 | 1C290621196D71E000D4636F 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /MBParallaxScrollView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // MBParallaxScrollView 4 | // 5 | // Created by Michael Babiy on 7/9/14. 6 | // Copyright (c) 2014 Michael Babiy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | 13 | class AppDelegate: UIResponder, UIApplicationDelegate 14 | { 15 | var window: UIWindow? 16 | 17 | private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool 18 | { 19 | return true 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /MBParallaxScrollView/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 | -------------------------------------------------------------------------------- /MBParallaxScrollView/HomeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // MBParallaxScrollView 4 | // 5 | // Created by Michael Babiy on 7/9/14. 6 | // Copyright (c) 2014 Michael Babiy. All rights reserved. 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 | import UIKit 27 | 28 | let parallaxCellIdentifier = "parallaxCell" 29 | 30 | class HomeViewController: UICollectionViewController 31 | { 32 | var images = [String]() 33 | 34 | override func viewDidLoad() 35 | { 36 | super.viewDidLoad() 37 | setup() 38 | } 39 | 40 | func setup() 41 | { 42 | for i in 0...14 { 43 | images.append("\(i)@2x") 44 | } 45 | } 46 | 47 | override func didReceiveMemoryWarning() 48 | { 49 | super.didReceiveMemoryWarning() 50 | } 51 | 52 | 53 | override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 54 | { 55 | return images.count 56 | } 57 | 58 | override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 59 | { 60 | let parallaxCell = collectionView.dequeueReusableCell(withReuseIdentifier: parallaxCellIdentifier, for: indexPath) as! ParallaxCollectionViewCell 61 | parallaxCell.image = UIImage(named: images[(indexPath as NSIndexPath).row])! 62 | return parallaxCell 63 | } 64 | 65 | override func scrollViewDidScroll(_ scrollView: UIScrollView) 66 | { 67 | guard let collectionView = self.collectionView else {return} 68 | guard let visibleCells = collectionView.visibleCells as? [ParallaxCollectionViewCell] else {return} 69 | for parallaxCell in visibleCells { 70 | let yOffset = ((collectionView.contentOffset.y - parallaxCell.frame.origin.y) / ImageHeight) * OffsetSpeed 71 | parallaxCell.offset(CGPoint(x: 0.0, y: yOffset)) 72 | } 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /MBParallaxScrollView/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 | } -------------------------------------------------------------------------------- /MBParallaxScrollView/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 | } -------------------------------------------------------------------------------- /MBParallaxScrollView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | Splash 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /MBParallaxScrollView/ParallaxCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ParallaxCollectionViewCell.swift 3 | // MBParallaxScrollView 4 | // 5 | // Created by Michael Babiy on 7/9/14. 6 | // Copyright (c) 2014 Michael Babiy. All rights reserved. 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 | import UIKit 27 | 28 | let ImageHeight: CGFloat = 200.0 29 | let OffsetSpeed: CGFloat = 25.0 30 | 31 | class ParallaxCollectionViewCell: UICollectionViewCell 32 | { 33 | // AspectFill; 200 points. 34 | @IBOutlet var imageView: UIImageView! 35 | 36 | var image: UIImage = UIImage() { 37 | didSet { 38 | imageView.image = image 39 | } 40 | } 41 | 42 | func offset(_ offset: CGPoint) 43 | { 44 | imageView.frame = self.imageView.bounds.offsetBy(dx: offset.x, dy: offset.y) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /MBParallaxScrollView/Splash.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MBParallaxScrollView/images/0@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/0@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/10@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/11@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/11@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/12@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/12@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/13@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/13@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/14@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/14@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/1@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/2@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/3@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/4@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/5@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/6@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/7@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/7@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/8@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/8@2x.png -------------------------------------------------------------------------------- /MBParallaxScrollView/images/9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbabiy/MBParallaxScrollView/647b48e971b9a5aad164555990f6f1ef657ec050/MBParallaxScrollView/images/9@2x.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | MBParallaxScrollView 2 | ==================== 3 | 4 | The simplest way to implement parallax scroll view in Swift. 5 | 6 | twitter: @michaelbabiy 7 | 8 | in: in/michaelbabiy 9 | --------------------------------------------------------------------------------