├── EEZoomableImageView.podspec ├── EEZoomableImageView.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── ergunemr.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── ergunemr.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── EEZoomableImageView ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset │ │ ├── Contents.json │ │ ├── moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.jpg │ │ ├── moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246735.jpg │ │ └── moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246736.jpg │ ├── parrot0.imageset │ │ ├── Contents.json │ │ ├── parrot0-1.jpeg │ │ └── parrot0.jpeg │ ├── parrot1.imageset │ │ ├── Contents.json │ │ ├── parrot1-1.jpeg │ │ └── parrot1.jpeg │ ├── parrot2.imageset │ │ ├── Contents.json │ │ ├── parrot2-1.jpeg │ │ └── parrot2.jpeg │ ├── parrot3.imageset │ │ ├── Contents.json │ │ ├── parrot3-1.jpeg │ │ └── parrot3.jpeg │ ├── parrot4.imageset │ │ ├── Contents.json │ │ ├── parrot4-1.jpeg │ │ └── parrot4.jpeg │ ├── parrot5.imageset │ │ ├── Contents.json │ │ ├── parrot5-1.jpeg │ │ └── parrot5.jpeg │ ├── parrot6.imageset │ │ ├── Contents.json │ │ ├── parrot6-1.jpeg │ │ └── parrot6.jpeg │ └── parrot7.imageset │ │ ├── Contents.json │ │ ├── parrot7-1.jpeg │ │ └── parrot7.jpeg ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── EEZoomableImageView │ └── EEZoomableImageView.swift ├── Info.plist ├── ParrotPhotoCollectionViewCell │ ├── ParrotPhotoCollectionViewCell.swift │ └── ParrotPhotoCollectionViewCell.xib └── View Controllers │ ├── BigImageViewController.swift │ └── ParrotListViewController.swift ├── LICENSE └── README.md /EEZoomableImageView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "EEZoomableImageView" 4 | s.version = "0.1.2" 5 | s.summary = "Provides full screen zoom feature to image view like instagram. " 6 | 7 | s.homepage = "https://github.com/ergunemr/EEZoomableImageView" 8 | 9 | s.license = { :type => "MIT", :file => "LICENSE" } 10 | 11 | s.author = { "Emre" => "ergunemr@itu.edu.tr" } 12 | 13 | s.platform = :ios 14 | s.ios.deployment_target = '10.0' 15 | 16 | s.source = { :git => "https://github.com/ergunemr/EEZoomableImageView.git", :tag => "#{s.version}" } 17 | 18 | s.source_files = "EEZoomableImageView/EEZoomableImageView/*.{swift}" 19 | 20 | s.framework = "UIKit" 21 | 22 | s.swift_version = ['4.2', '5.0', '5.1'] 23 | 24 | s.requires_arc = true 25 | 26 | end 27 | -------------------------------------------------------------------------------- /EEZoomableImageView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 67E7ACBC2165661900DCBDA9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E7ACBB2165661900DCBDA9 /* AppDelegate.swift */; }; 11 | 67E7ACC12165661900DCBDA9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 67E7ACBF2165661900DCBDA9 /* Main.storyboard */; }; 12 | 67E7ACC32165661A00DCBDA9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 67E7ACC22165661A00DCBDA9 /* Assets.xcassets */; }; 13 | 67E7ACC62165661A00DCBDA9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 67E7ACC42165661A00DCBDA9 /* LaunchScreen.storyboard */; }; 14 | 67E7ACD12165663A00DCBDA9 /* ParrotListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E7ACCD2165663A00DCBDA9 /* ParrotListViewController.swift */; }; 15 | 67E7ACD22165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 67E7ACCF2165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.xib */; }; 16 | 67E7ACD32165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E7ACD02165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.swift */; }; 17 | 67E7ACD62165664400DCBDA9 /* EEZoomableImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E7ACD52165664400DCBDA9 /* EEZoomableImageView.swift */; }; 18 | 67E7ACDA2165689A00DCBDA9 /* BigImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E7ACD72165666300DCBDA9 /* BigImageViewController.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | 67E7ACB82165661900DCBDA9 /* EEZoomableImageView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EEZoomableImageView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 67E7ACBB2165661900DCBDA9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 24 | 67E7ACC02165661900DCBDA9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 25 | 67E7ACC22165661A00DCBDA9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 26 | 67E7ACC52165661A00DCBDA9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 27 | 67E7ACC72165661A00DCBDA9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | 67E7ACCD2165663A00DCBDA9 /* ParrotListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParrotListViewController.swift; sourceTree = ""; }; 29 | 67E7ACCF2165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ParrotPhotoCollectionViewCell.xib; sourceTree = ""; }; 30 | 67E7ACD02165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParrotPhotoCollectionViewCell.swift; sourceTree = ""; }; 31 | 67E7ACD52165664400DCBDA9 /* EEZoomableImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EEZoomableImageView.swift; sourceTree = ""; }; 32 | 67E7ACD72165666300DCBDA9 /* BigImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigImageViewController.swift; sourceTree = ""; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | 67E7ACB52165661900DCBDA9 /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | ); 41 | runOnlyForDeploymentPostprocessing = 0; 42 | }; 43 | /* End PBXFrameworksBuildPhase section */ 44 | 45 | /* Begin PBXGroup section */ 46 | 67E7ACAF2165661900DCBDA9 = { 47 | isa = PBXGroup; 48 | children = ( 49 | 67E7ACBA2165661900DCBDA9 /* EEZoomableImageView */, 50 | 67E7ACB92165661900DCBDA9 /* Products */, 51 | ); 52 | sourceTree = ""; 53 | }; 54 | 67E7ACB92165661900DCBDA9 /* Products */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | 67E7ACB82165661900DCBDA9 /* EEZoomableImageView.app */, 58 | ); 59 | name = Products; 60 | sourceTree = ""; 61 | }; 62 | 67E7ACBA2165661900DCBDA9 /* EEZoomableImageView */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | 67E7ACBB2165661900DCBDA9 /* AppDelegate.swift */, 66 | 67E7ACD92165679400DCBDA9 /* View Controllers */, 67 | 67E7ACD42165664400DCBDA9 /* EEZoomableImageView */, 68 | 67E7ACCE2165663A00DCBDA9 /* ParrotPhotoCollectionViewCell */, 69 | 67E7ACBF2165661900DCBDA9 /* Main.storyboard */, 70 | 67E7ACC22165661A00DCBDA9 /* Assets.xcassets */, 71 | 67E7ACC42165661A00DCBDA9 /* LaunchScreen.storyboard */, 72 | 67E7ACC72165661A00DCBDA9 /* Info.plist */, 73 | ); 74 | path = EEZoomableImageView; 75 | sourceTree = ""; 76 | }; 77 | 67E7ACCE2165663A00DCBDA9 /* ParrotPhotoCollectionViewCell */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 67E7ACCF2165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.xib */, 81 | 67E7ACD02165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.swift */, 82 | ); 83 | path = ParrotPhotoCollectionViewCell; 84 | sourceTree = ""; 85 | }; 86 | 67E7ACD42165664400DCBDA9 /* EEZoomableImageView */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 67E7ACD52165664400DCBDA9 /* EEZoomableImageView.swift */, 90 | ); 91 | path = EEZoomableImageView; 92 | sourceTree = ""; 93 | }; 94 | 67E7ACD92165679400DCBDA9 /* View Controllers */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 67E7ACCD2165663A00DCBDA9 /* ParrotListViewController.swift */, 98 | 67E7ACD72165666300DCBDA9 /* BigImageViewController.swift */, 99 | ); 100 | path = "View Controllers"; 101 | sourceTree = ""; 102 | }; 103 | /* End PBXGroup section */ 104 | 105 | /* Begin PBXNativeTarget section */ 106 | 67E7ACB72165661900DCBDA9 /* EEZoomableImageView */ = { 107 | isa = PBXNativeTarget; 108 | buildConfigurationList = 67E7ACCA2165661A00DCBDA9 /* Build configuration list for PBXNativeTarget "EEZoomableImageView" */; 109 | buildPhases = ( 110 | 67E7ACB42165661900DCBDA9 /* Sources */, 111 | 67E7ACB52165661900DCBDA9 /* Frameworks */, 112 | 67E7ACB62165661900DCBDA9 /* Resources */, 113 | ); 114 | buildRules = ( 115 | ); 116 | dependencies = ( 117 | ); 118 | name = EEZoomableImageView; 119 | productName = EEZoomableImageView; 120 | productReference = 67E7ACB82165661900DCBDA9 /* EEZoomableImageView.app */; 121 | productType = "com.apple.product-type.application"; 122 | }; 123 | /* End PBXNativeTarget section */ 124 | 125 | /* Begin PBXProject section */ 126 | 67E7ACB02165661900DCBDA9 /* Project object */ = { 127 | isa = PBXProject; 128 | attributes = { 129 | LastSwiftUpdateCheck = 1000; 130 | LastUpgradeCheck = 1000; 131 | ORGANIZATIONNAME = Emre; 132 | TargetAttributes = { 133 | 67E7ACB72165661900DCBDA9 = { 134 | CreatedOnToolsVersion = 10.0; 135 | }; 136 | }; 137 | }; 138 | buildConfigurationList = 67E7ACB32165661900DCBDA9 /* Build configuration list for PBXProject "EEZoomableImageView" */; 139 | compatibilityVersion = "Xcode 9.3"; 140 | developmentRegion = en; 141 | hasScannedForEncodings = 0; 142 | knownRegions = ( 143 | en, 144 | Base, 145 | ); 146 | mainGroup = 67E7ACAF2165661900DCBDA9; 147 | productRefGroup = 67E7ACB92165661900DCBDA9 /* Products */; 148 | projectDirPath = ""; 149 | projectRoot = ""; 150 | targets = ( 151 | 67E7ACB72165661900DCBDA9 /* EEZoomableImageView */, 152 | ); 153 | }; 154 | /* End PBXProject section */ 155 | 156 | /* Begin PBXResourcesBuildPhase section */ 157 | 67E7ACB62165661900DCBDA9 /* Resources */ = { 158 | isa = PBXResourcesBuildPhase; 159 | buildActionMask = 2147483647; 160 | files = ( 161 | 67E7ACC62165661A00DCBDA9 /* LaunchScreen.storyboard in Resources */, 162 | 67E7ACD22165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.xib in Resources */, 163 | 67E7ACC32165661A00DCBDA9 /* Assets.xcassets in Resources */, 164 | 67E7ACC12165661900DCBDA9 /* Main.storyboard in Resources */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | /* End PBXResourcesBuildPhase section */ 169 | 170 | /* Begin PBXSourcesBuildPhase section */ 171 | 67E7ACB42165661900DCBDA9 /* Sources */ = { 172 | isa = PBXSourcesBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | 67E7ACDA2165689A00DCBDA9 /* BigImageViewController.swift in Sources */, 176 | 67E7ACD12165663A00DCBDA9 /* ParrotListViewController.swift in Sources */, 177 | 67E7ACD62165664400DCBDA9 /* EEZoomableImageView.swift in Sources */, 178 | 67E7ACBC2165661900DCBDA9 /* AppDelegate.swift in Sources */, 179 | 67E7ACD32165663A00DCBDA9 /* ParrotPhotoCollectionViewCell.swift in Sources */, 180 | ); 181 | runOnlyForDeploymentPostprocessing = 0; 182 | }; 183 | /* End PBXSourcesBuildPhase section */ 184 | 185 | /* Begin PBXVariantGroup section */ 186 | 67E7ACBF2165661900DCBDA9 /* Main.storyboard */ = { 187 | isa = PBXVariantGroup; 188 | children = ( 189 | 67E7ACC02165661900DCBDA9 /* Base */, 190 | ); 191 | name = Main.storyboard; 192 | sourceTree = ""; 193 | }; 194 | 67E7ACC42165661A00DCBDA9 /* LaunchScreen.storyboard */ = { 195 | isa = PBXVariantGroup; 196 | children = ( 197 | 67E7ACC52165661A00DCBDA9 /* Base */, 198 | ); 199 | name = LaunchScreen.storyboard; 200 | sourceTree = ""; 201 | }; 202 | /* End PBXVariantGroup section */ 203 | 204 | /* Begin XCBuildConfiguration section */ 205 | 67E7ACC82165661A00DCBDA9 /* Debug */ = { 206 | isa = XCBuildConfiguration; 207 | buildSettings = { 208 | ALWAYS_SEARCH_USER_PATHS = NO; 209 | CLANG_ANALYZER_NONNULL = YES; 210 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 211 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 212 | CLANG_CXX_LIBRARY = "libc++"; 213 | CLANG_ENABLE_MODULES = YES; 214 | CLANG_ENABLE_OBJC_ARC = YES; 215 | CLANG_ENABLE_OBJC_WEAK = YES; 216 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 217 | CLANG_WARN_BOOL_CONVERSION = YES; 218 | CLANG_WARN_COMMA = YES; 219 | CLANG_WARN_CONSTANT_CONVERSION = YES; 220 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 221 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 222 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 223 | CLANG_WARN_EMPTY_BODY = YES; 224 | CLANG_WARN_ENUM_CONVERSION = YES; 225 | CLANG_WARN_INFINITE_RECURSION = YES; 226 | CLANG_WARN_INT_CONVERSION = YES; 227 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 228 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 229 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 230 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 231 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 232 | CLANG_WARN_STRICT_PROTOTYPES = YES; 233 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 234 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 235 | CLANG_WARN_UNREACHABLE_CODE = YES; 236 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 237 | CODE_SIGN_IDENTITY = "iPhone Developer"; 238 | COPY_PHASE_STRIP = NO; 239 | DEBUG_INFORMATION_FORMAT = dwarf; 240 | ENABLE_STRICT_OBJC_MSGSEND = YES; 241 | ENABLE_TESTABILITY = YES; 242 | GCC_C_LANGUAGE_STANDARD = gnu11; 243 | GCC_DYNAMIC_NO_PIC = NO; 244 | GCC_NO_COMMON_BLOCKS = YES; 245 | GCC_OPTIMIZATION_LEVEL = 0; 246 | GCC_PREPROCESSOR_DEFINITIONS = ( 247 | "DEBUG=1", 248 | "$(inherited)", 249 | ); 250 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 251 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 252 | GCC_WARN_UNDECLARED_SELECTOR = YES; 253 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 254 | GCC_WARN_UNUSED_FUNCTION = YES; 255 | GCC_WARN_UNUSED_VARIABLE = YES; 256 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 257 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 258 | MTL_FAST_MATH = YES; 259 | ONLY_ACTIVE_ARCH = YES; 260 | SDKROOT = iphoneos; 261 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 262 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 263 | }; 264 | name = Debug; 265 | }; 266 | 67E7ACC92165661A00DCBDA9 /* Release */ = { 267 | isa = XCBuildConfiguration; 268 | buildSettings = { 269 | ALWAYS_SEARCH_USER_PATHS = NO; 270 | CLANG_ANALYZER_NONNULL = YES; 271 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 272 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 273 | CLANG_CXX_LIBRARY = "libc++"; 274 | CLANG_ENABLE_MODULES = YES; 275 | CLANG_ENABLE_OBJC_ARC = YES; 276 | CLANG_ENABLE_OBJC_WEAK = YES; 277 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 278 | CLANG_WARN_BOOL_CONVERSION = YES; 279 | CLANG_WARN_COMMA = YES; 280 | CLANG_WARN_CONSTANT_CONVERSION = YES; 281 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 282 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 283 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 284 | CLANG_WARN_EMPTY_BODY = YES; 285 | CLANG_WARN_ENUM_CONVERSION = YES; 286 | CLANG_WARN_INFINITE_RECURSION = YES; 287 | CLANG_WARN_INT_CONVERSION = YES; 288 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 289 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 290 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 291 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 292 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 293 | CLANG_WARN_STRICT_PROTOTYPES = YES; 294 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 295 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 296 | CLANG_WARN_UNREACHABLE_CODE = YES; 297 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 298 | CODE_SIGN_IDENTITY = "iPhone Developer"; 299 | COPY_PHASE_STRIP = NO; 300 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 301 | ENABLE_NS_ASSERTIONS = NO; 302 | ENABLE_STRICT_OBJC_MSGSEND = YES; 303 | GCC_C_LANGUAGE_STANDARD = gnu11; 304 | GCC_NO_COMMON_BLOCKS = YES; 305 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 306 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 307 | GCC_WARN_UNDECLARED_SELECTOR = YES; 308 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 309 | GCC_WARN_UNUSED_FUNCTION = YES; 310 | GCC_WARN_UNUSED_VARIABLE = YES; 311 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 312 | MTL_ENABLE_DEBUG_INFO = NO; 313 | MTL_FAST_MATH = YES; 314 | SDKROOT = iphoneos; 315 | SWIFT_COMPILATION_MODE = wholemodule; 316 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 317 | VALIDATE_PRODUCT = YES; 318 | }; 319 | name = Release; 320 | }; 321 | 67E7ACCB2165661A00DCBDA9 /* Debug */ = { 322 | isa = XCBuildConfiguration; 323 | buildSettings = { 324 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 325 | CODE_SIGN_STYLE = Automatic; 326 | DEVELOPMENT_TEAM = TL5WBK3BS7; 327 | INFOPLIST_FILE = EEZoomableImageView/Info.plist; 328 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 329 | LD_RUNPATH_SEARCH_PATHS = ( 330 | "$(inherited)", 331 | "@executable_path/Frameworks", 332 | ); 333 | PRODUCT_BUNDLE_IDENTIFIER = FUREM.EEZoomableImageView; 334 | PRODUCT_NAME = "$(TARGET_NAME)"; 335 | SWIFT_VERSION = 5.0; 336 | TARGETED_DEVICE_FAMILY = "1,2"; 337 | }; 338 | name = Debug; 339 | }; 340 | 67E7ACCC2165661A00DCBDA9 /* Release */ = { 341 | isa = XCBuildConfiguration; 342 | buildSettings = { 343 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 344 | CODE_SIGN_STYLE = Automatic; 345 | DEVELOPMENT_TEAM = TL5WBK3BS7; 346 | INFOPLIST_FILE = EEZoomableImageView/Info.plist; 347 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 348 | LD_RUNPATH_SEARCH_PATHS = ( 349 | "$(inherited)", 350 | "@executable_path/Frameworks", 351 | ); 352 | PRODUCT_BUNDLE_IDENTIFIER = FUREM.EEZoomableImageView; 353 | PRODUCT_NAME = "$(TARGET_NAME)"; 354 | SWIFT_VERSION = 5.0; 355 | TARGETED_DEVICE_FAMILY = "1,2"; 356 | }; 357 | name = Release; 358 | }; 359 | /* End XCBuildConfiguration section */ 360 | 361 | /* Begin XCConfigurationList section */ 362 | 67E7ACB32165661900DCBDA9 /* Build configuration list for PBXProject "EEZoomableImageView" */ = { 363 | isa = XCConfigurationList; 364 | buildConfigurations = ( 365 | 67E7ACC82165661A00DCBDA9 /* Debug */, 366 | 67E7ACC92165661A00DCBDA9 /* Release */, 367 | ); 368 | defaultConfigurationIsVisible = 0; 369 | defaultConfigurationName = Release; 370 | }; 371 | 67E7ACCA2165661A00DCBDA9 /* Build configuration list for PBXNativeTarget "EEZoomableImageView" */ = { 372 | isa = XCConfigurationList; 373 | buildConfigurations = ( 374 | 67E7ACCB2165661A00DCBDA9 /* Debug */, 375 | 67E7ACCC2165661A00DCBDA9 /* Release */, 376 | ); 377 | defaultConfigurationIsVisible = 0; 378 | defaultConfigurationName = Release; 379 | }; 380 | /* End XCConfigurationList section */ 381 | }; 382 | rootObject = 67E7ACB02165661900DCBDA9 /* Project object */; 383 | } 384 | -------------------------------------------------------------------------------- /EEZoomableImageView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /EEZoomableImageView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /EEZoomableImageView.xcodeproj/project.xcworkspace/xcuserdata/ergunemr.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView.xcodeproj/project.xcworkspace/xcuserdata/ergunemr.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /EEZoomableImageView.xcodeproj/xcuserdata/ergunemr.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | EEZoomableImageView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /EEZoomableImageView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // EEZoomableImageView 4 | // 5 | // Created by Emre on 4.10.2018. 6 | // Copyright © 2018 Emre. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246735.jpg", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246736.jpg", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.jpg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246735.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246735.jpg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246736.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246734.imageset/moda-haber-mezuniyet-koleksiyonuyla-trendyol-karsinizda-1246736.jpg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot0.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot0.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot0-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot0.imageset/parrot0-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot0.imageset/parrot0-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot0.imageset/parrot0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot0.imageset/parrot0.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot1.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot1-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot1.imageset/parrot1-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot1.imageset/parrot1-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot1.imageset/parrot1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot1.imageset/parrot1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot2.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot2-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot2.imageset/parrot2-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot2.imageset/parrot2-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot2.imageset/parrot2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot2.imageset/parrot2.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot3.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot3-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot3.imageset/parrot3-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot3.imageset/parrot3-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot3.imageset/parrot3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot3.imageset/parrot3.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot4.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot4-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot4.imageset/parrot4-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot4.imageset/parrot4-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot4.imageset/parrot4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot4.imageset/parrot4.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot5.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot5-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot5.imageset/parrot5-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot5.imageset/parrot5-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot5.imageset/parrot5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot5.imageset/parrot5.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot6.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot6-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot6.imageset/parrot6-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot6.imageset/parrot6-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot6.imageset/parrot6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot6.imageset/parrot6.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "parrot7.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "parrot7-1.jpeg", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot7.imageset/parrot7-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot7.imageset/parrot7-1.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Assets.xcassets/parrot7.imageset/parrot7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ergunemr/EEZoomableImageView/cdbaa55099db8814eb33c3e6c9419cf992ac7303/EEZoomableImageView/Assets.xcassets/parrot7.imageset/parrot7.jpeg -------------------------------------------------------------------------------- /EEZoomableImageView/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /EEZoomableImageView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /EEZoomableImageView/EEZoomableImageView/EEZoomableImageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EEZoomableImageView.swift 3 | // EEZoomableImageView 4 | // 5 | // Created by Emre on 27.05.2018. 6 | // Copyright © 2018 Emre. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class EEZoomableImageView: UIImageView { 12 | 13 | private var pinchZoomHandler: PinchZoomHandler! 14 | 15 | // Public Configurables 16 | 17 | public var zoomDelegate: ZoomingDelegate? { 18 | get { 19 | return pinchZoomHandler.delegate 20 | } set { 21 | pinchZoomHandler.delegate = newValue 22 | } 23 | } 24 | 25 | // Minimum Scale of ImageView 26 | public var minZoomScale: CGFloat { 27 | get { 28 | return pinchZoomHandler.minZoomScale 29 | } set { 30 | pinchZoomHandler.minZoomScale = abs(min(1.0, newValue)) 31 | } 32 | } 33 | 34 | // Maximum Scale of ImageView 35 | public var maxZoomScale: CGFloat { 36 | get { 37 | return pinchZoomHandler.maxZoomScale 38 | } set { 39 | pinchZoomHandler.maxZoomScale = abs(max(1.0, newValue)) 40 | } 41 | } 42 | 43 | // Duration of finish animation 44 | public var resetAnimationDuration: Double { 45 | get { 46 | return pinchZoomHandler.resetAnimationDuration 47 | } set { 48 | pinchZoomHandler.resetAnimationDuration = abs(newValue) 49 | } 50 | } 51 | 52 | // True when pinching active 53 | public var isZoomingActive: Bool { 54 | get { 55 | return pinchZoomHandler.isZoomingActive 56 | } set { } 57 | } 58 | 59 | // MARK: Private Initializations 60 | 61 | override init(frame: CGRect) { 62 | super.init(frame: frame) 63 | 64 | commonInit() 65 | } 66 | 67 | override init(image: UIImage?, highlightedImage: UIImage?) { 68 | super.init(image: image, highlightedImage: highlightedImage) 69 | 70 | commonInit() 71 | } 72 | 73 | override init(image: UIImage?) { 74 | super.init(image: image) 75 | 76 | commonInit() 77 | } 78 | 79 | required public init?(coder aDecoder: NSCoder) { 80 | super.init(coder: aDecoder) 81 | 82 | commonInit() 83 | } 84 | 85 | private func commonInit() { 86 | pinchZoomHandler = PinchZoomHandler(usingSourceImageView: self) 87 | } 88 | } 89 | 90 | public protocol ZoomingDelegate: class { 91 | func pinchZoomHandlerStartPinching() 92 | func pinchZoomHandlerEndPinching() 93 | } 94 | 95 | private struct PinchZoomHandlerConstants { 96 | fileprivate static let kMinZoomScaleDefaultValue: CGFloat = 1.0 97 | fileprivate static let kMaxZoomScaleDefaultValue: CGFloat = 3.0 98 | fileprivate static let kResetAnimationDurationDefaultValue = 0.3 99 | fileprivate static let kIsZoomingActiveDefaultValue: Bool = false 100 | } 101 | 102 | fileprivate class PinchZoomHandler { 103 | 104 | // Configurable 105 | var minZoomScale: CGFloat = PinchZoomHandlerConstants.kMinZoomScaleDefaultValue 106 | var maxZoomScale: CGFloat = PinchZoomHandlerConstants.kMaxZoomScaleDefaultValue 107 | var resetAnimationDuration = PinchZoomHandlerConstants.kResetAnimationDurationDefaultValue 108 | var isZoomingActive: Bool = PinchZoomHandlerConstants.kIsZoomingActiveDefaultValue 109 | weak var delegate: ZoomingDelegate? 110 | weak var sourceImageView: UIImageView? 111 | 112 | private var zoomImageView: UIImageView = UIImageView() 113 | private var initialRect: CGRect = CGRect.zero 114 | private var zoomImageLastPosition: CGPoint = CGPoint.zero 115 | private var lastTouchPoint: CGPoint = CGPoint.zero 116 | private var lastNumberOfTouch: Int? 117 | 118 | // MARK: Initialization 119 | 120 | init(usingSourceImageView sourceImageView: UIImageView) { 121 | self.sourceImageView = sourceImageView 122 | 123 | setupPinchGesture(on: sourceImageView) 124 | } 125 | 126 | // MARK: Private Methods 127 | 128 | private func setupPinchGesture(on pinchContainer: UIView) { 129 | let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture(pinch:))) 130 | pinchGesture.cancelsTouchesInView = false 131 | pinchContainer.isUserInteractionEnabled = true 132 | pinchContainer.addGestureRecognizer(pinchGesture) 133 | } 134 | 135 | @objc private func handlePinchGesture(pinch: UIPinchGestureRecognizer) { 136 | 137 | guard let pinchableImageView = sourceImageView else { return } 138 | handlePinchMovement(pinchGesture: pinch, sourceImageView: pinchableImageView) 139 | } 140 | 141 | private func handlePinchMovement(pinchGesture: UIPinchGestureRecognizer, sourceImageView: UIImageView) { 142 | 143 | switch pinchGesture.state { 144 | case .began: 145 | 146 | guard !isZoomingActive, pinchGesture.scale >= minZoomScale else { return } 147 | 148 | guard let point = sourceImageView.superview?.convert(sourceImageView.frame.origin, to: nil) else { return } 149 | initialRect = CGRect(x: point.x, y: point.y, width: sourceImageView.frame.size.width, height: sourceImageView.frame.size.height) 150 | 151 | lastTouchPoint = pinchGesture.location(in: sourceImageView) 152 | 153 | zoomImageView = UIImageView(image: sourceImageView.image) 154 | zoomImageView.contentMode = sourceImageView.contentMode 155 | zoomImageView.frame = initialRect 156 | 157 | let anchorPoint = CGPoint(x: lastTouchPoint.x/initialRect.size.width, y: lastTouchPoint.y/initialRect.size.height) 158 | zoomImageView.layer.anchorPoint = anchorPoint 159 | zoomImageView.center = lastTouchPoint 160 | zoomImageView.frame = initialRect 161 | 162 | sourceImageView.alpha = 0.0 163 | UIApplication.shared.keyWindow?.addSubview(zoomImageView) 164 | 165 | zoomImageLastPosition = zoomImageView.center 166 | 167 | self.delegate?.pinchZoomHandlerStartPinching() 168 | 169 | isZoomingActive = true 170 | lastNumberOfTouch = pinchGesture.numberOfTouches 171 | 172 | case .changed: 173 | let isNumberOfTouchChanged = pinchGesture.numberOfTouches != lastNumberOfTouch 174 | 175 | if isNumberOfTouchChanged { 176 | let newTouchPoint = pinchGesture.location(in: sourceImageView) 177 | lastTouchPoint = newTouchPoint 178 | } 179 | 180 | let scale = zoomImageView.frame.size.width / initialRect.size.width 181 | let newScale = scale * pinchGesture.scale 182 | 183 | if scale.isNaN || scale == CGFloat.infinity || CGFloat.nan == initialRect.size.width { 184 | return 185 | } 186 | 187 | zoomImageView.frame = CGRect(x: zoomImageView.frame.origin.x, 188 | y: zoomImageView.frame.origin.y, 189 | width: min(max(initialRect.size.width * newScale, initialRect.size.width * minZoomScale), initialRect.size.width * maxZoomScale), 190 | height: min(max(initialRect.size.height * newScale, initialRect.size.height * minZoomScale), initialRect.size.height * maxZoomScale)) 191 | 192 | let centerXDif = lastTouchPoint.x - pinchGesture.location(in: sourceImageView).x 193 | let centerYDif = lastTouchPoint.y - pinchGesture.location(in: sourceImageView).y 194 | 195 | zoomImageView.center = CGPoint(x: zoomImageLastPosition.x - centerXDif, y: zoomImageLastPosition.y - centerYDif) 196 | pinchGesture.scale = 1.0 197 | 198 | // Store last values 199 | lastNumberOfTouch = pinchGesture.numberOfTouches 200 | zoomImageLastPosition = zoomImageView.center 201 | lastTouchPoint = pinchGesture.location(in: sourceImageView) 202 | 203 | case .ended, .cancelled, .failed: 204 | resetZoom() 205 | default: 206 | break 207 | } 208 | } 209 | 210 | private func resetZoom() { 211 | UIView.animate(withDuration: resetAnimationDuration, animations: { 212 | self.zoomImageView.frame = self.initialRect 213 | }) { _ in 214 | self.zoomImageView.removeFromSuperview() 215 | self.sourceImageView?.alpha = 1.0 216 | self.initialRect = .zero 217 | self.lastTouchPoint = .zero 218 | self.isZoomingActive = false 219 | self.delegate?.pinchZoomHandlerEndPinching() 220 | } 221 | } 222 | } 223 | -------------------------------------------------------------------------------- /EEZoomableImageView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /EEZoomableImageView/ParrotPhotoCollectionViewCell/ParrotPhotoCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ParrotPhotoCollectionViewCell.swift 3 | // ZoomableImageView 4 | // 5 | // Created by Emre on 3.10.2018. 6 | // Copyright © 2018 Emre. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ParrotPhotoCollectionViewCell: UICollectionViewCell { 12 | 13 | @IBOutlet weak var zoomableImageView: EEZoomableImageView! { 14 | didSet { 15 | zoomableImageView.minZoomScale = 0.5 16 | zoomableImageView.maxZoomScale = 3.0 17 | zoomableImageView.resetAnimationDuration = 0.5 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /EEZoomableImageView/ParrotPhotoCollectionViewCell/ParrotPhotoCollectionViewCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /EEZoomableImageView/View Controllers/BigImageViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BigImageViewController.swift 3 | // EEZoomableImageView 4 | // 5 | // Created by Emre on 3.10.2018. 6 | // Copyright © 2018 Emre. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BigImageViewController: UIViewController { 12 | 13 | let kPageTitle = "Big Photo" 14 | var parrotImage: UIImage? 15 | 16 | @IBOutlet weak var bigPhotoImageView: EEZoomableImageView! 17 | 18 | override func viewDidLoad() { 19 | super.viewDidLoad() 20 | 21 | title = kPageTitle 22 | } 23 | 24 | override func viewWillAppear(_ animated: Bool) { 25 | super.viewWillAppear(animated) 26 | 27 | bigPhotoImageView.image = parrotImage 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /EEZoomableImageView/View Controllers/ParrotListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ParrotListViewController.swift 3 | // EEZoomableImageView 4 | // 5 | // Created by Emre on 3.10.2018. 6 | // Copyright © 2018 Emre. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ParrotListViewController: UIViewController { 12 | 13 | let kCollectionViewInset: CGFloat = 20 14 | let kShowBigSegueIdentifier = "showBigImageSegue" 15 | 16 | let parrotImages: [UIImage?] = { 17 | var images = [UIImage?]() 18 | for number in 0...7 { 19 | images.append(UIImage(named: "parrot\(number)")) 20 | } 21 | return images 22 | }() 23 | 24 | @IBOutlet weak var parrotsCollectionView: UICollectionView! 25 | 26 | override func viewDidLoad() { 27 | super.viewDidLoad() 28 | 29 | prepareCollectionView() 30 | } 31 | 32 | private func prepareCollectionView() { 33 | parrotsCollectionView.register(UINib(nibName: "ParrotPhotoCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "parrotCell") 34 | 35 | let flowLayout = UICollectionViewFlowLayout() 36 | flowLayout.sectionInset = UIEdgeInsets(top: kCollectionViewInset, left: kCollectionViewInset, bottom: kCollectionViewInset, right: kCollectionViewInset) 37 | parrotsCollectionView.setCollectionViewLayout(flowLayout, animated: false) 38 | } 39 | 40 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 41 | guard segue.identifier == kShowBigSegueIdentifier, let bigImageVC = segue.destination as? BigImageViewController, let parrotImage = sender as? UIImage else { return } 42 | bigImageVC.parrotImage = parrotImage 43 | } 44 | } 45 | 46 | extension ParrotListViewController: ZoomingDelegate { 47 | func pinchZoomHandlerStartPinching() { 48 | print("pinchZoomHandlerStartPinching") 49 | } 50 | 51 | func pinchZoomHandlerEndPinching() { 52 | print("pinchZoomHandlerEndPinching") 53 | } 54 | } 55 | 56 | extension ParrotListViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 57 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 58 | return parrotImages.count 59 | } 60 | 61 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 62 | guard let parrotCell = collectionView.dequeueReusableCell(withReuseIdentifier: "parrotCell", for: indexPath) as? ParrotPhotoCollectionViewCell else { fatalError() } 63 | parrotCell.zoomableImageView.image = parrotImages[indexPath.row] 64 | return parrotCell 65 | } 66 | 67 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 68 | let referenceSize = (UIScreen.main.bounds.size.width - 3*kCollectionViewInset)/2 69 | return CGSize(width: referenceSize, height: referenceSize*1.5) 70 | } 71 | 72 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 73 | return kCollectionViewInset 74 | } 75 | 76 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 77 | performSegue(withIdentifier: kShowBigSegueIdentifier, sender: parrotImages[indexPath.row]) 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Emre 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EEZoomableImageView 2 | 3 | **Provides full screen zooming ability to UIImageView like instagram.** 4 | 5 | ![](https://img.shields.io/badge/version-0.1.0-blue.svg) 6 | ![](https://img.shields.io/badge/platform-ios-lightgrey.svg) 7 | ![](https://img.shields.io/badge/Contact-ergunemr%40gmail.com-yellowgreen.svg) 8 | 9 | ##
What does EEZoomableImageView do? 10 | Gives full screen zooming ability to UIImageView with no additional code. 11 | 12 | ![](https://media.giphy.com/media/2A8wnov0yHo8Mm7y8E/giphy.gif) 13 | ![](https://media.giphy.com/media/9JnSK6WDP9wG47m8XU/giphy.gif) 14 | 15 | It handles number of the touch changes on the screen. There is no weird behaviour like jumping image's center when user removes one finger from the screen, as far as I know. :squirrel: 16 | 17 | ##
Setup 18 | 19 | **Using CocoaPods (Recommended)** 20 | 21 | Add the line below to your Podfile; 22 | 23 | ``` 24 | pod 'EEZoomableImageView' 25 | ``` 26 | 27 | Then you can install it with pod install command. 28 | 29 | **Manual** 30 | 31 | Download the sample project, just drag and drop the EEZoomableImageView.swift file to your project. 32 | 33 | ##
Usage 34 | Make your image view subclass of EEZoomableImageView. It's simple as that. 35 | 36 | ##
Customizable Parameters 37 | Custom parameters can be set through EEZoomableImageView instance 38 | 39 | ``` 40 | @IBOutlet weak var zoomableImageView: EEZoomableImageView! { 41 | didSet { 42 | zoomableImageView.minZoomScale = 0.5 43 | zoomableImageView.maxZoomScale = 3.0 44 | zoomableImageView.resetAnimationDuration = 0.5 45 | zoomableImageView.zoomDelegate = self 46 | } 47 | } 48 | ``` 49 | 50 | * **minZoomScale:** Minimum scale of the zoom imageview. Default value is 1.00 51 | * **maxZoomScale:** Maximum scale of the zoom imageview. Default value is 3.00 52 | * **resetAnimationDuration:** Duration of the reset animation. Default value is 0.3 sec 53 | * **zoomDelegate:** Zoom Delegate is informed when zooming started and ended. 54 | * **isZoomingActive:** Flag that indicates whether zooming is active or not. (Read Only) 55 | 56 | 57 | ##
Questions or Advices 58 | Just send me an email (ergunemr@gmail.com) --------------------------------------------------------------------------------