├── Collection View Animation Bug ├── en.lproj │ └── InfoPlist.strings ├── Default.png ├── Default@2x.png ├── Default-568h@2x.png ├── JPSCollectionViewController.h ├── JPSAppDelegate.h ├── main.m ├── Collection View Animation Bug-Prefix.pch ├── JPSAppDelegate.m ├── Collection View Animation Bug-Info.plist └── JPSCollectionViewController.m ├── UICV_Animation_Bug.gif ├── README.md └── Collection View Animation Bug.xcodeproj └── project.pbxproj /Collection View Animation Bug/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /UICV_Animation_Bug.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpsim/UICollectionView-Animation-Bug/HEAD/UICV_Animation_Bug.gif -------------------------------------------------------------------------------- /Collection View Animation Bug/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpsim/UICollectionView-Animation-Bug/HEAD/Collection View Animation Bug/Default.png -------------------------------------------------------------------------------- /Collection View Animation Bug/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpsim/UICollectionView-Animation-Bug/HEAD/Collection View Animation Bug/Default@2x.png -------------------------------------------------------------------------------- /Collection View Animation Bug/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpsim/UICollectionView-Animation-Bug/HEAD/Collection View Animation Bug/Default-568h@2x.png -------------------------------------------------------------------------------- /Collection View Animation Bug/JPSCollectionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JPSCollectionViewController.h 3 | // Collection View Animation Bug 4 | // 5 | // Created by Jean-Pierre Simard on 6/14/13. 6 | // Copyright (c) 2013 JP Simard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JPSCollectionViewController : UICollectionViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Collection View Animation Bug/JPSAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // JPSAppDelegate.h 3 | // Collection View Animation Bug 4 | // 5 | // Created by Jean-Pierre Simard on 6/14/13. 6 | // Copyright (c) 2013 JP Simard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JPSAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Collection View Animation Bug/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Collection View Animation Bug 4 | // 5 | // Created by Jean-Pierre Simard on 6/14/13. 6 | // Copyright (c) 2013 JP Simard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "JPSAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([JPSAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Collection View Animation Bug/Collection View Animation Bug-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'Collection View Animation Bug' target in the 'Collection View Animation Bug' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_3_0 8 | #warning "This project uses features only available in iOS SDK 3.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Collection View Animation Bug/JPSAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // JPSAppDelegate.m 3 | // Collection View Animation Bug 4 | // 5 | // Created by Jean-Pierre Simard on 6/14/13. 6 | // Copyright (c) 2013 JP Simard. All rights reserved. 7 | // 8 | 9 | #import "JPSAppDelegate.h" 10 | #import "JPSCollectionViewController.h" 11 | 12 | @implementation JPSAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 15 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 16 | 17 | self.window.rootViewController = [[JPSCollectionViewController alloc] init]; 18 | 19 | [self.window makeKeyAndVisible]; 20 | return YES; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Collection View Animation Bug/Collection View Animation Bug-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.jpsim.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Collection View Animation Bug Sample Code 2 | 3 | ## The bug 4 | 5 | There's a bug (confirmed by Apple) in the otherwise excellent `UICollectionView`'s `performBatchUpdates` method which causes cells that are initially off-screen animating on-screen to just appear at their final location instead of animating there. This is better understood visually: 6 | 7 | ![Video of bug](UICV_Animation_Bug.gif) 8 | 9 | Notice how the last cell doesn't animate when reappearing? This is a simple demo, but there are cases in which the bug is drastically more jarring. 10 | 11 | ## The demo project 12 | 13 | This demo project is the result of having tried tons of work-arounds to get this animation to work, when finally the best solution was the crudest. 14 | 15 | ## The fix 16 | 17 | The solution is really more of a hack: make the collection view bigger during the animation so that it can accurately animate the appearing cells. 18 | 19 | Essentially: 20 | 21 | ``` objc 22 | frameUpdate.size.height += kExpandedHeight - kCollapsedHeight; 23 | collectionView.frame = frameUpdate; 24 | 25 | [collectionView performBatchUpdates:^{ 26 | _cells[indexPath.item] = @(newHeight); 27 | } completion:^(BOOL finished) { 28 | frameUpdate.size.height -= kExpandedHeight - kCollapsedHeight; 29 | collectionView.frame = frameUpdate; 30 | }]; 31 | ``` 32 | 33 | ## License 34 | 35 | Feels weird to license something so small, but this demo is MIT licensed. -------------------------------------------------------------------------------- /Collection View Animation Bug/JPSCollectionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JPSCollectionViewController.m 3 | // Collection View Animation Bug 4 | // 5 | // Created by Jean-Pierre Simard on 6/14/13. 6 | // Copyright (c) 2013 JP Simard. All rights reserved. 7 | // 8 | 9 | #import "JPSCollectionViewController.h" 10 | 11 | #define kCellReuseID @"Cell" 12 | #define kWidth 300 13 | #define kCollapsedHeight 100 14 | #define kExpandedHeight 300 15 | #define kNumberOfCells 10 16 | #define kContentOffsetKey @"contentOffset" 17 | #define kHackEnabled TRUE 18 | #define kToggleEnabled TRUE 19 | 20 | @implementation JPSCollectionViewController { 21 | NSMutableArray *_cells; 22 | BOOL _forceContentOffset; 23 | CGPoint _originalOffset; 24 | } 25 | 26 | #pragma mark - Lifecycle 27 | 28 | - (id)init { 29 | self = [super initWithCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init]]; 30 | if (self) { 31 | _cells = [NSMutableArray arrayWithCapacity:kNumberOfCells]; 32 | 33 | for (int cell_idx = 0; cell_idx < kNumberOfCells; cell_idx++) { 34 | [_cells addObject:@(kCollapsedHeight)]; 35 | } 36 | 37 | [self.collectionView registerClass:UICollectionViewCell.class forCellWithReuseIdentifier:kCellReuseID]; 38 | 39 | if (kHackEnabled) { 40 | [self.collectionView addObserver:self forKeyPath:kContentOffsetKey options:NSKeyValueObservingOptionNew context:NULL]; 41 | _forceContentOffset = NO; 42 | } 43 | } 44 | return self; 45 | } 46 | 47 | #pragma mark - Collection View 48 | 49 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 50 | return _cells.count; 51 | } 52 | 53 | - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 54 | UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellReuseID forIndexPath:indexPath]; 55 | cell.contentView.backgroundColor = indexPath.item % 2 ? [UIColor blueColor] : [UIColor redColor]; 56 | return cell; 57 | } 58 | 59 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 60 | return CGSizeMake(kWidth, [_cells[indexPath.item] floatValue]); 61 | } 62 | 63 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 64 | NSInteger currentHeight = [_cells[indexPath.item] integerValue]; 65 | 66 | BOOL expand = currentHeight == kCollapsedHeight; 67 | 68 | NSInteger newHeight = expand ? kExpandedHeight : kCollapsedHeight; 69 | 70 | __block CGRect frameUpdate = collectionView.frame; 71 | _originalOffset = collectionView.contentOffset; 72 | 73 | if (kHackEnabled) { 74 | frameUpdate.size.height += kExpandedHeight - kCollapsedHeight; 75 | collectionView.frame = frameUpdate; 76 | collectionView.contentOffset = _originalOffset; 77 | _forceContentOffset = YES; 78 | } 79 | 80 | [collectionView performBatchUpdates:^{ 81 | for (int idx = 0; idx < _cells.count; idx++) { 82 | if (idx == indexPath.item) { 83 | _cells[idx] = @(newHeight); 84 | } else if (kToggleEnabled && [_cells[idx] integerValue] == kExpandedHeight) { 85 | _cells[idx] = @(kCollapsedHeight); 86 | } 87 | } 88 | } completion:^(BOOL finished) { 89 | if (kHackEnabled) { 90 | frameUpdate.size.height -= kExpandedHeight - kCollapsedHeight; 91 | collectionView.frame = frameUpdate; 92 | _forceContentOffset = NO; 93 | } 94 | }]; 95 | } 96 | 97 | #pragma mark - KVO 98 | 99 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 100 | if ([keyPath isEqualToString:kContentOffsetKey] && _forceContentOffset && [(UIScrollView *)object contentOffset].y != _originalOffset.y) { 101 | dispatch_async(dispatch_get_main_queue(), ^{ 102 | UICollectionView *collectionView = object; 103 | if (collectionView.contentSize.height < (collectionView.contentOffset.y + collectionView.bounds.size.height)) { 104 | _forceContentOffset = NO; 105 | [collectionView scrollRectToVisible:CGRectMake(_originalOffset.x, collectionView.contentSize.height - collectionView.bounds.size.height, 1, 1) animated:YES]; 106 | } else { 107 | collectionView.contentOffset = _originalOffset; 108 | } 109 | }); 110 | } 111 | } 112 | 113 | @end 114 | -------------------------------------------------------------------------------- /Collection View Animation Bug.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E8F02D8B176BB43A00C0435D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E8F02D8A176BB43A00C0435D /* UIKit.framework */; }; 11 | E8F02D8D176BB43A00C0435D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E8F02D8C176BB43A00C0435D /* Foundation.framework */; }; 12 | E8F02D8F176BB43A00C0435D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E8F02D8E176BB43A00C0435D /* CoreGraphics.framework */; }; 13 | E8F02D95176BB43A00C0435D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E8F02D93176BB43A00C0435D /* InfoPlist.strings */; }; 14 | E8F02D97176BB43A00C0435D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F02D96176BB43A00C0435D /* main.m */; }; 15 | E8F02D9B176BB43A00C0435D /* JPSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F02D9A176BB43A00C0435D /* JPSAppDelegate.m */; }; 16 | E8F02D9D176BB43B00C0435D /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = E8F02D9C176BB43A00C0435D /* Default.png */; }; 17 | E8F02D9F176BB43B00C0435D /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E8F02D9E176BB43B00C0435D /* Default@2x.png */; }; 18 | E8F02DA1176BB43B00C0435D /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E8F02DA0176BB43B00C0435D /* Default-568h@2x.png */; }; 19 | E8F02DAA176BB45F00C0435D /* JPSCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F02DA9176BB45F00C0435D /* JPSCollectionViewController.m */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | E8F02D87176BB43A00C0435D /* Collection View Animation Bug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Collection View Animation Bug.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | E8F02D8A176BB43A00C0435D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 25 | E8F02D8C176BB43A00C0435D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 26 | E8F02D8E176BB43A00C0435D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 27 | E8F02D92176BB43A00C0435D /* Collection View Animation Bug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Collection View Animation Bug-Info.plist"; sourceTree = ""; }; 28 | E8F02D94176BB43A00C0435D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 29 | E8F02D96176BB43A00C0435D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 30 | E8F02D98176BB43A00C0435D /* Collection View Animation Bug-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Collection View Animation Bug-Prefix.pch"; sourceTree = ""; }; 31 | E8F02D99176BB43A00C0435D /* JPSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JPSAppDelegate.h; sourceTree = ""; }; 32 | E8F02D9A176BB43A00C0435D /* JPSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JPSAppDelegate.m; sourceTree = ""; }; 33 | E8F02D9C176BB43A00C0435D /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 34 | E8F02D9E176BB43B00C0435D /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 35 | E8F02DA0176BB43B00C0435D /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 36 | E8F02DA8176BB45F00C0435D /* JPSCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JPSCollectionViewController.h; sourceTree = ""; }; 37 | E8F02DA9176BB45F00C0435D /* JPSCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JPSCollectionViewController.m; sourceTree = ""; }; 38 | /* End PBXFileReference section */ 39 | 40 | /* Begin PBXFrameworksBuildPhase section */ 41 | E8F02D84176BB43A00C0435D /* Frameworks */ = { 42 | isa = PBXFrameworksBuildPhase; 43 | buildActionMask = 2147483647; 44 | files = ( 45 | E8F02D8B176BB43A00C0435D /* UIKit.framework in Frameworks */, 46 | E8F02D8D176BB43A00C0435D /* Foundation.framework in Frameworks */, 47 | E8F02D8F176BB43A00C0435D /* CoreGraphics.framework in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | E8F02D7E176BB43A00C0435D = { 55 | isa = PBXGroup; 56 | children = ( 57 | E8F02D90176BB43A00C0435D /* Collection View Animation Bug */, 58 | E8F02D89176BB43A00C0435D /* Frameworks */, 59 | E8F02D88176BB43A00C0435D /* Products */, 60 | ); 61 | sourceTree = ""; 62 | }; 63 | E8F02D88176BB43A00C0435D /* Products */ = { 64 | isa = PBXGroup; 65 | children = ( 66 | E8F02D87176BB43A00C0435D /* Collection View Animation Bug.app */, 67 | ); 68 | name = Products; 69 | sourceTree = ""; 70 | }; 71 | E8F02D89176BB43A00C0435D /* Frameworks */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | E8F02D8A176BB43A00C0435D /* UIKit.framework */, 75 | E8F02D8C176BB43A00C0435D /* Foundation.framework */, 76 | E8F02D8E176BB43A00C0435D /* CoreGraphics.framework */, 77 | ); 78 | name = Frameworks; 79 | sourceTree = ""; 80 | }; 81 | E8F02D90176BB43A00C0435D /* Collection View Animation Bug */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | E8F02D99176BB43A00C0435D /* JPSAppDelegate.h */, 85 | E8F02D9A176BB43A00C0435D /* JPSAppDelegate.m */, 86 | E8F02DA8176BB45F00C0435D /* JPSCollectionViewController.h */, 87 | E8F02DA9176BB45F00C0435D /* JPSCollectionViewController.m */, 88 | E8F02D91176BB43A00C0435D /* Supporting Files */, 89 | ); 90 | path = "Collection View Animation Bug"; 91 | sourceTree = ""; 92 | }; 93 | E8F02D91176BB43A00C0435D /* Supporting Files */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | E8F02D92176BB43A00C0435D /* Collection View Animation Bug-Info.plist */, 97 | E8F02D93176BB43A00C0435D /* InfoPlist.strings */, 98 | E8F02D96176BB43A00C0435D /* main.m */, 99 | E8F02D98176BB43A00C0435D /* Collection View Animation Bug-Prefix.pch */, 100 | E8F02D9C176BB43A00C0435D /* Default.png */, 101 | E8F02D9E176BB43B00C0435D /* Default@2x.png */, 102 | E8F02DA0176BB43B00C0435D /* Default-568h@2x.png */, 103 | ); 104 | name = "Supporting Files"; 105 | sourceTree = ""; 106 | }; 107 | /* End PBXGroup section */ 108 | 109 | /* Begin PBXNativeTarget section */ 110 | E8F02D86176BB43A00C0435D /* Collection View Animation Bug */ = { 111 | isa = PBXNativeTarget; 112 | buildConfigurationList = E8F02DA4176BB43B00C0435D /* Build configuration list for PBXNativeTarget "Collection View Animation Bug" */; 113 | buildPhases = ( 114 | E8F02D83176BB43A00C0435D /* Sources */, 115 | E8F02D84176BB43A00C0435D /* Frameworks */, 116 | E8F02D85176BB43A00C0435D /* Resources */, 117 | ); 118 | buildRules = ( 119 | ); 120 | dependencies = ( 121 | ); 122 | name = "Collection View Animation Bug"; 123 | productName = "Collection View Animation Bug"; 124 | productReference = E8F02D87176BB43A00C0435D /* Collection View Animation Bug.app */; 125 | productType = "com.apple.product-type.application"; 126 | }; 127 | /* End PBXNativeTarget section */ 128 | 129 | /* Begin PBXProject section */ 130 | E8F02D7F176BB43A00C0435D /* Project object */ = { 131 | isa = PBXProject; 132 | attributes = { 133 | CLASSPREFIX = JPS; 134 | LastUpgradeCheck = 0460; 135 | ORGANIZATIONNAME = "JP Simard"; 136 | }; 137 | buildConfigurationList = E8F02D82176BB43A00C0435D /* Build configuration list for PBXProject "Collection View Animation Bug" */; 138 | compatibilityVersion = "Xcode 3.2"; 139 | developmentRegion = English; 140 | hasScannedForEncodings = 0; 141 | knownRegions = ( 142 | en, 143 | ); 144 | mainGroup = E8F02D7E176BB43A00C0435D; 145 | productRefGroup = E8F02D88176BB43A00C0435D /* Products */; 146 | projectDirPath = ""; 147 | projectRoot = ""; 148 | targets = ( 149 | E8F02D86176BB43A00C0435D /* Collection View Animation Bug */, 150 | ); 151 | }; 152 | /* End PBXProject section */ 153 | 154 | /* Begin PBXResourcesBuildPhase section */ 155 | E8F02D85176BB43A00C0435D /* Resources */ = { 156 | isa = PBXResourcesBuildPhase; 157 | buildActionMask = 2147483647; 158 | files = ( 159 | E8F02D95176BB43A00C0435D /* InfoPlist.strings in Resources */, 160 | E8F02D9D176BB43B00C0435D /* Default.png in Resources */, 161 | E8F02D9F176BB43B00C0435D /* Default@2x.png in Resources */, 162 | E8F02DA1176BB43B00C0435D /* Default-568h@2x.png in Resources */, 163 | ); 164 | runOnlyForDeploymentPostprocessing = 0; 165 | }; 166 | /* End PBXResourcesBuildPhase section */ 167 | 168 | /* Begin PBXSourcesBuildPhase section */ 169 | E8F02D83176BB43A00C0435D /* Sources */ = { 170 | isa = PBXSourcesBuildPhase; 171 | buildActionMask = 2147483647; 172 | files = ( 173 | E8F02D97176BB43A00C0435D /* main.m in Sources */, 174 | E8F02D9B176BB43A00C0435D /* JPSAppDelegate.m in Sources */, 175 | E8F02DAA176BB45F00C0435D /* JPSCollectionViewController.m in Sources */, 176 | ); 177 | runOnlyForDeploymentPostprocessing = 0; 178 | }; 179 | /* End PBXSourcesBuildPhase section */ 180 | 181 | /* Begin PBXVariantGroup section */ 182 | E8F02D93176BB43A00C0435D /* InfoPlist.strings */ = { 183 | isa = PBXVariantGroup; 184 | children = ( 185 | E8F02D94176BB43A00C0435D /* en */, 186 | ); 187 | name = InfoPlist.strings; 188 | sourceTree = ""; 189 | }; 190 | /* End PBXVariantGroup section */ 191 | 192 | /* Begin XCBuildConfiguration section */ 193 | E8F02DA2176BB43B00C0435D /* Debug */ = { 194 | isa = XCBuildConfiguration; 195 | buildSettings = { 196 | ALWAYS_SEARCH_USER_PATHS = NO; 197 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 198 | CLANG_CXX_LIBRARY = "libc++"; 199 | CLANG_ENABLE_OBJC_ARC = YES; 200 | CLANG_WARN_CONSTANT_CONVERSION = YES; 201 | CLANG_WARN_EMPTY_BODY = YES; 202 | CLANG_WARN_ENUM_CONVERSION = YES; 203 | CLANG_WARN_INT_CONVERSION = YES; 204 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 205 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 206 | COPY_PHASE_STRIP = NO; 207 | GCC_C_LANGUAGE_STANDARD = gnu99; 208 | GCC_DYNAMIC_NO_PIC = NO; 209 | GCC_OPTIMIZATION_LEVEL = 0; 210 | GCC_PREPROCESSOR_DEFINITIONS = ( 211 | "DEBUG=1", 212 | "$(inherited)", 213 | ); 214 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 215 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 216 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 217 | GCC_WARN_UNUSED_VARIABLE = YES; 218 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 219 | ONLY_ACTIVE_ARCH = YES; 220 | SDKROOT = iphoneos; 221 | }; 222 | name = Debug; 223 | }; 224 | E8F02DA3176BB43B00C0435D /* Release */ = { 225 | isa = XCBuildConfiguration; 226 | buildSettings = { 227 | ALWAYS_SEARCH_USER_PATHS = NO; 228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 229 | CLANG_CXX_LIBRARY = "libc++"; 230 | CLANG_ENABLE_OBJC_ARC = YES; 231 | CLANG_WARN_CONSTANT_CONVERSION = YES; 232 | CLANG_WARN_EMPTY_BODY = YES; 233 | CLANG_WARN_ENUM_CONVERSION = YES; 234 | CLANG_WARN_INT_CONVERSION = YES; 235 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 236 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 237 | COPY_PHASE_STRIP = YES; 238 | GCC_C_LANGUAGE_STANDARD = gnu99; 239 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 240 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 241 | GCC_WARN_UNUSED_VARIABLE = YES; 242 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 243 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 244 | SDKROOT = iphoneos; 245 | VALIDATE_PRODUCT = YES; 246 | }; 247 | name = Release; 248 | }; 249 | E8F02DA5176BB43B00C0435D /* Debug */ = { 250 | isa = XCBuildConfiguration; 251 | buildSettings = { 252 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 253 | GCC_PREFIX_HEADER = "Collection View Animation Bug/Collection View Animation Bug-Prefix.pch"; 254 | INFOPLIST_FILE = "Collection View Animation Bug/Collection View Animation Bug-Info.plist"; 255 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 256 | PRODUCT_NAME = "$(TARGET_NAME)"; 257 | TARGETED_DEVICE_FAMILY = "1,2"; 258 | WRAPPER_EXTENSION = app; 259 | }; 260 | name = Debug; 261 | }; 262 | E8F02DA6176BB43B00C0435D /* Release */ = { 263 | isa = XCBuildConfiguration; 264 | buildSettings = { 265 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 266 | GCC_PREFIX_HEADER = "Collection View Animation Bug/Collection View Animation Bug-Prefix.pch"; 267 | INFOPLIST_FILE = "Collection View Animation Bug/Collection View Animation Bug-Info.plist"; 268 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 269 | PRODUCT_NAME = "$(TARGET_NAME)"; 270 | TARGETED_DEVICE_FAMILY = "1,2"; 271 | WRAPPER_EXTENSION = app; 272 | }; 273 | name = Release; 274 | }; 275 | /* End XCBuildConfiguration section */ 276 | 277 | /* Begin XCConfigurationList section */ 278 | E8F02D82176BB43A00C0435D /* Build configuration list for PBXProject "Collection View Animation Bug" */ = { 279 | isa = XCConfigurationList; 280 | buildConfigurations = ( 281 | E8F02DA2176BB43B00C0435D /* Debug */, 282 | E8F02DA3176BB43B00C0435D /* Release */, 283 | ); 284 | defaultConfigurationIsVisible = 0; 285 | defaultConfigurationName = Release; 286 | }; 287 | E8F02DA4176BB43B00C0435D /* Build configuration list for PBXNativeTarget "Collection View Animation Bug" */ = { 288 | isa = XCConfigurationList; 289 | buildConfigurations = ( 290 | E8F02DA5176BB43B00C0435D /* Debug */, 291 | E8F02DA6176BB43B00C0435D /* Release */, 292 | ); 293 | defaultConfigurationIsVisible = 0; 294 | defaultConfigurationName = Release; 295 | }; 296 | /* End XCConfigurationList section */ 297 | }; 298 | rootObject = E8F02D7F176BB43A00C0435D /* Project object */; 299 | } 300 | --------------------------------------------------------------------------------