├── TransitionBug ├── en.lproj │ └── InfoPlist.strings ├── BCViewController.h ├── BCAppDelegate.h ├── BCTransition.h ├── main.m ├── TransitionBug-Prefix.pch ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── TransitionBug-Info.plist ├── BCAppDelegate.m ├── BCViewController.m └── BCTransition.m ├── TransitionBugTests ├── en.lproj │ └── InfoPlist.strings ├── TransitionBugTests-Info.plist └── TransitionBugTests.m ├── TransitionBug.xcodeproj ├── xcuserdata │ └── bcherry.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── TransitionBug.xcscheme ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj └── README.md /TransitionBug/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TransitionBugTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TransitionBug.xcodeproj/xcuserdata/bcherry.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /TransitionBug.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TransitionBug/BCViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // BCViewController.h 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BCViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TransitionBug/BCAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // BCAppDelegate.h 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BCAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /TransitionBug/BCTransition.h: -------------------------------------------------------------------------------- 1 | // 2 | // BCTransition.h 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BCTransition : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TransitionBug/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "BCAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([BCAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /TransitionBug/TransitionBug-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_3_0 10 | #warning "This project uses features only available in iOS SDK 3.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /TransitionBug/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /TransitionBug/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TransitionBug 2 | ============= 3 | 4 | This project demonstrates an apparent bug in iOS8 betas. 5 | 6 | Run the project with Xcode 6. It should present a simple interface for pushing on new modal controllers, and then dismissing them. 7 | 8 | The transition animation runs by sliding off the current controller to reveal a new one underneath. 9 | 10 | In iOS8, the animation fails, although it succeeds in iOS7. This is because, in iOS8, the `viewForKey:` method always returns `nil` for the currently presented view in a modal transition. In iOS7, you instead use the `.view` property on the view controller. If you try this in iOS8, the view hierarchy will be broken following dismissal. 11 | -------------------------------------------------------------------------------- /TransitionBug.xcodeproj/xcuserdata/bcherry.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | TransitionBug.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 6AE657BA1995446C0044B325 16 | 17 | primary 18 | 19 | 20 | 6AE657D51995446D0044B325 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /TransitionBugTests/TransitionBugTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.bcherry.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /TransitionBugTests/TransitionBugTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // TransitionBugTests.m 3 | // TransitionBugTests 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TransitionBugTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation TransitionBugTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /TransitionBug/TransitionBug-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.bcherry.${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 | -------------------------------------------------------------------------------- /TransitionBug/BCAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // BCAppDelegate.m 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import "BCAppDelegate.h" 10 | #import "BCViewController.h" 11 | 12 | @implementation BCAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 17 | // Override point for customization after application launch. 18 | self.window.backgroundColor = [UIColor whiteColor]; 19 | [self.window makeKeyAndVisible]; 20 | 21 | BCViewController *vc = [BCViewController new]; 22 | self.window.rootViewController = vc; 23 | 24 | return YES; 25 | } 26 | 27 | - (void)applicationWillResignActive:(UIApplication *)application 28 | { 29 | // 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. 30 | // 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. 31 | } 32 | 33 | - (void)applicationDidEnterBackground:(UIApplication *)application 34 | { 35 | // 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. 36 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 37 | } 38 | 39 | - (void)applicationWillEnterForeground:(UIApplication *)application 40 | { 41 | // 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. 42 | } 43 | 44 | - (void)applicationDidBecomeActive:(UIApplication *)application 45 | { 46 | // 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. 47 | } 48 | 49 | - (void)applicationWillTerminate:(UIApplication *)application 50 | { 51 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /TransitionBug/BCViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // BCViewController.m 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import "BCViewController.h" 10 | #import "BCTransition.h" 11 | 12 | @interface BCViewController () 13 | 14 | @property (nonatomic, strong) BCTransition *transition; 15 | 16 | @end 17 | 18 | @implementation BCViewController 19 | 20 | - (void)viewDidLoad 21 | { 22 | [super viewDidLoad]; 23 | 24 | self.transition = [BCTransition new]; 25 | 26 | self.view.backgroundColor = [self generateBackgroundColor]; 27 | 28 | UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeSystem]; 29 | presentButton.tintColor = [UIColor blackColor]; 30 | [presentButton setTitle:@"Present" forState:UIControlStateNormal]; 31 | [presentButton sizeToFit]; 32 | presentButton.center = CGPointMake(self.view.center.x, self.view.center.y - 50); 33 | [presentButton addTarget:self action:@selector(tappedPresent:) forControlEvents:UIControlEventTouchUpInside]; 34 | [self.view addSubview:presentButton]; 35 | 36 | if (self.presentingViewController) { 37 | UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeSystem]; 38 | dismissButton.tintColor = [UIColor blackColor]; 39 | [dismissButton setTitle:@"Dismiss" forState:UIControlStateNormal]; 40 | [dismissButton sizeToFit]; 41 | dismissButton.center = CGPointMake(self.view.center.x, self.view.center.y + 50); 42 | [dismissButton addTarget:self action:@selector(tappedDismiss:) forControlEvents:UIControlEventTouchUpInside]; 43 | [self.view addSubview:dismissButton]; 44 | } 45 | } 46 | 47 | - (void)tappedPresent:(id)sender 48 | { 49 | BCViewController *vc = [BCViewController new]; 50 | vc.transitioningDelegate = self.transition; 51 | vc.modalPresentationStyle = UIModalPresentationCustom; 52 | [self presentViewController:vc animated:YES completion:nil]; 53 | } 54 | 55 | - (void)tappedDismiss:(id)sender 56 | { 57 | if (self.presentingViewController) { 58 | [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 59 | } 60 | } 61 | 62 | - (UIColor *)generateBackgroundColor 63 | { 64 | NSArray *colors = @[[UIColor redColor], [UIColor whiteColor], [UIColor greenColor], [UIColor blueColor], [UIColor purpleColor], [UIColor yellowColor]]; 65 | UIColor *color = colors[(NSUInteger)arc4random_uniform((unsigned int)[colors count])]; 66 | 67 | if (self.presentingViewController && [self.presentingViewController.view.backgroundColor isEqual:color]) { 68 | return [self generateBackgroundColor]; 69 | } 70 | 71 | return color; 72 | } 73 | 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /TransitionBug/BCTransition.m: -------------------------------------------------------------------------------- 1 | // 2 | // BCTransition.m 3 | // TransitionBug 4 | // 5 | // Created by Ben Cherry on 8/8/14. 6 | // Copyright (c) 2014 Ben Cherry. All rights reserved. 7 | // 8 | 9 | #import "BCTransition.h" 10 | 11 | @interface BCTransition () 12 | 13 | @property (nonatomic, assign) BOOL presenting; 14 | 15 | @end 16 | 17 | @implementation BCTransition 18 | 19 | #pragma mark - UIViewControllerTransitioningDelegate 20 | 21 | - (id)animationControllerForPresentedController:(UIViewController *)presented 22 | presentingController:(UIViewController *)presenting 23 | sourceController:(UIViewController *)source { 24 | self.presenting = YES; 25 | return self; 26 | } 27 | 28 | - (id)animationControllerForDismissedController:(UIViewController *)dismissed 29 | { 30 | self.presenting = NO; 31 | return self; 32 | } 33 | 34 | #pragma mark - UIViewControllerAnimatedTransitioning 35 | 36 | - (NSTimeInterval)transitionDuration:(id)transitionContext 37 | { 38 | return 0.3; 39 | } 40 | 41 | - (void)animateTransition:(id)transitionContext 42 | { 43 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 44 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 45 | 46 | UIView *fromView = [transitionContext respondsToSelector:@selector(viewForKey:)] ? [transitionContext viewForKey:UITransitionContextFromViewKey] : fromViewController.view; 47 | UIView *toView = [transitionContext respondsToSelector:@selector(viewForKey:)] ? [transitionContext viewForKey:UITransitionContextToViewKey] : toViewController.view; 48 | 49 | if (self.presenting) { 50 | [transitionContext.containerView addSubview:toView]; 51 | [transitionContext.containerView addSubview:fromView]; 52 | 53 | [toViewController beginAppearanceTransition:YES animated:YES]; 54 | [fromViewController beginAppearanceTransition:NO animated:YES]; 55 | [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 options:0 animations:^{ 56 | CGRect frame = fromView.frame; 57 | frame.origin.x = -frame.size.width; 58 | fromView.frame = frame; 59 | } completion:^(BOOL finished) { 60 | [toViewController endAppearanceTransition]; 61 | [fromViewController endAppearanceTransition]; 62 | [transitionContext completeTransition:finished]; 63 | }]; 64 | } else { 65 | [transitionContext.containerView addSubview:fromView]; 66 | [transitionContext.containerView addSubview:toView]; 67 | 68 | [toViewController beginAppearanceTransition:YES animated:YES]; 69 | [fromViewController beginAppearanceTransition:NO animated:YES]; 70 | CGRect frame = toView.frame; 71 | frame.origin.x = -frame.size.width; 72 | toView.frame = frame; 73 | [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 options:0 animations:^{ 74 | CGRect frame = toView.frame; 75 | frame.origin.x = 0; 76 | toView.frame = frame; 77 | } completion:^(BOOL finished) { 78 | [toViewController endAppearanceTransition]; 79 | [fromViewController endAppearanceTransition]; 80 | [transitionContext completeTransition:finished]; 81 | }]; 82 | } 83 | } 84 | 85 | 86 | @end 87 | -------------------------------------------------------------------------------- /TransitionBug.xcodeproj/xcuserdata/bcherry.xcuserdatad/xcschemes/TransitionBug.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /TransitionBug.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6AACFC60199544F500909948 /* BCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AACFC5F199544F500909948 /* BCViewController.m */; }; 11 | 6AACFC63199549CB00909948 /* BCTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AACFC62199549CB00909948 /* BCTransition.m */; }; 12 | 6AE657BF1995446D0044B325 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657BE1995446D0044B325 /* Foundation.framework */; }; 13 | 6AE657C11995446D0044B325 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657C01995446D0044B325 /* CoreGraphics.framework */; }; 14 | 6AE657C31995446D0044B325 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657C21995446D0044B325 /* UIKit.framework */; }; 15 | 6AE657C91995446D0044B325 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6AE657C71995446D0044B325 /* InfoPlist.strings */; }; 16 | 6AE657CB1995446D0044B325 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AE657CA1995446D0044B325 /* main.m */; }; 17 | 6AE657CF1995446D0044B325 /* BCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AE657CE1995446D0044B325 /* BCAppDelegate.m */; }; 18 | 6AE657D11995446D0044B325 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6AE657D01995446D0044B325 /* Images.xcassets */; }; 19 | 6AE657D81995446D0044B325 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657D71995446D0044B325 /* XCTest.framework */; }; 20 | 6AE657D91995446D0044B325 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657BE1995446D0044B325 /* Foundation.framework */; }; 21 | 6AE657DA1995446D0044B325 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AE657C21995446D0044B325 /* UIKit.framework */; }; 22 | 6AE657E21995446D0044B325 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6AE657E01995446D0044B325 /* InfoPlist.strings */; }; 23 | 6AE657E41995446D0044B325 /* TransitionBugTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AE657E31995446D0044B325 /* TransitionBugTests.m */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | 6AE657DB1995446D0044B325 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 6AE657B31995446C0044B325 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 6AE657BA1995446C0044B325; 32 | remoteInfo = TransitionBug; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | 6AACFC5E199544F500909948 /* BCViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BCViewController.h; sourceTree = ""; }; 38 | 6AACFC5F199544F500909948 /* BCViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BCViewController.m; sourceTree = ""; }; 39 | 6AACFC61199549CB00909948 /* BCTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BCTransition.h; sourceTree = ""; }; 40 | 6AACFC62199549CB00909948 /* BCTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BCTransition.m; sourceTree = ""; }; 41 | 6AE657BB1995446D0044B325 /* TransitionBug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransitionBug.app; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 6AE657BE1995446D0044B325 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 43 | 6AE657C01995446D0044B325 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 44 | 6AE657C21995446D0044B325 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 45 | 6AE657C61995446D0044B325 /* TransitionBug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TransitionBug-Info.plist"; sourceTree = ""; }; 46 | 6AE657C81995446D0044B325 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 47 | 6AE657CA1995446D0044B325 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 48 | 6AE657CC1995446D0044B325 /* TransitionBug-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TransitionBug-Prefix.pch"; sourceTree = ""; }; 49 | 6AE657CD1995446D0044B325 /* BCAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BCAppDelegate.h; sourceTree = ""; }; 50 | 6AE657CE1995446D0044B325 /* BCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BCAppDelegate.m; sourceTree = ""; }; 51 | 6AE657D01995446D0044B325 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 52 | 6AE657D61995446D0044B325 /* TransitionBugTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TransitionBugTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 6AE657D71995446D0044B325 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 54 | 6AE657DF1995446D0044B325 /* TransitionBugTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TransitionBugTests-Info.plist"; sourceTree = ""; }; 55 | 6AE657E11995446D0044B325 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 56 | 6AE657E31995446D0044B325 /* TransitionBugTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TransitionBugTests.m; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | 6AE657B81995446C0044B325 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | 6AE657C11995446D0044B325 /* CoreGraphics.framework in Frameworks */, 65 | 6AE657C31995446D0044B325 /* UIKit.framework in Frameworks */, 66 | 6AE657BF1995446D0044B325 /* Foundation.framework in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | 6AE657D31995446D0044B325 /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | 6AE657D81995446D0044B325 /* XCTest.framework in Frameworks */, 75 | 6AE657DA1995446D0044B325 /* UIKit.framework in Frameworks */, 76 | 6AE657D91995446D0044B325 /* Foundation.framework in Frameworks */, 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | /* End PBXFrameworksBuildPhase section */ 81 | 82 | /* Begin PBXGroup section */ 83 | 6AE657B21995446C0044B325 = { 84 | isa = PBXGroup; 85 | children = ( 86 | 6AE657C41995446D0044B325 /* TransitionBug */, 87 | 6AE657DD1995446D0044B325 /* TransitionBugTests */, 88 | 6AE657BD1995446D0044B325 /* Frameworks */, 89 | 6AE657BC1995446D0044B325 /* Products */, 90 | ); 91 | sourceTree = ""; 92 | }; 93 | 6AE657BC1995446D0044B325 /* Products */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 6AE657BB1995446D0044B325 /* TransitionBug.app */, 97 | 6AE657D61995446D0044B325 /* TransitionBugTests.xctest */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | 6AE657BD1995446D0044B325 /* Frameworks */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 6AE657BE1995446D0044B325 /* Foundation.framework */, 106 | 6AE657C01995446D0044B325 /* CoreGraphics.framework */, 107 | 6AE657C21995446D0044B325 /* UIKit.framework */, 108 | 6AE657D71995446D0044B325 /* XCTest.framework */, 109 | ); 110 | name = Frameworks; 111 | sourceTree = ""; 112 | }; 113 | 6AE657C41995446D0044B325 /* TransitionBug */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 6AE657CD1995446D0044B325 /* BCAppDelegate.h */, 117 | 6AE657CE1995446D0044B325 /* BCAppDelegate.m */, 118 | 6AE657D01995446D0044B325 /* Images.xcassets */, 119 | 6AE657C51995446D0044B325 /* Supporting Files */, 120 | 6AACFC5E199544F500909948 /* BCViewController.h */, 121 | 6AACFC5F199544F500909948 /* BCViewController.m */, 122 | 6AACFC61199549CB00909948 /* BCTransition.h */, 123 | 6AACFC62199549CB00909948 /* BCTransition.m */, 124 | ); 125 | path = TransitionBug; 126 | sourceTree = ""; 127 | }; 128 | 6AE657C51995446D0044B325 /* Supporting Files */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 6AE657C61995446D0044B325 /* TransitionBug-Info.plist */, 132 | 6AE657C71995446D0044B325 /* InfoPlist.strings */, 133 | 6AE657CA1995446D0044B325 /* main.m */, 134 | 6AE657CC1995446D0044B325 /* TransitionBug-Prefix.pch */, 135 | ); 136 | name = "Supporting Files"; 137 | sourceTree = ""; 138 | }; 139 | 6AE657DD1995446D0044B325 /* TransitionBugTests */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 6AE657E31995446D0044B325 /* TransitionBugTests.m */, 143 | 6AE657DE1995446D0044B325 /* Supporting Files */, 144 | ); 145 | path = TransitionBugTests; 146 | sourceTree = ""; 147 | }; 148 | 6AE657DE1995446D0044B325 /* Supporting Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 6AE657DF1995446D0044B325 /* TransitionBugTests-Info.plist */, 152 | 6AE657E01995446D0044B325 /* InfoPlist.strings */, 153 | ); 154 | name = "Supporting Files"; 155 | sourceTree = ""; 156 | }; 157 | /* End PBXGroup section */ 158 | 159 | /* Begin PBXNativeTarget section */ 160 | 6AE657BA1995446C0044B325 /* TransitionBug */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = 6AE657E71995446D0044B325 /* Build configuration list for PBXNativeTarget "TransitionBug" */; 163 | buildPhases = ( 164 | 6AE657B71995446C0044B325 /* Sources */, 165 | 6AE657B81995446C0044B325 /* Frameworks */, 166 | 6AE657B91995446C0044B325 /* Resources */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | ); 172 | name = TransitionBug; 173 | productName = TransitionBug; 174 | productReference = 6AE657BB1995446D0044B325 /* TransitionBug.app */; 175 | productType = "com.apple.product-type.application"; 176 | }; 177 | 6AE657D51995446D0044B325 /* TransitionBugTests */ = { 178 | isa = PBXNativeTarget; 179 | buildConfigurationList = 6AE657EA1995446D0044B325 /* Build configuration list for PBXNativeTarget "TransitionBugTests" */; 180 | buildPhases = ( 181 | 6AE657D21995446D0044B325 /* Sources */, 182 | 6AE657D31995446D0044B325 /* Frameworks */, 183 | 6AE657D41995446D0044B325 /* Resources */, 184 | ); 185 | buildRules = ( 186 | ); 187 | dependencies = ( 188 | 6AE657DC1995446D0044B325 /* PBXTargetDependency */, 189 | ); 190 | name = TransitionBugTests; 191 | productName = TransitionBugTests; 192 | productReference = 6AE657D61995446D0044B325 /* TransitionBugTests.xctest */; 193 | productType = "com.apple.product-type.bundle.unit-test"; 194 | }; 195 | /* End PBXNativeTarget section */ 196 | 197 | /* Begin PBXProject section */ 198 | 6AE657B31995446C0044B325 /* Project object */ = { 199 | isa = PBXProject; 200 | attributes = { 201 | CLASSPREFIX = BC; 202 | LastUpgradeCheck = 0510; 203 | ORGANIZATIONNAME = "Ben Cherry"; 204 | TargetAttributes = { 205 | 6AE657D51995446D0044B325 = { 206 | TestTargetID = 6AE657BA1995446C0044B325; 207 | }; 208 | }; 209 | }; 210 | buildConfigurationList = 6AE657B61995446C0044B325 /* Build configuration list for PBXProject "TransitionBug" */; 211 | compatibilityVersion = "Xcode 3.2"; 212 | developmentRegion = English; 213 | hasScannedForEncodings = 0; 214 | knownRegions = ( 215 | en, 216 | ); 217 | mainGroup = 6AE657B21995446C0044B325; 218 | productRefGroup = 6AE657BC1995446D0044B325 /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | 6AE657BA1995446C0044B325 /* TransitionBug */, 223 | 6AE657D51995446D0044B325 /* TransitionBugTests */, 224 | ); 225 | }; 226 | /* End PBXProject section */ 227 | 228 | /* Begin PBXResourcesBuildPhase section */ 229 | 6AE657B91995446C0044B325 /* Resources */ = { 230 | isa = PBXResourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | 6AE657C91995446D0044B325 /* InfoPlist.strings in Resources */, 234 | 6AE657D11995446D0044B325 /* Images.xcassets in Resources */, 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | 6AE657D41995446D0044B325 /* Resources */ = { 239 | isa = PBXResourcesBuildPhase; 240 | buildActionMask = 2147483647; 241 | files = ( 242 | 6AE657E21995446D0044B325 /* InfoPlist.strings in Resources */, 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | /* End PBXResourcesBuildPhase section */ 247 | 248 | /* Begin PBXSourcesBuildPhase section */ 249 | 6AE657B71995446C0044B325 /* Sources */ = { 250 | isa = PBXSourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | 6AACFC60199544F500909948 /* BCViewController.m in Sources */, 254 | 6AACFC63199549CB00909948 /* BCTransition.m in Sources */, 255 | 6AE657CB1995446D0044B325 /* main.m in Sources */, 256 | 6AE657CF1995446D0044B325 /* BCAppDelegate.m in Sources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | 6AE657D21995446D0044B325 /* Sources */ = { 261 | isa = PBXSourcesBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | 6AE657E41995446D0044B325 /* TransitionBugTests.m in Sources */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXSourcesBuildPhase section */ 269 | 270 | /* Begin PBXTargetDependency section */ 271 | 6AE657DC1995446D0044B325 /* PBXTargetDependency */ = { 272 | isa = PBXTargetDependency; 273 | target = 6AE657BA1995446C0044B325 /* TransitionBug */; 274 | targetProxy = 6AE657DB1995446D0044B325 /* PBXContainerItemProxy */; 275 | }; 276 | /* End PBXTargetDependency section */ 277 | 278 | /* Begin PBXVariantGroup section */ 279 | 6AE657C71995446D0044B325 /* InfoPlist.strings */ = { 280 | isa = PBXVariantGroup; 281 | children = ( 282 | 6AE657C81995446D0044B325 /* en */, 283 | ); 284 | name = InfoPlist.strings; 285 | sourceTree = ""; 286 | }; 287 | 6AE657E01995446D0044B325 /* InfoPlist.strings */ = { 288 | isa = PBXVariantGroup; 289 | children = ( 290 | 6AE657E11995446D0044B325 /* en */, 291 | ); 292 | name = InfoPlist.strings; 293 | sourceTree = ""; 294 | }; 295 | /* End PBXVariantGroup section */ 296 | 297 | /* Begin XCBuildConfiguration section */ 298 | 6AE657E51995446D0044B325 /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ALWAYS_SEARCH_USER_PATHS = NO; 302 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 303 | CLANG_CXX_LIBRARY = "libc++"; 304 | CLANG_ENABLE_MODULES = YES; 305 | CLANG_ENABLE_OBJC_ARC = YES; 306 | CLANG_WARN_BOOL_CONVERSION = YES; 307 | CLANG_WARN_CONSTANT_CONVERSION = YES; 308 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 309 | CLANG_WARN_EMPTY_BODY = YES; 310 | CLANG_WARN_ENUM_CONVERSION = YES; 311 | CLANG_WARN_INT_CONVERSION = YES; 312 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 313 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 314 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 315 | COPY_PHASE_STRIP = NO; 316 | GCC_C_LANGUAGE_STANDARD = gnu99; 317 | GCC_DYNAMIC_NO_PIC = NO; 318 | GCC_OPTIMIZATION_LEVEL = 0; 319 | GCC_PREPROCESSOR_DEFINITIONS = ( 320 | "DEBUG=1", 321 | "$(inherited)", 322 | ); 323 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 324 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 325 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 326 | GCC_WARN_UNDECLARED_SELECTOR = YES; 327 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 328 | GCC_WARN_UNUSED_FUNCTION = YES; 329 | GCC_WARN_UNUSED_VARIABLE = YES; 330 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 331 | ONLY_ACTIVE_ARCH = YES; 332 | SDKROOT = iphoneos; 333 | }; 334 | name = Debug; 335 | }; 336 | 6AE657E61995446D0044B325 /* Release */ = { 337 | isa = XCBuildConfiguration; 338 | buildSettings = { 339 | ALWAYS_SEARCH_USER_PATHS = NO; 340 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 341 | CLANG_CXX_LIBRARY = "libc++"; 342 | CLANG_ENABLE_MODULES = YES; 343 | CLANG_ENABLE_OBJC_ARC = YES; 344 | CLANG_WARN_BOOL_CONVERSION = YES; 345 | CLANG_WARN_CONSTANT_CONVERSION = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INT_CONVERSION = YES; 350 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 351 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 352 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 353 | COPY_PHASE_STRIP = YES; 354 | ENABLE_NS_ASSERTIONS = NO; 355 | GCC_C_LANGUAGE_STANDARD = gnu99; 356 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 357 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 358 | GCC_WARN_UNDECLARED_SELECTOR = YES; 359 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 360 | GCC_WARN_UNUSED_FUNCTION = YES; 361 | GCC_WARN_UNUSED_VARIABLE = YES; 362 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 363 | SDKROOT = iphoneos; 364 | VALIDATE_PRODUCT = YES; 365 | }; 366 | name = Release; 367 | }; 368 | 6AE657E81995446D0044B325 /* Debug */ = { 369 | isa = XCBuildConfiguration; 370 | buildSettings = { 371 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 372 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 373 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 374 | GCC_PREFIX_HEADER = "TransitionBug/TransitionBug-Prefix.pch"; 375 | INFOPLIST_FILE = "TransitionBug/TransitionBug-Info.plist"; 376 | PRODUCT_NAME = "$(TARGET_NAME)"; 377 | WRAPPER_EXTENSION = app; 378 | }; 379 | name = Debug; 380 | }; 381 | 6AE657E91995446D0044B325 /* Release */ = { 382 | isa = XCBuildConfiguration; 383 | buildSettings = { 384 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 385 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 386 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 387 | GCC_PREFIX_HEADER = "TransitionBug/TransitionBug-Prefix.pch"; 388 | INFOPLIST_FILE = "TransitionBug/TransitionBug-Info.plist"; 389 | PRODUCT_NAME = "$(TARGET_NAME)"; 390 | WRAPPER_EXTENSION = app; 391 | }; 392 | name = Release; 393 | }; 394 | 6AE657EB1995446D0044B325 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TransitionBug.app/TransitionBug"; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(SDKROOT)/Developer/Library/Frameworks", 400 | "$(inherited)", 401 | "$(DEVELOPER_FRAMEWORKS_DIR)", 402 | ); 403 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 404 | GCC_PREFIX_HEADER = "TransitionBug/TransitionBug-Prefix.pch"; 405 | GCC_PREPROCESSOR_DEFINITIONS = ( 406 | "DEBUG=1", 407 | "$(inherited)", 408 | ); 409 | INFOPLIST_FILE = "TransitionBugTests/TransitionBugTests-Info.plist"; 410 | PRODUCT_NAME = "$(TARGET_NAME)"; 411 | TEST_HOST = "$(BUNDLE_LOADER)"; 412 | WRAPPER_EXTENSION = xctest; 413 | }; 414 | name = Debug; 415 | }; 416 | 6AE657EC1995446D0044B325 /* Release */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TransitionBug.app/TransitionBug"; 420 | FRAMEWORK_SEARCH_PATHS = ( 421 | "$(SDKROOT)/Developer/Library/Frameworks", 422 | "$(inherited)", 423 | "$(DEVELOPER_FRAMEWORKS_DIR)", 424 | ); 425 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 426 | GCC_PREFIX_HEADER = "TransitionBug/TransitionBug-Prefix.pch"; 427 | INFOPLIST_FILE = "TransitionBugTests/TransitionBugTests-Info.plist"; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | TEST_HOST = "$(BUNDLE_LOADER)"; 430 | WRAPPER_EXTENSION = xctest; 431 | }; 432 | name = Release; 433 | }; 434 | /* End XCBuildConfiguration section */ 435 | 436 | /* Begin XCConfigurationList section */ 437 | 6AE657B61995446C0044B325 /* Build configuration list for PBXProject "TransitionBug" */ = { 438 | isa = XCConfigurationList; 439 | buildConfigurations = ( 440 | 6AE657E51995446D0044B325 /* Debug */, 441 | 6AE657E61995446D0044B325 /* Release */, 442 | ); 443 | defaultConfigurationIsVisible = 0; 444 | defaultConfigurationName = Release; 445 | }; 446 | 6AE657E71995446D0044B325 /* Build configuration list for PBXNativeTarget "TransitionBug" */ = { 447 | isa = XCConfigurationList; 448 | buildConfigurations = ( 449 | 6AE657E81995446D0044B325 /* Debug */, 450 | 6AE657E91995446D0044B325 /* Release */, 451 | ); 452 | defaultConfigurationIsVisible = 0; 453 | defaultConfigurationName = Release; 454 | }; 455 | 6AE657EA1995446D0044B325 /* Build configuration list for PBXNativeTarget "TransitionBugTests" */ = { 456 | isa = XCConfigurationList; 457 | buildConfigurations = ( 458 | 6AE657EB1995446D0044B325 /* Debug */, 459 | 6AE657EC1995446D0044B325 /* Release */, 460 | ); 461 | defaultConfigurationIsVisible = 0; 462 | defaultConfigurationName = Release; 463 | }; 464 | /* End XCConfigurationList section */ 465 | }; 466 | rootObject = 6AE657B31995446C0044B325 /* Project object */; 467 | } 468 | --------------------------------------------------------------------------------