├── HowToCustomAnimateCellHeight.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── lucasilvestro.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── lucasilvestro.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── HowToCustomAnimateCellHeight.xcscheme │ └── xcschememanagement.plist ├── HowToCustomAnimateCellHeight ├── AppDelegate.swift ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── DetailViewController.swift ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── TableViewCell.swift ├── ViewController.swift └── ionicons.swift │ ├── IonIcons.h │ ├── IonIcons.m │ ├── Ionicons.swift │ ├── README.md │ └── ionicons.ttf ├── HowToCustomAnimateCellHeightTests ├── HowToCustomAnimateCellHeightTests.swift └── Info.plist ├── README.md └── example.gif /HowToCustomAnimateCellHeight.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B8581AE21B63D46D00DE9AE6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581AE11B63D46D00DE9AE6 /* AppDelegate.swift */; }; 11 | B8581AE41B63D46E00DE9AE6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581AE31B63D46E00DE9AE6 /* ViewController.swift */; }; 12 | B8581AE71B63D46E00DE9AE6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B8581AE51B63D46E00DE9AE6 /* Main.storyboard */; }; 13 | B8581AE91B63D46E00DE9AE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B8581AE81B63D46E00DE9AE6 /* Images.xcassets */; }; 14 | B8581AEC1B63D46E00DE9AE6 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = B8581AEA1B63D46E00DE9AE6 /* LaunchScreen.xib */; }; 15 | B8581AF81B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581AF71B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.swift */; }; 16 | B8581B021B643EA800DE9AE6 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581B011B643EA800DE9AE6 /* TableViewCell.swift */; }; 17 | B8581B041B6455C900DE9AE6 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581B031B6455C900DE9AE6 /* DetailViewController.swift */; }; 18 | B8581B0C1B64DF1C00DE9AE6 /* IonIcons.m in Sources */ = {isa = PBXBuildFile; fileRef = B8581B081B64DF1C00DE9AE6 /* IonIcons.m */; }; 19 | B8581B0D1B64DF1C00DE9AE6 /* Ionicons.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8581B091B64DF1C00DE9AE6 /* Ionicons.swift */; }; 20 | B8581B0E1B64DF1C00DE9AE6 /* ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B8581B0A1B64DF1C00DE9AE6 /* ionicons.ttf */; }; 21 | B8581B0F1B64DF1C00DE9AE6 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = B8581B0B1B64DF1C00DE9AE6 /* README.md */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | B8581AF21B63D46E00DE9AE6 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = B8581AD41B63D46D00DE9AE6 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = B8581ADB1B63D46D00DE9AE6; 30 | remoteInfo = HowToCustomAnimateCellHeight; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | B8581ADC1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HowToCustomAnimateCellHeight.app; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | B8581AE01B63D46D00DE9AE6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | B8581AE11B63D46D00DE9AE6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 38 | B8581AE31B63D46E00DE9AE6 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 39 | B8581AE61B63D46E00DE9AE6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 40 | B8581AE81B63D46E00DE9AE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 41 | B8581AEB1B63D46E00DE9AE6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 42 | B8581AF11B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HowToCustomAnimateCellHeightTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | B8581AF61B63D46E00DE9AE6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 44 | B8581AF71B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowToCustomAnimateCellHeightTests.swift; sourceTree = ""; }; 45 | B8581B011B643EA800DE9AE6 /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 46 | B8581B031B6455C900DE9AE6 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; 47 | B8581B071B64DF1C00DE9AE6 /* IonIcons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IonIcons.h; sourceTree = ""; }; 48 | B8581B081B64DF1C00DE9AE6 /* IonIcons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IonIcons.m; sourceTree = ""; }; 49 | B8581B091B64DF1C00DE9AE6 /* Ionicons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Ionicons.swift; sourceTree = ""; }; 50 | B8581B0A1B64DF1C00DE9AE6 /* ionicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ionicons.ttf; sourceTree = ""; }; 51 | B8581B0B1B64DF1C00DE9AE6 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | B8581AD91B63D46D00DE9AE6 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | B8581AEE1B63D46E00DE9AE6 /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | B8581AD31B63D46D00DE9AE6 = { 73 | isa = PBXGroup; 74 | children = ( 75 | B8581ADE1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight */, 76 | B8581AF41B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests */, 77 | B8581ADD1B63D46D00DE9AE6 /* Products */, 78 | ); 79 | sourceTree = ""; 80 | }; 81 | B8581ADD1B63D46D00DE9AE6 /* Products */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | B8581ADC1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight.app */, 85 | B8581AF11B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.xctest */, 86 | ); 87 | name = Products; 88 | sourceTree = ""; 89 | }; 90 | B8581ADE1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | B8581AE11B63D46D00DE9AE6 /* AppDelegate.swift */, 94 | B8581AE31B63D46E00DE9AE6 /* ViewController.swift */, 95 | B8581B031B6455C900DE9AE6 /* DetailViewController.swift */, 96 | B8581AE51B63D46E00DE9AE6 /* Main.storyboard */, 97 | B8581B011B643EA800DE9AE6 /* TableViewCell.swift */, 98 | B8581AE81B63D46E00DE9AE6 /* Images.xcassets */, 99 | B8581AEA1B63D46E00DE9AE6 /* LaunchScreen.xib */, 100 | B8581ADF1B63D46D00DE9AE6 /* Supporting Files */, 101 | ); 102 | path = HowToCustomAnimateCellHeight; 103 | sourceTree = ""; 104 | }; 105 | B8581ADF1B63D46D00DE9AE6 /* Supporting Files */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | B8581B061B64DF1C00DE9AE6 /* ionicons */, 109 | B8581AE01B63D46D00DE9AE6 /* Info.plist */, 110 | ); 111 | name = "Supporting Files"; 112 | sourceTree = ""; 113 | }; 114 | B8581AF41B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | B8581AF71B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.swift */, 118 | B8581AF51B63D46E00DE9AE6 /* Supporting Files */, 119 | ); 120 | path = HowToCustomAnimateCellHeightTests; 121 | sourceTree = ""; 122 | }; 123 | B8581AF51B63D46E00DE9AE6 /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | B8581AF61B63D46E00DE9AE6 /* Info.plist */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | B8581B061B64DF1C00DE9AE6 /* ionicons */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | B8581B071B64DF1C00DE9AE6 /* IonIcons.h */, 135 | B8581B081B64DF1C00DE9AE6 /* IonIcons.m */, 136 | B8581B091B64DF1C00DE9AE6 /* Ionicons.swift */, 137 | B8581B0A1B64DF1C00DE9AE6 /* ionicons.ttf */, 138 | B8581B0B1B64DF1C00DE9AE6 /* README.md */, 139 | ); 140 | name = ionicons; 141 | path = ionicons.swift; 142 | sourceTree = ""; 143 | }; 144 | /* End PBXGroup section */ 145 | 146 | /* Begin PBXNativeTarget section */ 147 | B8581ADB1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight */ = { 148 | isa = PBXNativeTarget; 149 | buildConfigurationList = B8581AFB1B63D46E00DE9AE6 /* Build configuration list for PBXNativeTarget "HowToCustomAnimateCellHeight" */; 150 | buildPhases = ( 151 | B8581AD81B63D46D00DE9AE6 /* Sources */, 152 | B8581AD91B63D46D00DE9AE6 /* Frameworks */, 153 | B8581ADA1B63D46D00DE9AE6 /* Resources */, 154 | ); 155 | buildRules = ( 156 | ); 157 | dependencies = ( 158 | ); 159 | name = HowToCustomAnimateCellHeight; 160 | productName = HowToCustomAnimateCellHeight; 161 | productReference = B8581ADC1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight.app */; 162 | productType = "com.apple.product-type.application"; 163 | }; 164 | B8581AF01B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests */ = { 165 | isa = PBXNativeTarget; 166 | buildConfigurationList = B8581AFE1B63D46E00DE9AE6 /* Build configuration list for PBXNativeTarget "HowToCustomAnimateCellHeightTests" */; 167 | buildPhases = ( 168 | B8581AED1B63D46E00DE9AE6 /* Sources */, 169 | B8581AEE1B63D46E00DE9AE6 /* Frameworks */, 170 | B8581AEF1B63D46E00DE9AE6 /* Resources */, 171 | ); 172 | buildRules = ( 173 | ); 174 | dependencies = ( 175 | B8581AF31B63D46E00DE9AE6 /* PBXTargetDependency */, 176 | ); 177 | name = HowToCustomAnimateCellHeightTests; 178 | productName = HowToCustomAnimateCellHeightTests; 179 | productReference = B8581AF11B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.xctest */; 180 | productType = "com.apple.product-type.bundle.unit-test"; 181 | }; 182 | /* End PBXNativeTarget section */ 183 | 184 | /* Begin PBXProject section */ 185 | B8581AD41B63D46D00DE9AE6 /* Project object */ = { 186 | isa = PBXProject; 187 | attributes = { 188 | LastUpgradeCheck = 0630; 189 | ORGANIZATIONNAME = "luca silvestro"; 190 | TargetAttributes = { 191 | B8581ADB1B63D46D00DE9AE6 = { 192 | CreatedOnToolsVersion = 6.3.2; 193 | }; 194 | B8581AF01B63D46E00DE9AE6 = { 195 | CreatedOnToolsVersion = 6.3.2; 196 | TestTargetID = B8581ADB1B63D46D00DE9AE6; 197 | }; 198 | }; 199 | }; 200 | buildConfigurationList = B8581AD71B63D46D00DE9AE6 /* Build configuration list for PBXProject "HowToCustomAnimateCellHeight" */; 201 | compatibilityVersion = "Xcode 3.2"; 202 | developmentRegion = English; 203 | hasScannedForEncodings = 0; 204 | knownRegions = ( 205 | en, 206 | Base, 207 | ); 208 | mainGroup = B8581AD31B63D46D00DE9AE6; 209 | productRefGroup = B8581ADD1B63D46D00DE9AE6 /* Products */; 210 | projectDirPath = ""; 211 | projectRoot = ""; 212 | targets = ( 213 | B8581ADB1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight */, 214 | B8581AF01B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests */, 215 | ); 216 | }; 217 | /* End PBXProject section */ 218 | 219 | /* Begin PBXResourcesBuildPhase section */ 220 | B8581ADA1B63D46D00DE9AE6 /* Resources */ = { 221 | isa = PBXResourcesBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | B8581AE71B63D46E00DE9AE6 /* Main.storyboard in Resources */, 225 | B8581AEC1B63D46E00DE9AE6 /* LaunchScreen.xib in Resources */, 226 | B8581B0E1B64DF1C00DE9AE6 /* ionicons.ttf in Resources */, 227 | B8581AE91B63D46E00DE9AE6 /* Images.xcassets in Resources */, 228 | ); 229 | runOnlyForDeploymentPostprocessing = 0; 230 | }; 231 | B8581AEF1B63D46E00DE9AE6 /* Resources */ = { 232 | isa = PBXResourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | /* End PBXResourcesBuildPhase section */ 239 | 240 | /* Begin PBXSourcesBuildPhase section */ 241 | B8581AD81B63D46D00DE9AE6 /* Sources */ = { 242 | isa = PBXSourcesBuildPhase; 243 | buildActionMask = 2147483647; 244 | files = ( 245 | B8581B021B643EA800DE9AE6 /* TableViewCell.swift in Sources */, 246 | B8581B0D1B64DF1C00DE9AE6 /* Ionicons.swift in Sources */, 247 | B8581B0C1B64DF1C00DE9AE6 /* IonIcons.m in Sources */, 248 | B8581B0F1B64DF1C00DE9AE6 /* README.md in Sources */, 249 | B8581AE41B63D46E00DE9AE6 /* ViewController.swift in Sources */, 250 | B8581AE21B63D46D00DE9AE6 /* AppDelegate.swift in Sources */, 251 | B8581B041B6455C900DE9AE6 /* DetailViewController.swift in Sources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | B8581AED1B63D46E00DE9AE6 /* Sources */ = { 256 | isa = PBXSourcesBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | B8581AF81B63D46E00DE9AE6 /* HowToCustomAnimateCellHeightTests.swift in Sources */, 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | /* End PBXSourcesBuildPhase section */ 264 | 265 | /* Begin PBXTargetDependency section */ 266 | B8581AF31B63D46E00DE9AE6 /* PBXTargetDependency */ = { 267 | isa = PBXTargetDependency; 268 | target = B8581ADB1B63D46D00DE9AE6 /* HowToCustomAnimateCellHeight */; 269 | targetProxy = B8581AF21B63D46E00DE9AE6 /* PBXContainerItemProxy */; 270 | }; 271 | /* End PBXTargetDependency section */ 272 | 273 | /* Begin PBXVariantGroup section */ 274 | B8581AE51B63D46E00DE9AE6 /* Main.storyboard */ = { 275 | isa = PBXVariantGroup; 276 | children = ( 277 | B8581AE61B63D46E00DE9AE6 /* Base */, 278 | ); 279 | name = Main.storyboard; 280 | sourceTree = ""; 281 | }; 282 | B8581AEA1B63D46E00DE9AE6 /* LaunchScreen.xib */ = { 283 | isa = PBXVariantGroup; 284 | children = ( 285 | B8581AEB1B63D46E00DE9AE6 /* Base */, 286 | ); 287 | name = LaunchScreen.xib; 288 | sourceTree = ""; 289 | }; 290 | /* End PBXVariantGroup section */ 291 | 292 | /* Begin XCBuildConfiguration section */ 293 | B8581AF91B63D46E00DE9AE6 /* Debug */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ALWAYS_SEARCH_USER_PATHS = NO; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_CONSTANT_CONVERSION = YES; 303 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_UNREACHABLE_CODE = YES; 309 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 311 | COPY_PHASE_STRIP = NO; 312 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 313 | ENABLE_STRICT_OBJC_MSGSEND = YES; 314 | GCC_C_LANGUAGE_STANDARD = gnu99; 315 | GCC_DYNAMIC_NO_PIC = NO; 316 | GCC_NO_COMMON_BLOCKS = YES; 317 | GCC_OPTIMIZATION_LEVEL = 0; 318 | GCC_PREPROCESSOR_DEFINITIONS = ( 319 | "DEBUG=1", 320 | "$(inherited)", 321 | ); 322 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 323 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 324 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 325 | GCC_WARN_UNDECLARED_SELECTOR = YES; 326 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 327 | GCC_WARN_UNUSED_FUNCTION = YES; 328 | GCC_WARN_UNUSED_VARIABLE = YES; 329 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 330 | MTL_ENABLE_DEBUG_INFO = YES; 331 | ONLY_ACTIVE_ARCH = YES; 332 | SDKROOT = iphoneos; 333 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 334 | }; 335 | name = Debug; 336 | }; 337 | B8581AFA1B63D46E00DE9AE6 /* Release */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ALWAYS_SEARCH_USER_PATHS = NO; 341 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 342 | CLANG_CXX_LIBRARY = "libc++"; 343 | CLANG_ENABLE_MODULES = YES; 344 | CLANG_ENABLE_OBJC_ARC = YES; 345 | CLANG_WARN_BOOL_CONVERSION = YES; 346 | CLANG_WARN_CONSTANT_CONVERSION = YES; 347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 348 | CLANG_WARN_EMPTY_BODY = YES; 349 | CLANG_WARN_ENUM_CONVERSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 352 | CLANG_WARN_UNREACHABLE_CODE = YES; 353 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 354 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 355 | COPY_PHASE_STRIP = NO; 356 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 357 | ENABLE_NS_ASSERTIONS = NO; 358 | ENABLE_STRICT_OBJC_MSGSEND = YES; 359 | GCC_C_LANGUAGE_STANDARD = gnu99; 360 | GCC_NO_COMMON_BLOCKS = YES; 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 368 | MTL_ENABLE_DEBUG_INFO = NO; 369 | SDKROOT = iphoneos; 370 | VALIDATE_PRODUCT = YES; 371 | }; 372 | name = Release; 373 | }; 374 | B8581AFC1B63D46E00DE9AE6 /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 378 | INFOPLIST_FILE = HowToCustomAnimateCellHeight/Info.plist; 379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 380 | PRODUCT_NAME = "$(TARGET_NAME)"; 381 | }; 382 | name = Debug; 383 | }; 384 | B8581AFD1B63D46E00DE9AE6 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | INFOPLIST_FILE = HowToCustomAnimateCellHeight/Info.plist; 389 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | }; 392 | name = Release; 393 | }; 394 | B8581AFF1B63D46E00DE9AE6 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | BUNDLE_LOADER = "$(TEST_HOST)"; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(SDKROOT)/Developer/Library/Frameworks", 400 | "$(inherited)", 401 | ); 402 | GCC_PREPROCESSOR_DEFINITIONS = ( 403 | "DEBUG=1", 404 | "$(inherited)", 405 | ); 406 | INFOPLIST_FILE = HowToCustomAnimateCellHeightTests/Info.plist; 407 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 408 | PRODUCT_NAME = "$(TARGET_NAME)"; 409 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HowToCustomAnimateCellHeight.app/HowToCustomAnimateCellHeight"; 410 | }; 411 | name = Debug; 412 | }; 413 | B8581B001B63D46E00DE9AE6 /* Release */ = { 414 | isa = XCBuildConfiguration; 415 | buildSettings = { 416 | BUNDLE_LOADER = "$(TEST_HOST)"; 417 | FRAMEWORK_SEARCH_PATHS = ( 418 | "$(SDKROOT)/Developer/Library/Frameworks", 419 | "$(inherited)", 420 | ); 421 | INFOPLIST_FILE = HowToCustomAnimateCellHeightTests/Info.plist; 422 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HowToCustomAnimateCellHeight.app/HowToCustomAnimateCellHeight"; 425 | }; 426 | name = Release; 427 | }; 428 | /* End XCBuildConfiguration section */ 429 | 430 | /* Begin XCConfigurationList section */ 431 | B8581AD71B63D46D00DE9AE6 /* Build configuration list for PBXProject "HowToCustomAnimateCellHeight" */ = { 432 | isa = XCConfigurationList; 433 | buildConfigurations = ( 434 | B8581AF91B63D46E00DE9AE6 /* Debug */, 435 | B8581AFA1B63D46E00DE9AE6 /* Release */, 436 | ); 437 | defaultConfigurationIsVisible = 0; 438 | defaultConfigurationName = Release; 439 | }; 440 | B8581AFB1B63D46E00DE9AE6 /* Build configuration list for PBXNativeTarget "HowToCustomAnimateCellHeight" */ = { 441 | isa = XCConfigurationList; 442 | buildConfigurations = ( 443 | B8581AFC1B63D46E00DE9AE6 /* Debug */, 444 | B8581AFD1B63D46E00DE9AE6 /* Release */, 445 | ); 446 | defaultConfigurationIsVisible = 0; 447 | defaultConfigurationName = Release; 448 | }; 449 | B8581AFE1B63D46E00DE9AE6 /* Build configuration list for PBXNativeTarget "HowToCustomAnimateCellHeightTests" */ = { 450 | isa = XCConfigurationList; 451 | buildConfigurations = ( 452 | B8581AFF1B63D46E00DE9AE6 /* Debug */, 453 | B8581B001B63D46E00DE9AE6 /* Release */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | /* End XCConfigurationList section */ 459 | }; 460 | rootObject = B8581AD41B63D46D00DE9AE6 /* Project object */; 461 | } 462 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/project.xcworkspace/xcuserdata/lucasilvestro.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armaluca/iOS-App-Store-Explore-Section-Animation/ce87202276c56d4835869a0ab7257ed96c9d03d7/HowToCustomAnimateCellHeight.xcodeproj/project.xcworkspace/xcuserdata/lucasilvestro.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/project.xcworkspace/xcuserdata/lucasilvestro.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/xcuserdata/lucasilvestro.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 34 | 35 | 36 | 38 | 50 | 51 | 52 | 54 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/xcuserdata/lucasilvestro.xcuserdatad/xcschemes/HowToCustomAnimateCellHeight.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight.xcodeproj/xcuserdata/lucasilvestro.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | HowToCustomAnimateCellHeight.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B8581ADB1B63D46D00DE9AE6 16 | 17 | primary 18 | 19 | 20 | B8581AF01B63D46E00DE9AE6 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // HowToCustomAnimateCellHeight 4 | // 5 | // Created by luca silvestro on 25/07/15. 6 | // Copyright (c) 2015 luca silvestro. All rights reserved. 7 | // luca.silvestro@gmail.com 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: [NSObject: AnyObject]?) -> 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 throttle down OpenGL ES frame rates. 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 inactive 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 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/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 | 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 | 116 | 117 | 118 | 119 | 120 | 136 | 152 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // HowToCustomAnimateCellHeight 4 | // 5 | // Created by luca silvestro on 26/07/15. 6 | // Copyright (c) 2015 luca silvestro. All rights reserved. 7 | // luca.silvestro@gmail.com 8 | 9 | import UIKit 10 | 11 | class DetailViewController: UIViewController { 12 | 13 | @IBOutlet weak var blurredView: UIVisualEffectView! 14 | @IBAction func clickedButton(sender: UIButton) { 15 | self.buttonCLickedCompletion() 16 | } 17 | @IBOutlet weak var titleLabel: UILabel! 18 | @IBOutlet weak var headerView: UIView! 19 | @IBOutlet weak var dismissButton: UIButton! 20 | @IBOutlet weak var fakeCellLabel: UILabel! 21 | @IBOutlet weak var opacityView: UIView! 22 | @IBOutlet weak var dismissIcon: UIButton! 23 | @IBOutlet var viewcontainer: UIView! 24 | var buttonCLickedCompletion:(Void)->Void 25 | 26 | 27 | required init(coder aDecoder: NSCoder) { 28 | self.buttonCLickedCompletion = {Void in Void} 29 | super.init(coder: aDecoder) 30 | } 31 | 32 | override func viewDidLoad() { 33 | super.viewDidLoad() 34 | println("title passed: \(title)") 35 | self.fakeCellLabel.text = title 36 | self.titleLabel.text = title 37 | self.opacityView.setTranslatesAutoresizingMaskIntoConstraints(true) 38 | let image = UIImage.imageWithIonIcon(.chevron_down, height: 22, color: UIColor.blueColor()) 39 | dismissIcon.setImage(image, forState: UIControlState.Normal) 40 | dismissIcon.setTitle("", forState: UIControlState.Normal) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/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" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIAppFonts 6 | 7 | ionicons.ttf 8 | 9 | UIViewControllerBasedStatusBarAppearance 10 | 11 | CFBundleDevelopmentRegion 12 | en 13 | CFBundleExecutable 14 | $(EXECUTABLE_NAME) 15 | CFBundleIdentifier 16 | com.lucasilvestro.$(PRODUCT_NAME:rfc1034identifier) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | $(PRODUCT_NAME) 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 1.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1 29 | LSRequiresIPhoneOS 30 | 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | UIMainStoryboardFile 34 | Main 35 | UIRequiredDeviceCapabilities 36 | 37 | armv7 38 | 39 | UISupportedInterfaceOrientations 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationLandscapeLeft 43 | UIInterfaceOrientationLandscapeRight 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/TableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableViewCell.swift 3 | // HowToCustomAnimateCellHeight 4 | // 5 | // Created by luca silvestro on 25/07/15. 6 | // Copyright (c) 2015 luca silvestro. All rights reserved. 7 | // luca.silvestro@gmail.com 8 | 9 | import UIKit 10 | 11 | class TableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var title: UILabel! 14 | @IBOutlet weak var headerView: UIView! 15 | override func awakeFromNib() { 16 | super.awakeFromNib() 17 | // Initialization code 18 | } 19 | 20 | override func setSelected(selected: Bool, animated: Bool) { 21 | super.setSelected(selected, animated: animated) 22 | 23 | // Configure the view for the selected state 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // HowToCustomAnimateCellHeight 4 | // 5 | // Created by luca silvestro on 25/07/15. 6 | // Copyright (c) 2015 luca silvestro. All rights reserved. 7 | // luca.silvestro@gmail.com 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource { 12 | 13 | @IBOutlet weak var tableview: UITableView! 14 | var selectedCellIndexPath:NSIndexPath? 15 | var visibleCells:NSMutableArray = NSMutableArray.new() 16 | var detailVC:DetailViewController? 17 | var sectionTitles:[String]? 18 | var titleView = UIView() 19 | var titleLabel = UILabel() 20 | var isNavigationBarCollapsed = false 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | sectionTitles = ["Books", "Business", "Catalogues", "Entertainment", "Finance", "Food & Drink", "Games", "Health & Fitness", "Kids", "Lifestyle", "Medical", "Music", "Navigation", "News", "Newsstand", "Photo & video", "Productivity","Reference", "Social Networking"] 25 | tableview.estimatedRowHeight = 44.0 26 | tableview.rowHeight = UITableViewAutomaticDimension 27 | tableview?.contentInset = UIEdgeInsets(top: 64, left: 0, bottom: 0, right: 0) 28 | setupUI() 29 | } 30 | 31 | func setupUI(){ 32 | func setupNavUI(){ 33 | let widthTitleView:CGFloat = 150.0 34 | let originYTitleView = (CGRectGetWidth(view.bounds) - widthTitleView) / 2 35 | titleView = UIView(frame: CGRectMake(originYTitleView, 0.0, widthTitleView, self.navigationController!.navigationBar.frame.size.height)) 36 | self.navigationController?.navigationBar.addSubview(titleView) 37 | 38 | titleLabel.text = "Explore" 39 | titleLabel.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(titleView.frame), CGRectGetHeight(titleView.frame)) 40 | titleLabel.font = UIFont.systemFontOfSize(16.0) 41 | titleLabel.textAlignment = NSTextAlignment.Center 42 | titleLabel.layer.anchorPoint = CGPointMake(0.5, 0.5) 43 | titleLabel.autoresizingMask = UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleBottomMargin 44 | titleView.addSubview(titleLabel) 45 | } 46 | setupNavUI() 47 | } 48 | 49 | func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 50 | var cell = tableView.dequeueReusableCellWithIdentifier("Identifier") as! TableViewCell 51 | cell.title?.text = sectionTitles![indexPath.row] 52 | cell.contentView.backgroundColor = UIColor.lightGrayColor() 53 | cell.headerView.backgroundColor = UIColor.whiteColor() 54 | cell.selectionStyle = UITableViewCellSelectionStyle.None 55 | return cell 56 | } 57 | 58 | func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 59 | return sectionTitles!.count 60 | } 61 | 62 | func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 63 | /* If didselect a row and there's already an expanded cell collapse it */ 64 | if let unwrap_selectedCellIndexPath = selectedCellIndexPath { 65 | toggleCell(unwrap_selectedCellIndexPath, wantsToExpand: false) 66 | } 67 | /* Expand the cell */ 68 | else { 69 | selectedCellIndexPath = indexPath 70 | toggleCell(indexPath, wantsToExpand: true) 71 | } 72 | } 73 | 74 | func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 75 | if indexPath.row == selectedCellIndexPath?.row { 76 | return self.tableview.frame.size.height 77 | } 78 | else { 79 | return tableview.estimatedRowHeight 80 | } 81 | } 82 | 83 | func toggleCell(indexPath:NSIndexPath, wantsToExpand:Bool) { 84 | toggleNavigationBar(!isNavigationBarCollapsed) 85 | if wantsToExpand { 86 | if detailVC == nil { 87 | detailVC = storyboard?.instantiateViewControllerWithIdentifier("DetailVC") as? DetailViewController 88 | detailVC?.title = sectionTitles![selectedCellIndexPath!.row] 89 | } 90 | addChildViewController(detailVC!) 91 | detailVC?.didMoveToParentViewController(self) 92 | var rectSelectedRow = tableview.rectForRowAtIndexPath(selectedCellIndexPath!) 93 | detailVC?.view.frame = CGRectMake(CGRectGetMinX(rectSelectedRow), CGRectGetMinY(rectSelectedRow) + 64.0, CGRectGetWidth(rectSelectedRow), CGRectGetHeight(rectSelectedRow)) 94 | detailVC?.dismissIcon.alpha = 0.0 95 | detailVC?.titleLabel.alpha = 0.0 96 | detailVC?.opacityView.alpha = 1.0 97 | detailVC?.view.clipsToBounds = true 98 | detailVC?.buttonCLickedCompletion = {Void in 99 | self.toggleCell(self.selectedCellIndexPath!, wantsToExpand: false) 100 | } 101 | view.addSubview(detailVC!.view) 102 | UIView.animateWithDuration(0.4, delay: 0.2, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in 103 | for item in self.tableview.visibleCells() { 104 | var cell = item as! UITableViewCell 105 | var cellIndexPath = self.tableview.indexPathForCell(cell) 106 | /* move down the cells below selected one */ 107 | if cellIndexPath!.row > indexPath.row { 108 | var frame:CGRect = cell.frame 109 | frame.origin.y += self.tableview.frame.size.height - self.tableview.estimatedRowHeight * CGFloat(indexPath.row) - self.tableview.estimatedRowHeight - 64.0 110 | cell.frame = frame 111 | } 112 | /* move up the cells above selected one (included selected one) */ 113 | else { 114 | var frame = cell.frame 115 | frame.origin.y -= self.tableview.estimatedRowHeight * CGFloat(indexPath.row) + 64.0 - 42.0 116 | cell.frame = frame 117 | } 118 | 119 | /* add the cells to visibleCells array*/ 120 | self.visibleCells.addObject(cellIndexPath!) 121 | } 122 | /* move up even the frame of detailVC*/ 123 | var frame = self.detailVC!.view.frame 124 | //frame.origin.y -= self.tableview.estimatedRowHeight * CGFloat(indexPath.row) 125 | frame.size.height = frame.size.height - 44.0 126 | self.detailVC?.headerView.backgroundColor = UIColor.clearColor() 127 | self.detailVC!.view.frame = frame 128 | /* animate alpha detailVC label and button and opacity */ 129 | self.detailVC?.dismissIcon.alpha = 1.0 130 | self.detailVC?.titleLabel.alpha = 1.0 131 | self.detailVC?.fakeCellLabel.alpha = 0.0 132 | self.detailVC?.opacityView.alpha = 0.0 133 | /* expand selected cell */ 134 | var cellSelected = self.tableview.cellForRowAtIndexPath(indexPath) 135 | var frameCellExpanded = cellSelected!.frame 136 | frameCellExpanded.size.height = self.tableview.frame.size.height - 44.0 137 | cellSelected?.frame = frameCellExpanded 138 | frameCellExpanded.origin.y += 64.0 139 | self.detailVC!.view.frame = frameCellExpanded 140 | return 141 | }) { 142 | (isFinished) -> Void in 143 | return 144 | } 145 | } 146 | else{ 147 | UIView.animateWithDuration(0.4, delay: 0.1, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in 148 | for item in self.visibleCells { 149 | var cell = self.tableview.cellForRowAtIndexPath(item as! NSIndexPath) as! TableViewCell 150 | var cellIndexPath = self.tableview.indexPathForCell(cell) 151 | /* move up the cells below selected one */ 152 | if cellIndexPath!.row > indexPath.row { 153 | var frame:CGRect = cell.frame 154 | frame.origin.y -= self.tableview.frame.size.height - self.tableview.estimatedRowHeight * CGFloat(indexPath.row) - self.tableview.estimatedRowHeight - 64.0 155 | cell.frame = frame 156 | } 157 | /* move down the cells above selected one (included selected one) */ 158 | else { 159 | var frame = cell.frame 160 | frame.origin.y += self.tableview.estimatedRowHeight * CGFloat(indexPath.row) + 22.0 161 | cell.frame = frame 162 | } 163 | } 164 | 165 | /* move up even the frame of detailVC*/ 166 | var frame = self.detailVC!.view.frame 167 | frame.origin.y += self.tableview.estimatedRowHeight * CGFloat(indexPath.row) 168 | self.detailVC!.view.frame = frame 169 | self.detailVC?.headerView.backgroundColor = UIColor.whiteColor() 170 | /* animate alpha detailVC label and button and opacity */ 171 | self.detailVC?.dismissIcon.alpha = 0.0 172 | self.detailVC?.titleLabel.alpha = 0.0 173 | self.detailVC?.fakeCellLabel.alpha = 1.0 174 | self.detailVC?.opacityView.alpha = 1.0 175 | /* collapse selected cell */ 176 | var cellSelected = self.tableview.cellForRowAtIndexPath(indexPath) 177 | var frameCellExpanded = cellSelected!.frame 178 | frameCellExpanded.size.height = 44.0 179 | cellSelected?.frame = frameCellExpanded 180 | frameCellExpanded.origin.y += 64.0 181 | self.detailVC!.view.frame = frameCellExpanded 182 | self.detailVC?.opacityView.layer.borderColor = UIColor.yellowColor().CGColor 183 | self.detailVC?.opacityView.layer.borderWidth = 2.0 184 | 185 | return 186 | }) { 187 | (isFinished) -> Void in 188 | self.tableview.reloadData() 189 | self.selectedCellIndexPath = nil 190 | self.visibleCells.removeAllObjects() 191 | ((self.childViewControllers[0] as! UIViewController).view).removeFromSuperview() 192 | self.childViewControllers[0].removeFromParentViewController() 193 | self.detailVC = nil 194 | 195 | return 196 | } 197 | } 198 | } 199 | 200 | func animateNavbar(#isExpanding:Bool){ 201 | UIView.animateWithDuration(2, animations: { () -> Void in 202 | var frame:CGRect? = self.navigationController?.navigationBar.frame 203 | var frameTitle = self.navigationItem.titleView?.bounds 204 | var trans:CGPoint = CGPointZero 205 | 206 | if isExpanding { 207 | frame?.size.height = frame!.size.height*2 208 | frameTitle?.size.height = 44.0 209 | frameTitle?.size.width = 150.0 210 | trans = CGPoint(x: 2, y: 2) 211 | } 212 | else { 213 | frame?.size.height = frame!.size.height/2 214 | frameTitle?.size.height = frame!.size.height 215 | frameTitle?.size.width = 150.0/2 216 | trans = CGPoint(x: 0.5, y: 0.5) 217 | } 218 | self.navigationItem.titleView?.transform = CGAffineTransformScale(self.navigationItem.titleView!.transform, trans.x, trans.y); 219 | self.navigationItem.titleView?.transform = CGAffineTransformTranslate(self.navigationItem.titleView!.transform, self.navigationController!.navigationBar.frame.size.width / 2, 0.0); 220 | self.navigationItem.titleView?.bounds = frameTitle! 221 | self.navigationController?.navigationBar.frame = frame! 222 | }) 223 | } 224 | 225 | func toggleNavigationBar(hasToCollapse: Bool){ 226 | var frame:CGRect? = self.navigationController?.navigationBar.frame 227 | var frameTitle = titleView.frame 228 | var scaleFactor = frame!.size.height / 44.0 229 | var frameSizeHeightBeforeUpdate = frame!.size.height 230 | 231 | if hasToCollapse { 232 | titleLabel.transform = CGAffineTransformScale(titleLabel.transform, 1.0, 1.0) 233 | [UIView .animateWithDuration(0.4, delay: 0.1, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in 234 | frame?.size.height = 22.0 235 | frameTitle.size.height = 22.0 236 | frameTitle.origin.y = 0 237 | self.navigationController?.navigationBar.frame = frame! 238 | self.titleView.frame = frameTitle 239 | self.titleLabel.transform = CGAffineTransformScale(self.titleLabel.transform, 22.0 / frameSizeHeightBeforeUpdate, 22.0 / frameSizeHeightBeforeUpdate) 240 | }, completion: { (completed) -> Void in 241 | self.isNavigationBarCollapsed = true 242 | })]; 243 | } 244 | 245 | if !hasToCollapse { 246 | [UIView .animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in 247 | frame?.size.height = 44.0 248 | frameTitle.size.height = 44.0 249 | frameTitle.origin.y = 0 250 | self.navigationController?.navigationBar.frame = frame! 251 | self.titleView.frame = frameTitle 252 | self.titleLabel.transform = CGAffineTransformScale(self.titleLabel.transform, 44.0 / frameSizeHeightBeforeUpdate, 44.0 / frameSizeHeightBeforeUpdate) 253 | }, completion: { (completed) -> Void in 254 | self.isNavigationBarCollapsed = false 255 | })]; 256 | } 257 | } 258 | 259 | override func prefersStatusBarHidden() -> Bool { 260 | return false 261 | } 262 | } 263 | 264 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ionicons.swift/IonIcons.h: -------------------------------------------------------------------------------- 1 | // 2 | // IonIcons.h 3 | // ionicons-iOS is Copyright 2013 TapTemplate and released under the MIT license. 4 | // http://www.taptemplate.com 5 | // ========================== 6 | // 7 | 8 | #import 9 | 10 | //#import "ionicons-codes.h" 11 | 12 | @interface IonIcons : NSObject 13 | 14 | //================================ 15 | // Font and Label Methods 16 | //================================ 17 | 18 | /*! Convenience method to get the ionicons font. 19 | */ 20 | + (UIFont*)fontWithSize:(CGFloat)size; 21 | 22 | /*! Convenience method to make a sized-to-fit UILabel containing an icon in the given font size and color. 23 | */ 24 | + (UILabel*)labelWithIcon:(NSString*)icon_name 25 | size:(CGFloat)size 26 | color:(UIColor*)color; 27 | 28 | /*! Adjust an existing UILabel to show an ionicon. 29 | */ 30 | + (void)label:(UILabel*)label 31 | setIcon:(NSString*)icon_name 32 | size:(CGFloat)size 33 | color:(UIColor*)color 34 | sizeToFit:(BOOL)shouldSizeToFit; 35 | 36 | //================================ 37 | // Image Methods 38 | //================================ 39 | 40 | /*! Create a UIImage of an ionocin, making the image and the icon the same size: 41 | */ 42 | + (UIImage*)imageWithIcon:(NSString*)icon_name 43 | size:(CGFloat)size 44 | color:(UIColor*)color; 45 | 46 | /*! Create a UIImage of an ionocin, and specify different sizes for the image and the icon: 47 | */ 48 | + (UIImage*)imageWithIcon:(NSString*)icon_name 49 | iconColor:(UIColor*)color 50 | iconSize:(CGFloat)iconSize 51 | imageSize:(CGSize)imageSize; 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ionicons.swift/IonIcons.m: -------------------------------------------------------------------------------- 1 | // 2 | // IonIcons.m 3 | // ionicons-iOS is Copyright 2013 TapTemplate and released under the MIT license. 4 | // http://www.taptemplate.com 5 | // ========================== 6 | // 7 | 8 | #import "IonIcons.h" 9 | #import 10 | //#import "FontInspector.h" 11 | 12 | @implementation IonIcons 13 | 14 | 15 | //================================ 16 | // Font and Label Methods 17 | //================================ 18 | 19 | + (UIFont*)fontWithSize:(CGFloat)size; 20 | { 21 | UIFont* font = [UIFont fontWithName:@"ionicons" size:size]; 22 | NSAssert(font, @"Make sure you've added the font to the Info.plist first! View README.md for instructions."); 23 | return font; 24 | } 25 | 26 | + (UILabel*)labelWithIcon:(NSString*)icon_name 27 | size:(CGFloat)size 28 | color:(UIColor*)color 29 | { 30 | UILabel *label = [[UILabel alloc] init]; 31 | [IonIcons label:label setIcon:icon_name size:size color:color sizeToFit:YES]; 32 | return label; 33 | } 34 | 35 | + (void)label:(UILabel*)label 36 | setIcon:(NSString*)icon_name 37 | size:(CGFloat)size 38 | color:(UIColor*)color 39 | sizeToFit:(BOOL)shouldSizeToFit 40 | { 41 | label.font = [IonIcons fontWithSize:size]; 42 | 43 | //[self checkGlyphsReferencedByString:icon_name existInFont:label.font]; 44 | 45 | label.text = icon_name; 46 | label.textColor = color; 47 | label.backgroundColor = [UIColor clearColor]; 48 | if (shouldSizeToFit) { 49 | [label sizeToFit]; 50 | } 51 | // NOTE: ionicons will be silent through VoiceOver, but the Label is still selectable through VoiceOver. This can cause a usability issue because a visually impaired user might navigate to the label but get no audible feedback that the navigation happened. So hide the label for VoiceOver by default - if your label should be descriptive, un-hide it explicitly after creating it, and then set its accessibiltyLabel. 52 | label.accessibilityElementsHidden = YES; 53 | } 54 | 55 | //================================ 56 | // Image Methods 57 | //================================ 58 | 59 | + (UIImage*)imageWithIcon:(NSString*)icon_name 60 | size:(CGFloat)size 61 | color:(UIColor*)color 62 | { 63 | return [IonIcons imageWithIcon:icon_name 64 | iconColor:color 65 | iconSize:size 66 | imageSize:CGSizeMake(size, size)]; 67 | } 68 | 69 | + (UIImage*)imageWithIcon:(NSString*)icon_name 70 | iconColor:(UIColor*)iconColor 71 | iconSize:(CGFloat)iconSize 72 | imageSize:(CGSize)imageSize; 73 | { 74 | UIFont *font = [IonIcons fontWithSize:iconSize]; 75 | UIImage *image = nil; 76 | if (font) { 77 | 78 | //[self checkGlyphsReferencedByString:icon_name existInFont:font]; 79 | 80 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6) { 81 | image = [self renderImageWithNSStirngDrawingWithIconName:icon_name 82 | iconColor:iconColor 83 | iconSize:iconSize 84 | imageSize:imageSize]; 85 | } else { 86 | #if DEBUG 87 | NSLog(@" [ IonIcons ] Using lower-res iOS 5-compatible image rendering."); 88 | #endif 89 | image = [self renderImageWithCoreGraphicsWithIconName:icon_name 90 | iconColor:iconColor 91 | iconSize:iconSize 92 | imageSize:imageSize]; 93 | } 94 | } 95 | return image; 96 | } 97 | 98 | /* 99 | + (BOOL)checkGlyphsReferencedByString:(NSString*)string existInFont:(UIFont*)font 100 | { 101 | BOOL exists = [FontInspector doGlyphsReferencedInString:string existInFont:font]; 102 | if (!exists) { 103 | #if DEBUG 104 | NSLog(@"[ IonIcons.m ] WARNING: You attempted to use an icon_name '%@' does not exist in the font '%@'. Make sure that you are using the correct icon_name value from ionicons-codes.h", 105 | string, font.fontName); 106 | #endif 107 | } 108 | return exists; 109 | } 110 | */ 111 | 112 | + (UIImage*)renderImageWithNSStirngDrawingWithIconName:(NSString*)icon_name iconColor:(UIColor*)iconColor iconSize:(CGFloat)iconSize imageSize:(CGSize)imageSize 113 | { 114 | if (!iconColor) { iconColor = [self defaultColor]; } 115 | 116 | NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; 117 | style.alignment = NSTextAlignmentLeft; 118 | style.baseWritingDirection = NSWritingDirectionLeftToRight; 119 | 120 | UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0); 121 | NSAttributedString* attString = [[NSAttributedString alloc] 122 | initWithString:icon_name 123 | attributes:@{NSFontAttributeName: [IonIcons fontWithSize:iconSize], 124 | NSForegroundColorAttributeName : iconColor, 125 | NSParagraphStyleAttributeName : style}]; 126 | // get the target bounding rect in order to center the icon within the UIImage: 127 | NSStringDrawingContext *ctx = [[NSStringDrawingContext alloc] init]; 128 | CGRect boundingRect = [attString boundingRectWithSize:CGSizeMake(iconSize, iconSize) options:0 context:ctx]; 129 | // draw the icon string into the image: 130 | [attString drawInRect:CGRectMake((imageSize.width/2.0f) - boundingRect.size.width/2.0f, 131 | (imageSize.height/2.0f) - boundingRect.size.height/2.0f, 132 | imageSize.width, 133 | imageSize.height)]; 134 | UIImage *iconImage = UIGraphicsGetImageFromCurrentImageContext(); 135 | UIGraphicsEndImageContext(); 136 | if (iconColor && 137 | [iconImage respondsToSelector:@selector(imageWithRenderingMode:)]) { 138 | iconImage = [iconImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 139 | } 140 | return iconImage; 141 | } 142 | 143 | + (UIImage*)renderImageWithCoreGraphicsWithIconName:(NSString*)icon_name iconColor:(UIColor*)iconColor iconSize:(CGFloat)iconSize imageSize:(CGSize)imageSize 144 | { 145 | UILabel *iconLabel = [IonIcons labelWithIcon:icon_name size:iconSize color:iconColor]; 146 | UIImage *iconImage = nil; 147 | UIGraphicsBeginImageContextWithOptions(imageSize, NO, 1.0); 148 | { 149 | CGContextRef imageContext = UIGraphicsGetCurrentContext(); 150 | if (imageContext != NULL) { 151 | UIGraphicsPushContext(imageContext); 152 | { 153 | CGContextTranslateCTM(imageContext, 154 | (imageSize.width/2.0f) - iconLabel.frame.size.width/2.0f, 155 | (imageSize.height/2.0f) - iconLabel.frame.size.height/2.0f); 156 | [[iconLabel layer] renderInContext: imageContext]; 157 | } 158 | UIGraphicsPopContext(); 159 | } 160 | iconImage = UIGraphicsGetImageFromCurrentImageContext(); 161 | } 162 | UIGraphicsEndImageContext(); 163 | return iconImage; 164 | } 165 | 166 | + (UIColor*)defaultColor 167 | { 168 | return [UIColor blackColor]; 169 | } 170 | 171 | @end 172 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ionicons.swift/Ionicons.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Ionicons.swift 3 | // example-ionicons 4 | // 5 | // Created by Reeonce Zeng on 5/24/15. 6 | // Copyright (c) 2015 reeonce. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | public enum Ionicons: String { 13 | case alert = "\u{f101}" 14 | case alert_circled = "\u{f100}" 15 | case android_add = "\u{f2c7}" 16 | case android_add_circle = "\u{f359}" 17 | case android_alarm_clock = "\u{f35a}" 18 | case android_alert = "\u{f35b}" 19 | case android_apps = "\u{f35c}" 20 | case android_archive = "\u{f2c9}" 21 | case android_arrow_back = "\u{f2ca}" 22 | case android_arrow_down = "\u{f35d}" 23 | case android_arrow_dropdown = "\u{f35f}" 24 | case android_arrow_dropdown_circle = "\u{f35e}" 25 | case android_arrow_dropleft = "\u{f361}" 26 | case android_arrow_dropleft_circle = "\u{f360}" 27 | case android_arrow_dropright = "\u{f363}" 28 | case android_arrow_dropright_circle = "\u{f362}" 29 | case android_arrow_dropup = "\u{f365}" 30 | case android_arrow_dropup_circle = "\u{f364}" 31 | case android_arrow_forward = "\u{f30f}" 32 | case android_arrow_up = "\u{f366}" 33 | case android_attach = "\u{f367}" 34 | case android_bar = "\u{f368}" 35 | case android_bicycle = "\u{f369}" 36 | case android_boat = "\u{f36a}" 37 | case android_bookmark = "\u{f36b}" 38 | case android_bulb = "\u{f36c}" 39 | case android_bus = "\u{f36d}" 40 | case android_calendar = "\u{f2d1}" 41 | case android_call = "\u{f2d2}" 42 | case android_camera = "\u{f2d3}" 43 | case android_cancel = "\u{f36e}" 44 | case android_car = "\u{f36f}" 45 | case android_cart = "\u{f370}" 46 | case android_chat = "\u{f2d4}" 47 | case android_checkbox = "\u{f374}" 48 | case android_checkbox_blank = "\u{f371}" 49 | case android_checkbox_outline = "\u{f373}" 50 | case android_checkbox_outline_blank = "\u{f372}" 51 | case android_checkmark_circle = "\u{f375}" 52 | case android_clipboard = "\u{f376}" 53 | case android_close = "\u{f2d7}" 54 | case android_cloud = "\u{f37a}" 55 | case android_cloud_circle = "\u{f377}" 56 | case android_cloud_done = "\u{f378}" 57 | case android_cloud_outline = "\u{f379}" 58 | case android_color_palette = "\u{f37b}" 59 | case android_compass = "\u{f37c}" 60 | case android_contact = "\u{f2d8}" 61 | case android_contacts = "\u{f2d9}" 62 | case android_contract = "\u{f37d}" 63 | case android_create = "\u{f37e}" 64 | case android_delete = "\u{f37f}" 65 | case android_desktop = "\u{f380}" 66 | case android_document = "\u{f381}" 67 | case android_done = "\u{f383}" 68 | case android_done_all = "\u{f382}" 69 | case android_download = "\u{f2dd}" 70 | case android_drafts = "\u{f384}" 71 | case android_exit = "\u{f385}" 72 | case android_expand = "\u{f386}" 73 | case android_favorite = "\u{f388}" 74 | case android_favorite_outline = "\u{f387}" 75 | case android_film = "\u{f389}" 76 | case android_folder = "\u{f2e0}" 77 | case android_folder_open = "\u{f38a}" 78 | case android_funnel = "\u{f38b}" 79 | case android_globe = "\u{f38c}" 80 | case android_hand = "\u{f2e3}" 81 | case android_hangout = "\u{f38d}" 82 | case android_happy = "\u{f38e}" 83 | case android_home = "\u{f38f}" 84 | case android_image = "\u{f2e4}" 85 | case android_laptop = "\u{f390}" 86 | case android_list = "\u{f391}" 87 | case android_locate = "\u{f2e9}" 88 | case android_lock = "\u{f392}" 89 | case android_mail = "\u{f2eb}" 90 | case android_map = "\u{f393}" 91 | case android_menu = "\u{f394}" 92 | case android_microphone = "\u{f2ec}" 93 | case android_microphone_off = "\u{f395}" 94 | case android_more_horizontal = "\u{f396}" 95 | case android_more_vertical = "\u{f397}" 96 | case android_navigate = "\u{f398}" 97 | case android_notifications = "\u{f39b}" 98 | case android_notifications_none = "\u{f399}" 99 | case android_notifications_off = "\u{f39a}" 100 | case android_open = "\u{f39c}" 101 | case android_options = "\u{f39d}" 102 | case android_people = "\u{f39e}" 103 | case android_person = "\u{f3a0}" 104 | case android_person_add = "\u{f39f}" 105 | case android_phone_landscape = "\u{f3a1}" 106 | case android_phone_portrait = "\u{f3a2}" 107 | case android_pin = "\u{f3a3}" 108 | case android_plane = "\u{f3a4}" 109 | case android_playstore = "\u{f2f0}" 110 | case android_print = "\u{f3a5}" 111 | case android_radio_button_off = "\u{f3a6}" 112 | case android_radio_button_on = "\u{f3a7}" 113 | case android_refresh = "\u{f3a8}" 114 | case android_remove = "\u{f2f4}" 115 | case android_remove_circle = "\u{f3a9}" 116 | case android_restaurant = "\u{f3aa}" 117 | case android_sad = "\u{f3ab}" 118 | case android_search = "\u{f2f5}" 119 | case android_send = "\u{f2f6}" 120 | case android_settings = "\u{f2f7}" 121 | case android_share = "\u{f2f8}" 122 | case android_share_alt = "\u{f3ac}" 123 | case android_star = "\u{f2fc}" 124 | case android_star_half = "\u{f3ad}" 125 | case android_star_outline = "\u{f3ae}" 126 | case android_stopwatch = "\u{f2fd}" 127 | case android_subway = "\u{f3af}" 128 | case android_sunny = "\u{f3b0}" 129 | case android_sync = "\u{f3b1}" 130 | case android_textsms = "\u{f3b2}" 131 | case android_time = "\u{f3b3}" 132 | case android_train = "\u{f3b4}" 133 | case android_unlock = "\u{f3b5}" 134 | case android_upload = "\u{f3b6}" 135 | case android_volume_down = "\u{f3b7}" 136 | case android_volume_mute = "\u{f3b8}" 137 | case android_volume_off = "\u{f3b9}" 138 | case android_volume_up = "\u{f3ba}" 139 | case android_walk = "\u{f3bb}" 140 | case android_warning = "\u{f3bc}" 141 | case android_watch = "\u{f3bd}" 142 | case android_wifi = "\u{f305}" 143 | case aperture = "\u{f313}" 144 | case archive = "\u{f102}" 145 | case arrow_down_a = "\u{f103}" 146 | case arrow_down_b = "\u{f104}" 147 | case arrow_down_c = "\u{f105}" 148 | case arrow_expand = "\u{f25e}" 149 | case arrow_graph_down_left = "\u{f25f}" 150 | case arrow_graph_down_right = "\u{f260}" 151 | case arrow_graph_up_left = "\u{f261}" 152 | case arrow_graph_up_right = "\u{f262}" 153 | case arrow_left_a = "\u{f106}" 154 | case arrow_left_b = "\u{f107}" 155 | case arrow_left_c = "\u{f108}" 156 | case arrow_move = "\u{f263}" 157 | case arrow_resize = "\u{f264}" 158 | case arrow_return_left = "\u{f265}" 159 | case arrow_return_right = "\u{f266}" 160 | case arrow_right_a = "\u{f109}" 161 | case arrow_right_b = "\u{f10a}" 162 | case arrow_right_c = "\u{f10b}" 163 | case arrow_shrink = "\u{f267}" 164 | case arrow_swap = "\u{f268}" 165 | case arrow_up_a = "\u{f10c}" 166 | case arrow_up_b = "\u{f10d}" 167 | case arrow_up_c = "\u{f10e}" 168 | case asterisk = "\u{f314}" 169 | case at = "\u{f10f}" 170 | case backspace = "\u{f3bf}" 171 | case backspace_outline = "\u{f3be}" 172 | case bag = "\u{f110}" 173 | case battery_charging = "\u{f111}" 174 | case battery_empty = "\u{f112}" 175 | case battery_full = "\u{f113}" 176 | case battery_half = "\u{f114}" 177 | case battery_low = "\u{f115}" 178 | case beaker = "\u{f269}" 179 | case beer = "\u{f26a}" 180 | case bluetooth = "\u{f116}" 181 | case bonfire = "\u{f315}" 182 | case bookmark = "\u{f26b}" 183 | case bowtie = "\u{f3c0}" 184 | case briefcase = "\u{f26c}" 185 | case bug = "\u{f2be}" 186 | case calculator = "\u{f26d}" 187 | case calendar = "\u{f117}" 188 | case camera = "\u{f118}" 189 | case card = "\u{f119}" 190 | case cash = "\u{f316}" 191 | case chatbox = "\u{f11b}" 192 | case chatbox_working = "\u{f11a}" 193 | case chatboxes = "\u{f11c}" 194 | case chatbubble = "\u{f11e}" 195 | case chatbubble_working = "\u{f11d}" 196 | case chatbubbles = "\u{f11f}" 197 | case checkmark = "\u{f122}" 198 | case checkmark_circled = "\u{f120}" 199 | case checkmark_round = "\u{f121}" 200 | case chevron_down = "\u{f123}" 201 | case chevron_left = "\u{f124}" 202 | case chevron_right = "\u{f125}" 203 | case chevron_up = "\u{f126}" 204 | case clipboard = "\u{f127}" 205 | case clock = "\u{f26e}" 206 | case close = "\u{f12a}" 207 | case close_circled = "\u{f128}" 208 | case close_round = "\u{f129}" 209 | case closed_captioning = "\u{f317}" 210 | case cloud = "\u{f12b}" 211 | case code = "\u{f271}" 212 | case code_download = "\u{f26f}" 213 | case code_working = "\u{f270}" 214 | case coffee = "\u{f272}" 215 | case compass = "\u{f273}" 216 | case compose = "\u{f12c}" 217 | case connection_bars = "\u{f274}" 218 | case contrast = "\u{f275}" 219 | case crop = "\u{f3c1}" 220 | case cube = "\u{f318}" 221 | case disc = "\u{f12d}" 222 | case document = "\u{f12f}" 223 | case document_text = "\u{f12e}" 224 | case drag = "\u{f130}" 225 | case earth = "\u{f276}" 226 | case easel = "\u{f3c2}" 227 | case edit = "\u{f2bf}" 228 | case egg = "\u{f277}" 229 | case eject = "\u{f131}" 230 | case email = "\u{f132}" 231 | case email_unread = "\u{f3c3}" 232 | case erlenmeyer_flask = "\u{f3c5}" 233 | case erlenmeyer_flask_bubbles = "\u{f3c4}" 234 | case eye = "\u{f133}" 235 | case eye_disabled = "\u{f306}" 236 | case female = "\u{f278}" 237 | case filing = "\u{f134}" 238 | case film_marker = "\u{f135}" 239 | case fireball = "\u{f319}" 240 | case flag = "\u{f279}" 241 | case flame = "\u{f31a}" 242 | case flash = "\u{f137}" 243 | case flash_off = "\u{f136}" 244 | case folder = "\u{f139}" 245 | case fork = "\u{f27a}" 246 | case fork_repo = "\u{f2c0}" 247 | case forward = "\u{f13a}" 248 | case funnel = "\u{f31b}" 249 | case gear_a = "\u{f13d}" 250 | case gear_b = "\u{f13e}" 251 | case grid = "\u{f13f}" 252 | case hammer = "\u{f27b}" 253 | case happy = "\u{f31c}" 254 | case happy_outline = "\u{f3c6}" 255 | case headphone = "\u{f140}" 256 | case heart = "\u{f141}" 257 | case heart_broken = "\u{f31d}" 258 | case help = "\u{f143}" 259 | case help_buoy = "\u{f27c}" 260 | case help_circled = "\u{f142}" 261 | case home = "\u{f144}" 262 | case icecream = "\u{f27d}" 263 | case image = "\u{f147}" 264 | case images = "\u{f148}" 265 | case information = "\u{f14a}" 266 | case information_circled = "\u{f149}" 267 | case ionic = "\u{f14b}" 268 | case ios_alarm = "\u{f3c8}" 269 | case ios_alarm_outline = "\u{f3c7}" 270 | case ios_albums = "\u{f3ca}" 271 | case ios_albums_outline = "\u{f3c9}" 272 | case ios_americanfootball = "\u{f3cc}" 273 | case ios_americanfootball_outline = "\u{f3cb}" 274 | case ios_analytics = "\u{f3ce}" 275 | case ios_analytics_outline = "\u{f3cd}" 276 | case ios_arrow_back = "\u{f3cf}" 277 | case ios_arrow_down = "\u{f3d0}" 278 | case ios_arrow_forward = "\u{f3d1}" 279 | case ios_arrow_left = "\u{f3d2}" 280 | case ios_arrow_right = "\u{f3d3}" 281 | case ios_arrow_thin_down = "\u{f3d4}" 282 | case ios_arrow_thin_left = "\u{f3d5}" 283 | case ios_arrow_thin_right = "\u{f3d6}" 284 | case ios_arrow_thin_up = "\u{f3d7}" 285 | case ios_arrow_up = "\u{f3d8}" 286 | case ios_at = "\u{f3da}" 287 | case ios_at_outline = "\u{f3d9}" 288 | case ios_barcode = "\u{f3dc}" 289 | case ios_barcode_outline = "\u{f3db}" 290 | case ios_baseball = "\u{f3de}" 291 | case ios_baseball_outline = "\u{f3dd}" 292 | case ios_basketball = "\u{f3e0}" 293 | case ios_basketball_outline = "\u{f3df}" 294 | case ios_bell = "\u{f3e2}" 295 | case ios_bell_outline = "\u{f3e1}" 296 | case ios_body = "\u{f3e4}" 297 | case ios_body_outline = "\u{f3e3}" 298 | case ios_bolt = "\u{f3e6}" 299 | case ios_bolt_outline = "\u{f3e5}" 300 | case ios_book = "\u{f3e8}" 301 | case ios_book_outline = "\u{f3e7}" 302 | case ios_bookmarks = "\u{f3ea}" 303 | case ios_bookmarks_outline = "\u{f3e9}" 304 | case ios_box = "\u{f3ec}" 305 | case ios_box_outline = "\u{f3eb}" 306 | case ios_briefcase = "\u{f3ee}" 307 | case ios_briefcase_outline = "\u{f3ed}" 308 | case ios_browsers = "\u{f3f0}" 309 | case ios_browsers_outline = "\u{f3ef}" 310 | case ios_calculator = "\u{f3f2}" 311 | case ios_calculator_outline = "\u{f3f1}" 312 | case ios_calendar = "\u{f3f4}" 313 | case ios_calendar_outline = "\u{f3f3}" 314 | case ios_camera = "\u{f3f6}" 315 | case ios_camera_outline = "\u{f3f5}" 316 | case ios_cart = "\u{f3f8}" 317 | case ios_cart_outline = "\u{f3f7}" 318 | case ios_chatboxes = "\u{f3fa}" 319 | case ios_chatboxes_outline = "\u{f3f9}" 320 | case ios_chatbubble = "\u{f3fc}" 321 | case ios_chatbubble_outline = "\u{f3fb}" 322 | case ios_checkmark = "\u{f3ff}" 323 | case ios_checkmark_empty = "\u{f3fd}" 324 | case ios_checkmark_outline = "\u{f3fe}" 325 | case ios_circle_filled = "\u{f400}" 326 | case ios_circle_outline = "\u{f401}" 327 | case ios_clock = "\u{f403}" 328 | case ios_clock_outline = "\u{f402}" 329 | case ios_close = "\u{f406}" 330 | case ios_close_empty = "\u{f404}" 331 | case ios_close_outline = "\u{f405}" 332 | case ios_cloud = "\u{f40c}" 333 | case ios_cloud_download = "\u{f408}" 334 | case ios_cloud_download_outline = "\u{f407}" 335 | case ios_cloud_outline = "\u{f409}" 336 | case ios_cloud_upload = "\u{f40b}" 337 | case ios_cloud_upload_outline = "\u{f40a}" 338 | case ios_cloudy = "\u{f410}" 339 | case ios_cloudy_night = "\u{f40e}" 340 | case ios_cloudy_night_outline = "\u{f40d}" 341 | case ios_cloudy_outline = "\u{f40f}" 342 | case ios_cog = "\u{f412}" 343 | case ios_cog_outline = "\u{f411}" 344 | case ios_color_filter = "\u{f414}" 345 | case ios_color_filter_outline = "\u{f413}" 346 | case ios_color_wand = "\u{f416}" 347 | case ios_color_wand_outline = "\u{f415}" 348 | case ios_compose = "\u{f418}" 349 | case ios_compose_outline = "\u{f417}" 350 | case ios_contact = "\u{f41a}" 351 | case ios_contact_outline = "\u{f419}" 352 | case ios_copy = "\u{f41c}" 353 | case ios_copy_outline = "\u{f41b}" 354 | case ios_crop = "\u{f41e}" 355 | case ios_crop_strong = "\u{f41d}" 356 | case ios_download = "\u{f420}" 357 | case ios_download_outline = "\u{f41f}" 358 | case ios_drag = "\u{f421}" 359 | case ios_email = "\u{f423}" 360 | case ios_email_outline = "\u{f422}" 361 | case ios_eye = "\u{f425}" 362 | case ios_eye_outline = "\u{f424}" 363 | case ios_fastforward = "\u{f427}" 364 | case ios_fastforward_outline = "\u{f426}" 365 | case ios_filing = "\u{f429}" 366 | case ios_filing_outline = "\u{f428}" 367 | case ios_film = "\u{f42b}" 368 | case ios_film_outline = "\u{f42a}" 369 | case ios_flag = "\u{f42d}" 370 | case ios_flag_outline = "\u{f42c}" 371 | case ios_flame = "\u{f42f}" 372 | case ios_flame_outline = "\u{f42e}" 373 | case ios_flask = "\u{f431}" 374 | case ios_flask_outline = "\u{f430}" 375 | case ios_flower = "\u{f433}" 376 | case ios_flower_outline = "\u{f432}" 377 | case ios_folder = "\u{f435}" 378 | case ios_folder_outline = "\u{f434}" 379 | case ios_football = "\u{f437}" 380 | case ios_football_outline = "\u{f436}" 381 | case ios_game_controller_a = "\u{f439}" 382 | case ios_game_controller_a_outline = "\u{f438}" 383 | case ios_game_controller_b = "\u{f43b}" 384 | case ios_game_controller_b_outline = "\u{f43a}" 385 | case ios_gear = "\u{f43d}" 386 | case ios_gear_outline = "\u{f43c}" 387 | case ios_glasses = "\u{f43f}" 388 | case ios_glasses_outline = "\u{f43e}" 389 | case ios_grid_view = "\u{f441}" 390 | case ios_grid_view_outline = "\u{f440}" 391 | case ios_heart = "\u{f443}" 392 | case ios_heart_outline = "\u{f442}" 393 | case ios_help = "\u{f446}" 394 | case ios_help_empty = "\u{f444}" 395 | case ios_help_outline = "\u{f445}" 396 | case ios_home = "\u{f448}" 397 | case ios_home_outline = "\u{f447}" 398 | case ios_infinite = "\u{f44a}" 399 | case ios_infinite_outline = "\u{f449}" 400 | case ios_information = "\u{f44d}" 401 | case ios_information_empty = "\u{f44b}" 402 | case ios_information_outline = "\u{f44c}" 403 | case ios_ionic_outline = "\u{f44e}" 404 | case ios_keypad = "\u{f450}" 405 | case ios_keypad_outline = "\u{f44f}" 406 | case ios_lightbulb = "\u{f452}" 407 | case ios_lightbulb_outline = "\u{f451}" 408 | case ios_list = "\u{f454}" 409 | case ios_list_outline = "\u{f453}" 410 | case ios_location = "\u{f456}" 411 | case ios_location_outline = "\u{f455}" 412 | case ios_locked = "\u{f458}" 413 | case ios_locked_outline = "\u{f457}" 414 | case ios_loop = "\u{f45a}" 415 | case ios_loop_strong = "\u{f459}" 416 | case ios_medical = "\u{f45c}" 417 | case ios_medical_outline = "\u{f45b}" 418 | case ios_medkit = "\u{f45e}" 419 | case ios_medkit_outline = "\u{f45d}" 420 | case ios_mic = "\u{f461}" 421 | case ios_mic_off = "\u{f45f}" 422 | case ios_mic_outline = "\u{f460}" 423 | case ios_minus = "\u{f464}" 424 | case ios_minus_empty = "\u{f462}" 425 | case ios_minus_outline = "\u{f463}" 426 | case ios_monitor = "\u{f466}" 427 | case ios_monitor_outline = "\u{f465}" 428 | case ios_moon = "\u{f468}" 429 | case ios_moon_outline = "\u{f467}" 430 | case ios_more = "\u{f46a}" 431 | case ios_more_outline = "\u{f469}" 432 | case ios_musical_note = "\u{f46b}" 433 | case ios_musical_notes = "\u{f46c}" 434 | case ios_navigate = "\u{f46e}" 435 | case ios_navigate_outline = "\u{f46d}" 436 | case ios_nutrition = "\u{f470}" 437 | case ios_nutrition_outline = "\u{f46f}" 438 | case ios_paper = "\u{f472}" 439 | case ios_paper_outline = "\u{f471}" 440 | case ios_paperplane = "\u{f474}" 441 | case ios_paperplane_outline = "\u{f473}" 442 | case ios_partlysunny = "\u{f476}" 443 | case ios_partlysunny_outline = "\u{f475}" 444 | case ios_pause = "\u{f478}" 445 | case ios_pause_outline = "\u{f477}" 446 | case ios_paw = "\u{f47a}" 447 | case ios_paw_outline = "\u{f479}" 448 | case ios_people = "\u{f47c}" 449 | case ios_people_outline = "\u{f47b}" 450 | case ios_person = "\u{f47e}" 451 | case ios_person_outline = "\u{f47d}" 452 | case ios_personadd = "\u{f480}" 453 | case ios_personadd_outline = "\u{f47f}" 454 | case ios_photos = "\u{f482}" 455 | case ios_photos_outline = "\u{f481}" 456 | case ios_pie = "\u{f484}" 457 | case ios_pie_outline = "\u{f483}" 458 | case ios_pint = "\u{f486}" 459 | case ios_pint_outline = "\u{f485}" 460 | case ios_play = "\u{f488}" 461 | case ios_play_outline = "\u{f487}" 462 | case ios_plus = "\u{f48b}" 463 | case ios_plus_empty = "\u{f489}" 464 | case ios_plus_outline = "\u{f48a}" 465 | case ios_pricetag = "\u{f48d}" 466 | case ios_pricetag_outline = "\u{f48c}" 467 | case ios_pricetags = "\u{f48f}" 468 | case ios_pricetags_outline = "\u{f48e}" 469 | case ios_printer = "\u{f491}" 470 | case ios_printer_outline = "\u{f490}" 471 | case ios_pulse = "\u{f493}" 472 | case ios_pulse_strong = "\u{f492}" 473 | case ios_rainy = "\u{f495}" 474 | case ios_rainy_outline = "\u{f494}" 475 | case ios_recording = "\u{f497}" 476 | case ios_recording_outline = "\u{f496}" 477 | case ios_redo = "\u{f499}" 478 | case ios_redo_outline = "\u{f498}" 479 | case ios_refresh = "\u{f49c}" 480 | case ios_refresh_empty = "\u{f49a}" 481 | case ios_refresh_outline = "\u{f49b}" 482 | case ios_reload = "\u{f49d}" 483 | case ios_reverse_camera = "\u{f49f}" 484 | case ios_reverse_camera_outline = "\u{f49e}" 485 | case ios_rewind = "\u{f4a1}" 486 | case ios_rewind_outline = "\u{f4a0}" 487 | case ios_rose = "\u{f4a3}" 488 | case ios_rose_outline = "\u{f4a2}" 489 | case ios_search = "\u{f4a5}" 490 | case ios_search_strong = "\u{f4a4}" 491 | case ios_settings = "\u{f4a7}" 492 | case ios_settings_strong = "\u{f4a6}" 493 | case ios_shuffle = "\u{f4a9}" 494 | case ios_shuffle_strong = "\u{f4a8}" 495 | case ios_skipbackward = "\u{f4ab}" 496 | case ios_skipbackward_outline = "\u{f4aa}" 497 | case ios_skipforward = "\u{f4ad}" 498 | case ios_skipforward_outline = "\u{f4ac}" 499 | case ios_snowy = "\u{f4ae}" 500 | case ios_speedometer = "\u{f4b0}" 501 | case ios_speedometer_outline = "\u{f4af}" 502 | case ios_star = "\u{f4b3}" 503 | case ios_star_half = "\u{f4b1}" 504 | case ios_star_outline = "\u{f4b2}" 505 | case ios_stopwatch = "\u{f4b5}" 506 | case ios_stopwatch_outline = "\u{f4b4}" 507 | case ios_sunny = "\u{f4b7}" 508 | case ios_sunny_outline = "\u{f4b6}" 509 | case ios_telephone = "\u{f4b9}" 510 | case ios_telephone_outline = "\u{f4b8}" 511 | case ios_tennisball = "\u{f4bb}" 512 | case ios_tennisball_outline = "\u{f4ba}" 513 | case ios_thunderstorm = "\u{f4bd}" 514 | case ios_thunderstorm_outline = "\u{f4bc}" 515 | case ios_time = "\u{f4bf}" 516 | case ios_time_outline = "\u{f4be}" 517 | case ios_timer = "\u{f4c1}" 518 | case ios_timer_outline = "\u{f4c0}" 519 | case ios_toggle = "\u{f4c3}" 520 | case ios_toggle_outline = "\u{f4c2}" 521 | case ios_trash = "\u{f4c5}" 522 | case ios_trash_outline = "\u{f4c4}" 523 | case ios_undo = "\u{f4c7}" 524 | case ios_undo_outline = "\u{f4c6}" 525 | case ios_unlocked = "\u{f4c9}" 526 | case ios_unlocked_outline = "\u{f4c8}" 527 | case ios_upload = "\u{f4cb}" 528 | case ios_upload_outline = "\u{f4ca}" 529 | case ios_videocam = "\u{f4cd}" 530 | case ios_videocam_outline = "\u{f4cc}" 531 | case ios_volume_high = "\u{f4ce}" 532 | case ios_volume_low = "\u{f4cf}" 533 | case ios_wineglass = "\u{f4d1}" 534 | case ios_wineglass_outline = "\u{f4d0}" 535 | case ios_world = "\u{f4d3}" 536 | case ios_world_outline = "\u{f4d2}" 537 | case ipad = "\u{f1f9}" 538 | case iphone = "\u{f1fa}" 539 | case ipod = "\u{f1fb}" 540 | case jet = "\u{f295}" 541 | case key = "\u{f296}" 542 | case knife = "\u{f297}" 543 | case laptop = "\u{f1fc}" 544 | case leaf = "\u{f1fd}" 545 | case levels = "\u{f298}" 546 | case lightbulb = "\u{f299}" 547 | case link = "\u{f1fe}" 548 | case load_a = "\u{f29a}" 549 | case load_b = "\u{f29b}" 550 | case load_c = "\u{f29c}" 551 | case load_d = "\u{f29d}" 552 | case location = "\u{f1ff}" 553 | case lock_combination = "\u{f4d4}" 554 | case locked = "\u{f200}" 555 | case log_in = "\u{f29e}" 556 | case log_out = "\u{f29f}" 557 | case loop = "\u{f201}" 558 | case magnet = "\u{f2a0}" 559 | case male = "\u{f2a1}" 560 | case man = "\u{f202}" 561 | case map = "\u{f203}" 562 | case medkit = "\u{f2a2}" 563 | case merge = "\u{f33f}" 564 | case mic_a = "\u{f204}" 565 | case mic_b = "\u{f205}" 566 | case mic_c = "\u{f206}" 567 | case minus = "\u{f209}" 568 | case minus_circled = "\u{f207}" 569 | case minus_round = "\u{f208}" 570 | case model_s = "\u{f2c1}" 571 | case monitor = "\u{f20a}" 572 | case more = "\u{f20b}" 573 | case mouse = "\u{f340}" 574 | case music_note = "\u{f20c}" 575 | case navicon = "\u{f20e}" 576 | case navicon_round = "\u{f20d}" 577 | case navigate = "\u{f2a3}" 578 | case network = "\u{f341}" 579 | case no_smoking = "\u{f2c2}" 580 | case nuclear = "\u{f2a4}" 581 | case outlet = "\u{f342}" 582 | case paintbrush = "\u{f4d5}" 583 | case paintbucket = "\u{f4d6}" 584 | case paper_airplane = "\u{f2c3}" 585 | case paperclip = "\u{f20f}" 586 | case pause = "\u{f210}" 587 | case person = "\u{f213}" 588 | case person_add = "\u{f211}" 589 | case person_stalker = "\u{f212}" 590 | case pie_graph = "\u{f2a5}" 591 | case pin = "\u{f2a6}" 592 | case pinpoint = "\u{f2a7}" 593 | case pizza = "\u{f2a8}" 594 | case plane = "\u{f214}" 595 | case planet = "\u{f343}" 596 | case play = "\u{f215}" 597 | case playstation = "\u{f30a}" 598 | case plus = "\u{f218}" 599 | case plus_circled = "\u{f216}" 600 | case plus_round = "\u{f217}" 601 | case podium = "\u{f344}" 602 | case pound = "\u{f219}" 603 | case power = "\u{f2a9}" 604 | case pricetag = "\u{f2aa}" 605 | case pricetags = "\u{f2ab}" 606 | case printer = "\u{f21a}" 607 | case pull_request = "\u{f345}" 608 | case qr_scanner = "\u{f346}" 609 | case quote = "\u{f347}" 610 | case radio_waves = "\u{f2ac}" 611 | case record = "\u{f21b}" 612 | case refresh = "\u{f21c}" 613 | case reply = "\u{f21e}" 614 | case reply_all = "\u{f21d}" 615 | case ribbon_a = "\u{f348}" 616 | case ribbon_b = "\u{f349}" 617 | case sad = "\u{f34a}" 618 | case sad_outline = "\u{f4d7}" 619 | case scissors = "\u{f34b}" 620 | case search = "\u{f21f}" 621 | case settings = "\u{f2ad}" 622 | case share = "\u{f220}" 623 | case shuffle = "\u{f221}" 624 | case skip_backward = "\u{f222}" 625 | case skip_forward = "\u{f223}" 626 | case social_android = "\u{f225}" 627 | case social_android_outline = "\u{f224}" 628 | case social_angular = "\u{f4d9}" 629 | case social_angular_outline = "\u{f4d8}" 630 | case social_apple = "\u{f227}" 631 | case social_apple_outline = "\u{f226}" 632 | case social_bitcoin = "\u{f2af}" 633 | case social_bitcoin_outline = "\u{f2ae}" 634 | case social_buffer = "\u{f229}" 635 | case social_buffer_outline = "\u{f228}" 636 | case social_chrome = "\u{f4db}" 637 | case social_chrome_outline = "\u{f4da}" 638 | case social_codepen = "\u{f4dd}" 639 | case social_codepen_outline = "\u{f4dc}" 640 | case social_css3 = "\u{f4df}" 641 | case social_css3_outline = "\u{f4de}" 642 | case social_designernews = "\u{f22b}" 643 | case social_designernews_outline = "\u{f22a}" 644 | case social_dribbble = "\u{f22d}" 645 | case social_dribbble_outline = "\u{f22c}" 646 | case social_dropbox = "\u{f22f}" 647 | case social_dropbox_outline = "\u{f22e}" 648 | case social_euro = "\u{f4e1}" 649 | case social_euro_outline = "\u{f4e0}" 650 | case social_facebook = "\u{f231}" 651 | case social_facebook_outline = "\u{f230}" 652 | case social_foursquare = "\u{f34d}" 653 | case social_foursquare_outline = "\u{f34c}" 654 | case social_freebsd_devil = "\u{f2c4}" 655 | case social_github = "\u{f233}" 656 | case social_github_outline = "\u{f232}" 657 | case social_google = "\u{f34f}" 658 | case social_google_outline = "\u{f34e}" 659 | case social_googleplus = "\u{f235}" 660 | case social_googleplus_outline = "\u{f234}" 661 | case social_hackernews = "\u{f237}" 662 | case social_hackernews_outline = "\u{f236}" 663 | case social_html5 = "\u{f4e3}" 664 | case social_html5_outline = "\u{f4e2}" 665 | case social_instagram = "\u{f351}" 666 | case social_instagram_outline = "\u{f350}" 667 | case social_javascript = "\u{f4e5}" 668 | case social_javascript_outline = "\u{f4e4}" 669 | case social_linkedin = "\u{f239}" 670 | case social_linkedin_outline = "\u{f238}" 671 | case social_markdown = "\u{f4e6}" 672 | case social_nodejs = "\u{f4e7}" 673 | case social_octocat = "\u{f4e8}" 674 | case social_pinterest = "\u{f2b1}" 675 | case social_pinterest_outline = "\u{f2b0}" 676 | case social_python = "\u{f4e9}" 677 | case social_reddit = "\u{f23b}" 678 | case social_reddit_outline = "\u{f23a}" 679 | case social_rss = "\u{f23d}" 680 | case social_rss_outline = "\u{f23c}" 681 | case social_sass = "\u{f4ea}" 682 | case social_skype = "\u{f23f}" 683 | case social_skype_outline = "\u{f23e}" 684 | case social_snapchat = "\u{f4ec}" 685 | case social_snapchat_outline = "\u{f4eb}" 686 | case social_tumblr = "\u{f241}" 687 | case social_tumblr_outline = "\u{f240}" 688 | case social_tux = "\u{f2c5}" 689 | case social_twitch = "\u{f4ee}" 690 | case social_twitch_outline = "\u{f4ed}" 691 | case social_twitter = "\u{f243}" 692 | case social_twitter_outline = "\u{f242}" 693 | case social_usd = "\u{f353}" 694 | case social_usd_outline = "\u{f352}" 695 | case social_vimeo = "\u{f245}" 696 | case social_vimeo_outline = "\u{f244}" 697 | case social_whatsapp = "\u{f4f0}" 698 | case social_whatsapp_outline = "\u{f4ef}" 699 | case social_windows = "\u{f247}" 700 | case social_windows_outline = "\u{f246}" 701 | case social_wordpress = "\u{f249}" 702 | case social_wordpress_outline = "\u{f248}" 703 | case social_yahoo = "\u{f24b}" 704 | case social_yahoo_outline = "\u{f24a}" 705 | case social_yen = "\u{f4f2}" 706 | case social_yen_outline = "\u{f4f1}" 707 | case social_youtube = "\u{f24d}" 708 | case social_youtube_outline = "\u{f24c}" 709 | case soup_can = "\u{f4f4}" 710 | case soup_can_outline = "\u{f4f3}" 711 | case speakerphone = "\u{f2b2}" 712 | case speedometer = "\u{f2b3}" 713 | case spoon = "\u{f2b4}" 714 | case star = "\u{f24e}" 715 | case stats_bars = "\u{f2b5}" 716 | case steam = "\u{f30b}" 717 | case stop = "\u{f24f}" 718 | case thermometer = "\u{f2b6}" 719 | case thumbsdown = "\u{f250}" 720 | case thumbsup = "\u{f251}" 721 | case toggle = "\u{f355}" 722 | case toggle_filled = "\u{f354}" 723 | case transgender = "\u{f4f5}" 724 | case trash_a = "\u{f252}" 725 | case trash_b = "\u{f253}" 726 | case trophy = "\u{f356}" 727 | case tshirt = "\u{f4f7}" 728 | case tshirt_outline = "\u{f4f6}" 729 | case umbrella = "\u{f2b7}" 730 | case university = "\u{f357}" 731 | case unlocked = "\u{f254}" 732 | case upload = "\u{f255}" 733 | case usb = "\u{f2b8}" 734 | case videocamera = "\u{f256}" 735 | case volume_high = "\u{f257}" 736 | case volume_low = "\u{f258}" 737 | case volume_medium = "\u{f259}" 738 | case volume_mute = "\u{f25a}" 739 | case wand = "\u{f358}" 740 | case waterdrop = "\u{f25b}" 741 | case wifi = "\u{f25c}" 742 | case wineglass = "\u{f2b9}" 743 | case woman = "\u{f25d}" 744 | case wrench = "\u{f2ba}" 745 | case xbox = "\u{f30c}" 746 | } 747 | 748 | 749 | extension UIImage { 750 | public class func imageWithIonIcon(icon: Ionicons, height: CGFloat, color: UIColor) -> UIImage { 751 | let font = UIFont(name: "ionicons", size: height)! 752 | let iconSize = (icon.rawValue as NSString).sizeWithAttributes([NSFontAttributeName: font]) 753 | UIGraphicsBeginImageContextWithOptions(iconSize, false, 0.0) 754 | (icon.rawValue as NSString).drawAtPoint(CGPointZero, withAttributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: color]) 755 | let image = UIGraphicsGetImageFromCurrentImageContext() 756 | UIGraphicsEndImageContext() 757 | 758 | return image 759 | } 760 | } -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ionicons.swift/README.md: -------------------------------------------------------------------------------- 1 | # ionicons.swift 2 | swift version of [ionicons-iOS](https://github.com/sweetmandm/ionicons-iOS) that easily use ionicons from swift project. 3 | 4 | ### About 5 | The ionicons icon set includes a lot of iOS system icons as well as plenty of handy additions. The great thing about ionicons is it makes the system icons a lot handier and more customizable, while adding more icon options. Also, with ionicons-iOS you can use iOS 7 system icons in your native SDK iOS 5+ projects, so your designs will have a consistent appearance across all OS versions. 6 | 7 | ### Usage: 8 | 9 | For available icons, look at [**ionicons** website](http://ionicons.com). 10 | 11 | 12 | ```swift 13 | // Render an ionicons icon in a UIImage: 14 | let image = UIImage.imageWithIonIcon(.arrow_up_b, height: 60, color: UIColor.brownColor()) 15 | 16 | // directly use the ionicons font: 17 | let font = UIFont(name: "ionicons", size: 28) 18 | ``` 19 | 20 | 21 | ### Installation: 22 | 1. Drag the folder 'ionicons' with the source files into your project 23 | 2. Modify your project's Info.plist file, add "ionicons.ttf" to the "Fonts provided by application" key -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeight/ionicons.swift/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armaluca/iOS-App-Store-Explore-Section-Animation/ce87202276c56d4835869a0ab7257ed96c9d03d7/HowToCustomAnimateCellHeight/ionicons.swift/ionicons.ttf -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeightTests/HowToCustomAnimateCellHeightTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HowToCustomAnimateCellHeightTests.swift 3 | // HowToCustomAnimateCellHeightTests 4 | // 5 | // Created by luca silvestro on 25/07/15. 6 | // Copyright (c) 2015 luca silvestro. All rights reserved. 7 | // luca.silvestro@gmail.com 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class HowToCustomAnimateCellHeightTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /HowToCustomAnimateCellHeightTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.lucasilvestro.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # App Store - Explore Section Animation (Swift) 2 | Simple Test to replicate the slick "expanding & collapse" tableview animations in section "Explore" of the App store. 3 | You can of course reuse some of this in your projects. 4 | 5 | I was really surprised when, by chance, I discovered these nice animations Apple playied with! I was curious to know the way they decided to go to develop something like this. 6 | Still I am very curious cause I suppose must be many ways to achieve the same effect! 7 | Hopefully you like it! 8 | 9 | On Stackoverflow : http://stackoverflow.com/questions/30863738/ios-ui-app-store-explore-section-transition 10 | 11 | If you think you could do it differently please leave feedback! 12 | 13 | # How these animations look like? 14 | ![App Store Animation reference](https://github.com/armaluca/iOS-App-Store-Explore-Section-Animation/blob/master/example.gif) 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armaluca/iOS-App-Store-Explore-Section-Animation/ce87202276c56d4835869a0ab7257ed96c9d03d7/example.gif --------------------------------------------------------------------------------