├── ZoomTransitionExample ├── ZoomSegueExample │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── AppDelegate.h │ ├── Controllers │ │ ├── KittenCollectionViewController.h │ │ ├── KittenDetailViewController.h │ │ ├── KittenDetailViewController.m │ │ └── KittenCollectionViewController.m │ ├── Example.pch │ ├── AppDelegate.m │ ├── main.m │ ├── Cells │ │ ├── KittenCell.h │ │ └── KittenCell.m │ ├── Images.xcassets │ │ ├── LaunchImage.launchimage │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Example.plist │ └── Storyboard.storyboard ├── Podfile └── ZoomTransitionExample.xcodeproj │ └── project.pbxproj ├── ZoomInteractiveTransition.gif ├── .gitignore ├── ZoomInteractiveTransition.podspec ├── LICENSE ├── ZoomTransition ├── UIView+Snapshotting.h ├── UIView+Snapshotting.m ├── ZoomInteractiveTransition.h ├── ZoomTransitionProtocol.h └── ZoomInteractiveTransition.m └── README.md /ZoomTransitionExample/ZoomSegueExample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ZoomInteractiveTransition.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DenTelezhkin/ZoomInteractiveTransition/HEAD/ZoomInteractiveTransition.gif -------------------------------------------------------------------------------- /ZoomTransitionExample/Podfile: -------------------------------------------------------------------------------- 1 | inhibit_all_warnings! 2 | 3 | target "ZoomTransitionExample" do 4 | pod 'PlaceKit' 5 | end 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | */build/* 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | profile 14 | *.moved-aside 15 | DerivedData 16 | .idea/ 17 | *.hmap 18 | *.xccheckout 19 | 20 | #CocoaPods 21 | Pods 22 | Podfile.lock 23 | *.xcworkspace -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Controllers/KittenCollectionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // KittenCollectionViewController.h 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface KittenCollectionViewController : UICollectionViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Example.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 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | return YES; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Controllers/KittenDetailViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // KittenDetailViewController.h 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ZoomInteractiveTransition.h" 11 | 12 | @interface KittenDetailViewController : UIViewController 13 | 14 | @property (nonatomic, strong) UIImage * kittenImage; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Cells/KittenCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // KittenCell.h 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface KittenCell : UICollectionViewCell 12 | @property (weak, nonatomic) IBOutlet UIImageView *kittenImage; 13 | @property (weak, nonatomic) IBOutlet UILabel *kittenName; 14 | 15 | -(void)updateWithKitten:(NSString *)kitten; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Cells/KittenCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // KittenCell.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import "KittenCell.h" 10 | #import "PlaceKit.h" 11 | 12 | @implementation KittenCell 13 | 14 | -(void)updateWithKitten:(NSString *)kitten 15 | { 16 | self.kittenName.text = kitten; 17 | 18 | [PlaceKit placeRandomImageWithSize:CGSizeMake(320, 320) 19 | category:@"cats" 20 | completion:^(UIImage *randomImage) { 21 | [self.kittenImage setImage:randomImage]; 22 | }]; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ZoomInteractiveTransition.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "ZoomInteractiveTransition" 4 | s.version = "0.4.0" 5 | s.summary = "Simple zoom transition using iOS 7 Custom View Controller Transitions API" 6 | 7 | s.homepage = "https://github.com/DenHeadless/ZoomInteractiveTransition" 8 | s.license = "MIT" 9 | 10 | s.author = { "Denys Telezhkin" => "denys.telezhkin@yandex.ru" } 11 | s.social_media_url = "http://twitter.com/DTCoder" 12 | 13 | s.platform = :ios, "7.0" 14 | 15 | s.source = { :git => "https://github.com/DenHeadless/ZoomInteractiveTransition.git", :tag => s.version.to_s } 16 | s.source_files = "ZoomTransition" 17 | 18 | s.frameworks = "Foundation", "UIKit" 19 | s.requires_arc = true 20 | 21 | end 22 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Controllers/KittenDetailViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // KittenDetailViewController.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import "KittenDetailViewController.h" 10 | #import "ZoomTransitionProtocol.h" 11 | 12 | @interface KittenDetailViewController () 13 | 14 | @property (weak, nonatomic) IBOutlet UIImageView *kittenImageView; 15 | 16 | @end 17 | 18 | @implementation KittenDetailViewController 19 | 20 | -(void)viewDidLoad 21 | { 22 | [super viewDidLoad]; 23 | 24 | [self.kittenImageView setImage:self.kittenImage]; 25 | } 26 | 27 | #pragma mark - ZoomTransitionProtocol 28 | 29 | -(UIView *)viewForZoomTransition:(BOOL)isSource 30 | { 31 | return self.kittenImageView; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Denys Telezhkin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/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 | "orientation" : "portrait", 20 | "idiom" : "ipad", 21 | "extent" : "full-screen", 22 | "minimum-system-version" : "7.0", 23 | "scale" : "1x" 24 | }, 25 | { 26 | "orientation" : "landscape", 27 | "idiom" : "ipad", 28 | "extent" : "full-screen", 29 | "minimum-system-version" : "7.0", 30 | "scale" : "1x" 31 | }, 32 | { 33 | "orientation" : "portrait", 34 | "idiom" : "ipad", 35 | "extent" : "full-screen", 36 | "minimum-system-version" : "7.0", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "orientation" : "landscape", 41 | "idiom" : "ipad", 42 | "extent" : "full-screen", 43 | "minimum-system-version" : "7.0", 44 | "scale" : "2x" 45 | } 46 | ], 47 | "info" : { 48 | "version" : 1, 49 | "author" : "xcode" 50 | } 51 | } -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /ZoomTransition/UIView+Snapshotting.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Snapshotting.h 3 | // ZoomTransitionExample 4 | // 5 | // Created by Denys Telezhkin on 03.07.14. 6 | // 7 | // Copyright (c) 2014 Denys Telezhkin 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | 29 | @interface UIView (Snapshotting) 30 | 31 | /** 32 | Take snapshot of a view by using pre-iOS 7 snapshotting. 33 | 34 | @return UIImage of rendered UIView. 35 | */ 36 | -(UIImage *)dt_takeSnapshot; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Example.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 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 | UIMainStoryboardFile 28 | Storyboard 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | NSAppTransportSecurity 40 | 41 | NSAllowsArbitraryLoads 42 | 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /ZoomTransition/UIView+Snapshotting.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Snapshotting.m 3 | // ZoomTransitionExample 4 | // 5 | // Created by Denys Telezhkin on 03.07.14. 6 | // 7 | // Copyright (c) 2014 Denys Telezhkin 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "UIView+Snapshotting.h" 28 | 29 | @implementation UIView (Snapshotting) 30 | 31 | -(UIImage *)dt_takeSnapshot 32 | { 33 | // Use pre iOS-7 snapshot API since we need to render views that are off-screen. 34 | // iOS 7 snapshot API allows us to snapshot only things on screen 35 | UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, [UIScreen mainScreen].scale); 36 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 37 | [self.layer renderInContext:ctx]; 38 | UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); 39 | UIGraphicsEndImageContext(); 40 | return snapshot; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![CocoaPod platform](https://cocoapod-badges.herokuapp.com/p/ZoomInteractiveTransition/badge.png)   2 | ![CocoaPod version](https://cocoapod-badges.herokuapp.com/v/ZoomInteractiveTransition/badge.png)   3 | [![Packagist](https://img.shields.io/packagist/l/doctrine/orm.svg)]() 4 | 5 | ZoomInteractiveTransition 6 | ======================= 7 | 8 | Simple zoom transition, inspired by iOS 7 Photos.app. Example: 9 | 10 | ![](ZoomInteractiveTransition.gif) 11 | 12 | ## Project status 13 | 14 | This project is a showcase of what's possible rather than completely ready drop-in framework. If you are looking for more full-fledged and actively developed solution, I suggest looking at [Hero](https://github.com/lkzhao/Hero). 15 | 16 | ## Usage 17 | 18 | **1.** Create ZoomInteractiveTransition instance and pass your UINavigationController to constructor. 19 | 20 | ```objective-c 21 | self.transition = [[ZoomInteractiveTransition alloc] initWithNavigationController:self.navigationController]; 22 | ``` 23 | 24 | **2.** Adopt ZoomTransitionProtocol by both source and destination view controllers and implement a single method 25 | 26 | ```objective-c 27 | -(UIView *)viewForZoomTransition:(BOOL)isSource 28 | { 29 | return ; 30 | } 31 | ``` 32 | 33 | And that's it! All frame calculation and animations are performed automatically. ZoomInteractiveTransition creates a snapshot of source and destination view, chooses bigger one, and uses this snapshot to animate between source and destination view. 34 | 35 | ## Requirements 36 | 37 | * iOS 7 38 | * ARC 39 | 40 | ## Customization 41 | 42 | Available customizations: 43 | 44 | * Duration 45 | * Animation curve 46 | * Interactive pop back gesture 47 | * Initial snapshot 48 | * Completion block 49 | 50 | Additionally, you can plug in your own keyframe animations, that will run alongside interactive transition. These can be supplied via optional method animationBlockForZoomTransition. 51 | 52 | ## Example 53 | 54 | Example with cats is provided in ZoomTransitionExample folder. 55 | 56 | *Note:* PlaceKit.framework, that is used in Example project, requires ssh key to clone it's repository, so you may need to add Github SSH key on your local machine to be able to install example project. [Instructions](https://help.github.com/articles/generating-ssh-keys/). 57 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Controllers/KittenCollectionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // KittenCollectionViewController.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // Copyright (c) 2014 Denys Telezhkin. All rights reserved. 7 | // 8 | 9 | #import "KittenCollectionViewController.h" 10 | #import "PlaceKit.h" 11 | #import "KittenCell.h" 12 | #import "KittenDetailViewController.h" 13 | #import "ZoomInteractiveTransition.h" 14 | #import "ZoomTransitionProtocol.h" 15 | 16 | @interface KittenCollectionViewController () 17 | 18 | @property (nonatomic, strong) NSArray * names; 19 | @property (nonatomic, strong) ZoomInteractiveTransition * transition; 20 | @property (nonatomic, strong) NSIndexPath * selectedIndexPath; 21 | 22 | @end 23 | 24 | @implementation KittenCollectionViewController 25 | 26 | -(void)viewDidLoad 27 | { 28 | [super viewDidLoad]; 29 | 30 | self.names = [self kittensArrayOfSize:50]; 31 | self.transition = [[ZoomInteractiveTransition alloc] initWithNavigationController:self.navigationController]; 32 | } 33 | 34 | -(NSArray *)kittensArrayOfSize:(NSInteger)size 35 | { 36 | NSMutableArray * kittensArray = [NSMutableArray arrayWithCapacity:size]; 37 | for (int i=0;i 36 | 37 | /** 38 | UINavigationController, that wants to participate in zoom transition 39 | */ 40 | @property (nonatomic, assign) UINavigationController * navigationController; 41 | 42 | /** 43 | Zoom transition duration. Default value is 0.3 seconds. 44 | */ 45 | @property (nonatomic, assign) CGFloat transitionDuration; 46 | 47 | /** 48 | If set to YES, UIScreenEdgePanGestureRecognizer will be automatically added to destinationView. It will allow interactive pop gesture. Default value is YES. 49 | */ 50 | @property (nonatomic, assign) BOOL handleEdgePanBackGesture; 51 | 52 | /** 53 | Animation option for keyframe animations used to transition between views. Default value is UIViewKeyframeAnimationOptionCalculationModeCubic. 54 | */ 55 | @property (nonatomic, assign) UIViewKeyframeAnimationOptions transitionAnimationOption; 56 | 57 | 58 | /** 59 | Designated initializer for ZoomInteractiveTransition. If created using this method, it will set itself as a delegate for UINavigationController. 60 | 61 | If you choose not to use it, you will need to implement UINavigationControllerDelegate methods for animated transitioning, and provide ZoomInteractiveTransition instance yourself. 62 | 63 | @param nc UINavigationController, that will use zoom animations 64 | 65 | @return ZoomInteractiveTransition instance. 66 | */ 67 | - (instancetype)initWithNavigationController:(UINavigationController *)nc; 68 | 69 | /** 70 | * Public method to reset the navigation controller's delegate 71 | */ 72 | - (void)resetDelegate; 73 | 74 | @end 75 | -------------------------------------------------------------------------------- /ZoomTransition/ZoomTransitionProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // ZoomTransitionProtocol.h 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 30.06.14. 6 | // 7 | // Copyright (c) 2014 Denys Telezhkin 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | #import 27 | #import 28 | 29 | typedef void(^ZoomAnimationBlock)(UIImageView * animatedSnapshot, UIView * sourceView, UIView * destinationView); 30 | typedef void(^ZoomCompletionBlock)(UIImageView * animatedSnapshot, UIView * sourceView, UIView * destinationView, void(^completion)(void)); 31 | 32 | /** 33 | ZoomTransitionProtocol should be implemented by UIViewControllers, that wish to participate in zoom transition. 34 | */ 35 | 36 | @protocol ZoomTransitionProtocol 37 | 38 | /** 39 | UIView, that will be used for zoom transition. Both source and destination view controllers need to implement this method, otherwise ZoomInteractiveTransition will not be performed. 40 | 41 | @param isSource Boolean, that is true if the view controller implementing this method is the source view controller of a transition. 42 | 43 | @return UIView, that will participate in transition. 44 | */ 45 | -(UIView *)viewForZoomTransition:(BOOL)isSource; 46 | 47 | @optional 48 | 49 | /** 50 | By default, ZoomInteractiveTransition will choose bigger snapshot from source and destination view snapshots. Initial chosen snapshot will be passed to this method. You may choose to change it, or provide completely different snapshot that suits your needs better. Keep in mind, snapshot will be resized to destination view frame. 51 | 52 | @param snapshot Snapshot, that was prepared by ZoomInteractiveTransition 53 | 54 | @return snapshot, that you wish to use for zoom animation. 55 | */ 56 | -(UIImageView *)initialZoomViewSnapshotFromProposedSnapshot:(UIImageView *)snapshot; 57 | 58 | 59 | /** 60 | Custom animation block, that will be called inside UIView animateKeyFramesWithDuration:delay:options:animations:completion: method alongside with zooming animation. You can add your own keyframes to animation if you need. 61 | 62 | @return Animation block. 63 | */ 64 | -(ZoomAnimationBlock)animationBlockForZoomTransition; 65 | 66 | 67 | /** 68 | Custom animation block, that will be called inside UIView animateKeyFramesWithDuration:delay:options:animations:completion: method when the animation is completed. 69 | 70 | @return Animation block. 71 | */ 72 | -(ZoomCompletionBlock)completionBlockForZoomTransition; 73 | 74 | 75 | /** 76 | Decide if ZoomInteractiveTransition animator object is allowed. 77 | 78 | @param operation The type of transition operation that is occurring. For a list of possible values, see the “UINavigationControllerOperation” constants. 79 | 80 | @param fromVC The currently visible view controller. 81 | 82 | @param toVC The view controller that should be visible at the end of the transition. 83 | 84 | @return Yes to allow the zoom transition. 85 | */ 86 | -(BOOL)shouldAllowZoomTransitionForOperation:(UINavigationControllerOperation)operation 87 | fromViewController:(UIViewController *)fromVC 88 | toViewController:(UIViewController *)toVC; 89 | 90 | /** 91 | If ZoomInteractiveTransition animator object isn't allowed, return another one instead. 92 | 93 | @param toVC The view controller that should be visible at the end of the transition. 94 | 95 | @return The animator object responsible for managing the transition animations, or nil if you want to use the standard navigation controller transitions. The object you return must conform to the UIViewControllerAnimatorTransitioning protocol. 96 | */ 97 | -(id)animationControllerForTransitionToViewController:(UIViewController *)toVC; 98 | 99 | @end 100 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomSegueExample/Storyboard.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 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 | -------------------------------------------------------------------------------- /ZoomTransition/ZoomInteractiveTransition.m: -------------------------------------------------------------------------------- 1 | // 2 | // ZoomTransition.m 3 | // ZoomSegueExample 4 | // 5 | // Created by Denys Telezhkin on 29.06.14. 6 | // 7 | // Copyright (c) 2014 Denys Telezhkin 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "ZoomInteractiveTransition.h" 28 | #import "UIView+Snapshotting.h" 29 | 30 | @interface ZoomInteractiveTransition() 31 | 32 | @property (nonatomic, weak) id previousDelegate; 33 | @property (nonatomic, assign) CGFloat startScale; 34 | @property (nonatomic, assign) UINavigationControllerOperation operation; 35 | @property (nonatomic, assign) BOOL shouldCompleteTransition; 36 | @property (nonatomic, assign, getter = isInteractive) BOOL interactive; 37 | 38 | @end 39 | 40 | @implementation ZoomInteractiveTransition 41 | 42 | -(void)commonSetup 43 | { 44 | self.transitionDuration = 0.3; 45 | self.handleEdgePanBackGesture = YES; 46 | self.transitionAnimationOption = UIViewKeyframeAnimationOptionCalculationModeCubic; 47 | } 48 | 49 | - (void)resetDelegate { 50 | self.navigationController.delegate = self.previousDelegate; 51 | } 52 | 53 | - (instancetype)initWithNavigationController:(UINavigationController *)nc 54 | { 55 | if (self = [super init]) { 56 | self.navigationController = nc; 57 | self.previousDelegate = nc.delegate; 58 | nc.delegate = self; 59 | [self commonSetup]; 60 | } 61 | return self; 62 | } 63 | 64 | -(instancetype)init 65 | { 66 | if (self = [super init]) 67 | { 68 | [self commonSetup]; 69 | } 70 | return self; 71 | } 72 | 73 | #pragma mark - UIViewControllerAnimatedTransitioning 74 | 75 | -(NSTimeInterval)transitionDuration:(id)transitionContext 76 | { 77 | return self.transitionDuration; 78 | } 79 | 80 | -(UIImageView *)snapshotImageViewFromView:(UIView *)view { 81 | UIImage * snapshot = [view dt_takeSnapshot]; 82 | UIImageView * imageView = [[UIImageView alloc] initWithImage:snapshot]; 83 | imageView.contentMode = UIViewContentModeScaleAspectFill; 84 | imageView.clipsToBounds = YES; 85 | return imageView; 86 | } 87 | 88 | -(UIImageView *)initialZoomSnapshotFromView:(UIView *)sourceView 89 | destinationView:(UIView *)destinationView 90 | { 91 | return [self snapshotImageViewFromView:(sourceView.bounds.size.width > destinationView.bounds.size.width) ? sourceView : destinationView]; 92 | } 93 | 94 | -(void)animateTransition:(id)transitionContext 95 | { 96 | UIViewController * fromVC = (id)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 97 | UIViewController *toVC = (id)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 98 | UIView * containerView = [transitionContext containerView]; 99 | UIView * fromView = [fromVC view]; 100 | UIView * toView = [toVC view]; 101 | [containerView addSubview:fromView]; 102 | [containerView addSubview:toView]; 103 | 104 | // fix for rotation bug in iOS 9 105 | toVC.view.frame = [transitionContext finalFrameForViewController:toVC]; 106 | 107 | // original zoom view 108 | UIView * fromZoomView = [fromVC viewForZoomTransition:true]; 109 | UIView * toZoomView = [toVC viewForZoomTransition:false]; 110 | 111 | // prepare animating image view 112 | UIImageView * animatingImageView; 113 | if ([fromVC respondsToSelector:@selector(initialZoomViewSnapshotFromProposedSnapshot:)]) { 114 | animatingImageView = [fromVC initialZoomViewSnapshotFromProposedSnapshot:animatingImageView]; 115 | } 116 | if (!animatingImageView) { 117 | animatingImageView = [self initialZoomSnapshotFromView:fromZoomView destinationView:toZoomView]; 118 | } 119 | animatingImageView.frame = CGRectIntegral([fromZoomView.superview convertRect:fromZoomView.frame toView:containerView]); 120 | 121 | // hide original zoom views 122 | fromZoomView.alpha = 0; 123 | toZoomView.alpha = 0; 124 | 125 | // add animating background view 126 | UIImageView *backgroundView = [self snapshotImageViewFromView:fromView]; 127 | [containerView addSubview:backgroundView]; 128 | 129 | // add animating image view 130 | [containerView addSubview:animatingImageView]; 131 | 132 | // add edge pan gesture if it's going forward 133 | BOOL isGoingForward = [self.navigationController.viewControllers indexOfObject:fromVC] == (self.navigationController.viewControllers.count - 2); 134 | if (isGoingForward && self.handleEdgePanBackGesture) { 135 | BOOL wasAdded = NO; 136 | for (UIGestureRecognizer *gr in toVC.view.gestureRecognizers) { 137 | if ([gr isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { 138 | wasAdded = YES; 139 | break; 140 | } 141 | } 142 | if (!wasAdded) { 143 | UIScreenEdgePanGestureRecognizer *edgePanRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleEdgePan:)]; 144 | edgePanRecognizer.edges = UIRectEdgeLeft; 145 | [toVC.view addGestureRecognizer:edgePanRecognizer]; 146 | } 147 | } 148 | 149 | // animation 150 | [UIView animateKeyframesWithDuration:self.transitionDuration 151 | delay:0 152 | options:self.transitionAnimationOption 153 | animations:^{ 154 | animatingImageView.frame = CGRectIntegral([toZoomView.superview convertRect:toZoomView.frame toView:containerView]); 155 | backgroundView.alpha = 0; 156 | 157 | if ([fromVC respondsToSelector:@selector(animationBlockForZoomTransition)]) { 158 | ZoomAnimationBlock zoomAnimationBlock = [fromVC animationBlockForZoomTransition]; 159 | if (zoomAnimationBlock) { 160 | zoomAnimationBlock(animatingImageView, fromZoomView, toZoomView); 161 | } 162 | } 163 | } completion:^(BOOL finished) { 164 | dispatch_block_t completion = ^{ 165 | [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 166 | 167 | [animatingImageView removeFromSuperview]; 168 | [backgroundView removeFromSuperview]; 169 | 170 | fromZoomView.alpha = 1; 171 | toZoomView.alpha = 1; 172 | }; 173 | 174 | if ([fromVC respondsToSelector:@selector(completionBlockForZoomTransition)]) { 175 | ZoomCompletionBlock zoomCompletionBlock = [fromVC completionBlockForZoomTransition]; 176 | if (zoomCompletionBlock) { 177 | zoomCompletionBlock(animatingImageView, fromZoomView, toZoomView, completion); 178 | return; 179 | } 180 | } 181 | completion(); 182 | }]; 183 | } 184 | 185 | #pragma mark - edge back gesture handling 186 | 187 | - (void) handleEdgePan:(UIScreenEdgePanGestureRecognizer *)gr 188 | { 189 | CGPoint point = [gr translationInView:gr.view]; 190 | 191 | switch (gr.state) { 192 | case UIGestureRecognizerStateBegan: 193 | self.interactive = YES; 194 | [self.navigationController popViewControllerAnimated:YES]; 195 | break; 196 | case UIGestureRecognizerStateChanged: { 197 | CGFloat percent = point.x / gr.view.frame.size.width; 198 | self.shouldCompleteTransition = (percent > 0.25); 199 | 200 | [self updateInteractiveTransition: (percent <= 0.0) ? 0.0 : percent]; 201 | break; 202 | } 203 | case UIGestureRecognizerStateEnded: 204 | case UIGestureRecognizerStateCancelled: 205 | if (!self.shouldCompleteTransition || gr.state == UIGestureRecognizerStateCancelled) 206 | [self cancelInteractiveTransition]; 207 | else 208 | [self finishInteractiveTransition]; 209 | self.interactive = NO; 210 | break; 211 | default: 212 | break; 213 | } 214 | } 215 | 216 | #pragma mark - UINavigationControllerDelegate 217 | 218 | - (id)_return:(id)returnValue 219 | nC:(UINavigationController *)nC 220 | fromVC:(UIViewController *)fromVC 221 | toVC:(UIViewController *)toVC { 222 | if (!returnValue || !self.handleEdgePanBackGesture) { 223 | nC.interactivePopGestureRecognizer.delegate = (id )toVC; 224 | } 225 | return returnValue; 226 | } 227 | 228 | - (id)navigationController:(UINavigationController *)navigationController 229 | animationControllerForOperation:(UINavigationControllerOperation)operation 230 | fromViewController:(UIViewController *)fromVC 231 | toViewController:(UIViewController *)toVC { 232 | if (!navigationController) { 233 | return [self _return:nil nC:nil fromVC:nil toVC:nil]; 234 | } 235 | 236 | if (![fromVC conformsToProtocol:@protocol(ZoomTransitionProtocol)] || 237 | ![toVC conformsToProtocol:@protocol(ZoomTransitionProtocol)]) 238 | { 239 | return [self _return:nil nC:navigationController fromVC:fromVC toVC:toVC]; 240 | } 241 | 242 | // Force to load the views (loadView/viewDidLoad will be called) 243 | [fromVC view]; 244 | [toVC view]; 245 | 246 | if (![(id)fromVC viewForZoomTransition:YES] || 247 | ![(id)toVC viewForZoomTransition:NO]) 248 | { 249 | return [self _return:nil nC:navigationController fromVC:fromVC toVC:toVC]; 250 | } 251 | 252 | if (([fromVC respondsToSelector:@selector(shouldAllowZoomTransitionForOperation:fromViewController:toViewController:)] && 253 | ![(id)fromVC shouldAllowZoomTransitionForOperation:operation fromViewController:fromVC toViewController:toVC]) || 254 | ([toVC respondsToSelector:@selector(shouldAllowZoomTransitionForOperation:fromViewController:toViewController:)] && 255 | ![(id)toVC shouldAllowZoomTransitionForOperation:operation fromViewController:fromVC toViewController:toVC])) 256 | { 257 | if ([fromVC respondsToSelector:@selector(animationControllerForTransitionToViewController:)]) { 258 | id returnValue = [(id)fromVC animationControllerForTransitionToViewController:toVC]; 259 | return [self _return:returnValue nC:navigationController fromVC:fromVC toVC:toVC]; 260 | } else { 261 | return [self _return:nil nC:navigationController fromVC:fromVC toVC:toVC]; 262 | } 263 | } 264 | 265 | return [self _return:self nC:navigationController fromVC:fromVC toVC:toVC]; 266 | } 267 | 268 | - (id)navigationController:(UINavigationController *)navigationController 269 | interactionControllerForAnimationController:(id)animationController 270 | { 271 | if (!self.isInteractive) { 272 | return nil; 273 | } 274 | 275 | return self; 276 | } 277 | 278 | @end 279 | -------------------------------------------------------------------------------- /ZoomTransitionExample/ZoomTransitionExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9A7A7CA21965EE6C00B77DFF /* UIView+Snapshotting.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A7A7CA11965EE6C00B77DFF /* UIView+Snapshotting.m */; }; 11 | 9A9D7BFD1961EDFF00BA98BC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7BFC1961EDFF00BA98BC /* AppDelegate.m */; }; 12 | 9A9D7BFF1961EE0900BA98BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A9D7BFE1961EE0900BA98BC /* Images.xcassets */; }; 13 | 9A9D7C021961EE1C00BA98BC /* KittenCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7C011961EE1C00BA98BC /* KittenCell.m */; }; 14 | 9A9D7C071961EE2800BA98BC /* KittenCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7C041961EE2800BA98BC /* KittenCollectionViewController.m */; }; 15 | 9A9D7C081961EE2800BA98BC /* KittenDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7C061961EE2800BA98BC /* KittenDetailViewController.m */; }; 16 | 9A9D7C0A1961EE3100BA98BC /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A9D7C091961EE3100BA98BC /* Storyboard.storyboard */; }; 17 | 9A9D7C0F1961EE4E00BA98BC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7C0E1961EE4E00BA98BC /* main.m */; }; 18 | 9A9D7C121961EE6B00BA98BC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9A9D7C101961EE6B00BA98BC /* InfoPlist.strings */; }; 19 | 9A9D7C151961EF1100BA98BC /* ZoomInteractiveTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9D7C141961EF1100BA98BC /* ZoomInteractiveTransition.m */; }; 20 | C1AE193128D08C32F5ADD19A /* libPods-ZoomTransitionExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C9CF61A21E7D0EA5F24B957 /* libPods-ZoomTransitionExample.a */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 2741705BC69D5709710FDAC4 /* Pods-ZoomTransitionExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ZoomTransitionExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ZoomTransitionExample/Pods-ZoomTransitionExample.debug.xcconfig"; sourceTree = ""; }; 25 | 3C9CF61A21E7D0EA5F24B957 /* libPods-ZoomTransitionExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ZoomTransitionExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 9A7A7CA01965EE6C00B77DFF /* UIView+Snapshotting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+Snapshotting.h"; path = "../ZoomTransition/UIView+Snapshotting.h"; sourceTree = ""; }; 27 | 9A7A7CA11965EE6C00B77DFF /* UIView+Snapshotting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+Snapshotting.m"; path = "../ZoomTransition/UIView+Snapshotting.m"; sourceTree = ""; }; 28 | 9A7B9C7D195FFB17007F2011 /* ZoomTransitionExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZoomTransitionExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 9A9D7BFB1961EDFF00BA98BC /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ZoomSegueExample/AppDelegate.h; sourceTree = SOURCE_ROOT; }; 30 | 9A9D7BFC1961EDFF00BA98BC /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ZoomSegueExample/AppDelegate.m; sourceTree = SOURCE_ROOT; }; 31 | 9A9D7BFE1961EE0900BA98BC /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ZoomSegueExample/Images.xcassets; sourceTree = SOURCE_ROOT; }; 32 | 9A9D7C001961EE1C00BA98BC /* KittenCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KittenCell.h; path = ZoomSegueExample/Cells/KittenCell.h; sourceTree = SOURCE_ROOT; }; 33 | 9A9D7C011961EE1C00BA98BC /* KittenCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KittenCell.m; path = ZoomSegueExample/Cells/KittenCell.m; sourceTree = SOURCE_ROOT; }; 34 | 9A9D7C031961EE2800BA98BC /* KittenCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KittenCollectionViewController.h; path = ZoomSegueExample/Controllers/KittenCollectionViewController.h; sourceTree = SOURCE_ROOT; }; 35 | 9A9D7C041961EE2800BA98BC /* KittenCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KittenCollectionViewController.m; path = ZoomSegueExample/Controllers/KittenCollectionViewController.m; sourceTree = SOURCE_ROOT; }; 36 | 9A9D7C051961EE2800BA98BC /* KittenDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KittenDetailViewController.h; path = ZoomSegueExample/Controllers/KittenDetailViewController.h; sourceTree = SOURCE_ROOT; }; 37 | 9A9D7C061961EE2800BA98BC /* KittenDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KittenDetailViewController.m; path = ZoomSegueExample/Controllers/KittenDetailViewController.m; sourceTree = SOURCE_ROOT; }; 38 | 9A9D7C091961EE3100BA98BC /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Storyboard.storyboard; path = ZoomSegueExample/Storyboard.storyboard; sourceTree = SOURCE_ROOT; }; 39 | 9A9D7C0B1961EE4800BA98BC /* Example.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Example.pch; path = ZoomSegueExample/Example.pch; sourceTree = SOURCE_ROOT; }; 40 | 9A9D7C0C1961EE4800BA98BC /* Example.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Example.plist; path = ZoomSegueExample/Example.plist; sourceTree = SOURCE_ROOT; }; 41 | 9A9D7C0E1961EE4E00BA98BC /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ZoomSegueExample/main.m; sourceTree = SOURCE_ROOT; }; 42 | 9A9D7C111961EE6B00BA98BC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = ZoomSegueExample/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; }; 43 | 9A9D7C131961EF1100BA98BC /* ZoomInteractiveTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZoomInteractiveTransition.h; path = ../ZoomTransition/ZoomInteractiveTransition.h; sourceTree = ""; }; 44 | 9A9D7C141961EF1100BA98BC /* ZoomInteractiveTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ZoomInteractiveTransition.m; path = ../ZoomTransition/ZoomInteractiveTransition.m; sourceTree = ""; }; 45 | 9A9D7C161961EF8000BA98BC /* ZoomTransitionProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ZoomTransitionProtocol.h; path = ../ZoomTransition/ZoomTransitionProtocol.h; sourceTree = ""; }; 46 | FDD1F1D9C7C30D7B87167DC1 /* Pods-ZoomTransitionExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ZoomTransitionExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-ZoomTransitionExample/Pods-ZoomTransitionExample.release.xcconfig"; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 9A7B9C7A195FFB17007F2011 /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | C1AE193128D08C32F5ADD19A /* libPods-ZoomTransitionExample.a in Frameworks */, 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXFrameworksBuildPhase section */ 59 | 60 | /* Begin PBXGroup section */ 61 | 3C7F798883ABC7F0CDD5274D /* Frameworks */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | 3C9CF61A21E7D0EA5F24B957 /* libPods-ZoomTransitionExample.a */, 65 | ); 66 | name = Frameworks; 67 | sourceTree = ""; 68 | }; 69 | 9A011C1A196002A800971EEA /* Interface */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9A9D7C091961EE3100BA98BC /* Storyboard.storyboard */, 73 | ); 74 | name = Interface; 75 | sourceTree = ""; 76 | }; 77 | 9A011C1D1960048900971EEA /* KittenControllers */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 9A011C241960080900971EEA /* Cells */, 81 | 9A9D7C031961EE2800BA98BC /* KittenCollectionViewController.h */, 82 | 9A9D7C041961EE2800BA98BC /* KittenCollectionViewController.m */, 83 | 9A9D7C051961EE2800BA98BC /* KittenDetailViewController.h */, 84 | 9A9D7C061961EE2800BA98BC /* KittenDetailViewController.m */, 85 | ); 86 | name = KittenControllers; 87 | sourceTree = ""; 88 | }; 89 | 9A011C241960080900971EEA /* Cells */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 9A9D7C001961EE1C00BA98BC /* KittenCell.h */, 93 | 9A9D7C011961EE1C00BA98BC /* KittenCell.m */, 94 | ); 95 | name = Cells; 96 | sourceTree = ""; 97 | }; 98 | 9A011C2819602C0800971EEA /* ZoomTransition */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 9A9D7C131961EF1100BA98BC /* ZoomInteractiveTransition.h */, 102 | 9A9D7C141961EF1100BA98BC /* ZoomInteractiveTransition.m */, 103 | 9A9D7C161961EF8000BA98BC /* ZoomTransitionProtocol.h */, 104 | 9A7A7CA01965EE6C00B77DFF /* UIView+Snapshotting.h */, 105 | 9A7A7CA11965EE6C00B77DFF /* UIView+Snapshotting.m */, 106 | ); 107 | name = ZoomTransition; 108 | sourceTree = ""; 109 | }; 110 | 9A7B9C74195FFB17007F2011 = { 111 | isa = PBXGroup; 112 | children = ( 113 | 9A011C2819602C0800971EEA /* ZoomTransition */, 114 | 9A7B9C86195FFB17007F2011 /* Example */, 115 | 9A7B9C7E195FFB17007F2011 /* Products */, 116 | F1DF6567C9DD9D5B7469DCB6 /* Pods */, 117 | 3C7F798883ABC7F0CDD5274D /* Frameworks */, 118 | ); 119 | sourceTree = ""; 120 | }; 121 | 9A7B9C7E195FFB17007F2011 /* Products */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 9A7B9C7D195FFB17007F2011 /* ZoomTransitionExample.app */, 125 | ); 126 | name = Products; 127 | sourceTree = ""; 128 | }; 129 | 9A7B9C86195FFB17007F2011 /* Example */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | 9A011C1D1960048900971EEA /* KittenControllers */, 133 | 9A011C1A196002A800971EEA /* Interface */, 134 | 9A9D7BFB1961EDFF00BA98BC /* AppDelegate.h */, 135 | 9A9D7BFC1961EDFF00BA98BC /* AppDelegate.m */, 136 | 9A9D7BFE1961EE0900BA98BC /* Images.xcassets */, 137 | 9A7B9C87195FFB17007F2011 /* Supporting Files */, 138 | ); 139 | name = Example; 140 | path = CollectionViewZoomSegueExample; 141 | sourceTree = ""; 142 | }; 143 | 9A7B9C87195FFB17007F2011 /* Supporting Files */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 9A9D7C101961EE6B00BA98BC /* InfoPlist.strings */, 147 | 9A9D7C0E1961EE4E00BA98BC /* main.m */, 148 | 9A9D7C0B1961EE4800BA98BC /* Example.pch */, 149 | 9A9D7C0C1961EE4800BA98BC /* Example.plist */, 150 | ); 151 | name = "Supporting Files"; 152 | sourceTree = ""; 153 | }; 154 | F1DF6567C9DD9D5B7469DCB6 /* Pods */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 2741705BC69D5709710FDAC4 /* Pods-ZoomTransitionExample.debug.xcconfig */, 158 | FDD1F1D9C7C30D7B87167DC1 /* Pods-ZoomTransitionExample.release.xcconfig */, 159 | ); 160 | name = Pods; 161 | sourceTree = ""; 162 | }; 163 | /* End PBXGroup section */ 164 | 165 | /* Begin PBXNativeTarget section */ 166 | 9A7B9C7C195FFB17007F2011 /* ZoomTransitionExample */ = { 167 | isa = PBXNativeTarget; 168 | buildConfigurationList = 9A7B9CA9195FFB17007F2011 /* Build configuration list for PBXNativeTarget "ZoomTransitionExample" */; 169 | buildPhases = ( 170 | B4B9A5F3E1B8902B7420D20D /* Check Pods Manifest.lock */, 171 | 9A7B9C79195FFB17007F2011 /* Sources */, 172 | 9A7B9C7A195FFB17007F2011 /* Frameworks */, 173 | 9A7B9C7B195FFB17007F2011 /* Resources */, 174 | 2E5B3F68194AD7C12EF04800 /* Embed Pods Frameworks */, 175 | F445FF73B566E1BB8C4924C6 /* Copy Pods Resources */, 176 | ); 177 | buildRules = ( 178 | ); 179 | dependencies = ( 180 | ); 181 | name = ZoomTransitionExample; 182 | productName = CollectionViewZoomSegueExample; 183 | productReference = 9A7B9C7D195FFB17007F2011 /* ZoomTransitionExample.app */; 184 | productType = "com.apple.product-type.application"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | 9A7B9C75195FFB17007F2011 /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | LastUpgradeCheck = 0710; 193 | ORGANIZATIONNAME = "Denys Telezhkin"; 194 | }; 195 | buildConfigurationList = 9A7B9C78195FFB17007F2011 /* Build configuration list for PBXProject "ZoomTransitionExample" */; 196 | compatibilityVersion = "Xcode 3.2"; 197 | developmentRegion = English; 198 | hasScannedForEncodings = 0; 199 | knownRegions = ( 200 | en, 201 | ); 202 | mainGroup = 9A7B9C74195FFB17007F2011; 203 | productRefGroup = 9A7B9C7E195FFB17007F2011 /* Products */; 204 | projectDirPath = ""; 205 | projectRoot = ""; 206 | targets = ( 207 | 9A7B9C7C195FFB17007F2011 /* ZoomTransitionExample */, 208 | ); 209 | }; 210 | /* End PBXProject section */ 211 | 212 | /* Begin PBXResourcesBuildPhase section */ 213 | 9A7B9C7B195FFB17007F2011 /* Resources */ = { 214 | isa = PBXResourcesBuildPhase; 215 | buildActionMask = 2147483647; 216 | files = ( 217 | 9A9D7C0A1961EE3100BA98BC /* Storyboard.storyboard in Resources */, 218 | 9A9D7C121961EE6B00BA98BC /* InfoPlist.strings in Resources */, 219 | 9A9D7BFF1961EE0900BA98BC /* Images.xcassets in Resources */, 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | }; 223 | /* End PBXResourcesBuildPhase section */ 224 | 225 | /* Begin PBXShellScriptBuildPhase section */ 226 | 2E5B3F68194AD7C12EF04800 /* Embed Pods Frameworks */ = { 227 | isa = PBXShellScriptBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | ); 231 | inputPaths = ( 232 | ); 233 | name = "Embed Pods Frameworks"; 234 | outputPaths = ( 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | shellPath = /bin/sh; 238 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ZoomTransitionExample/Pods-ZoomTransitionExample-frameworks.sh\"\n"; 239 | showEnvVarsInLog = 0; 240 | }; 241 | B4B9A5F3E1B8902B7420D20D /* Check Pods Manifest.lock */ = { 242 | isa = PBXShellScriptBuildPhase; 243 | buildActionMask = 2147483647; 244 | files = ( 245 | ); 246 | inputPaths = ( 247 | ); 248 | name = "Check Pods Manifest.lock"; 249 | outputPaths = ( 250 | ); 251 | runOnlyForDeploymentPostprocessing = 0; 252 | shellPath = /bin/sh; 253 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 254 | showEnvVarsInLog = 0; 255 | }; 256 | F445FF73B566E1BB8C4924C6 /* Copy Pods Resources */ = { 257 | isa = PBXShellScriptBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | ); 261 | inputPaths = ( 262 | ); 263 | name = "Copy Pods Resources"; 264 | outputPaths = ( 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | shellPath = /bin/sh; 268 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ZoomTransitionExample/Pods-ZoomTransitionExample-resources.sh\"\n"; 269 | showEnvVarsInLog = 0; 270 | }; 271 | /* End PBXShellScriptBuildPhase section */ 272 | 273 | /* Begin PBXSourcesBuildPhase section */ 274 | 9A7B9C79195FFB17007F2011 /* Sources */ = { 275 | isa = PBXSourcesBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | 9A9D7C081961EE2800BA98BC /* KittenDetailViewController.m in Sources */, 279 | 9A9D7C071961EE2800BA98BC /* KittenCollectionViewController.m in Sources */, 280 | 9A9D7C021961EE1C00BA98BC /* KittenCell.m in Sources */, 281 | 9A7A7CA21965EE6C00B77DFF /* UIView+Snapshotting.m in Sources */, 282 | 9A9D7C0F1961EE4E00BA98BC /* main.m in Sources */, 283 | 9A9D7BFD1961EDFF00BA98BC /* AppDelegate.m in Sources */, 284 | 9A9D7C151961EF1100BA98BC /* ZoomInteractiveTransition.m in Sources */, 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | }; 288 | /* End PBXSourcesBuildPhase section */ 289 | 290 | /* Begin PBXVariantGroup section */ 291 | 9A9D7C101961EE6B00BA98BC /* InfoPlist.strings */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | 9A9D7C111961EE6B00BA98BC /* en */, 295 | ); 296 | name = InfoPlist.strings; 297 | sourceTree = ""; 298 | }; 299 | /* End PBXVariantGroup section */ 300 | 301 | /* Begin XCBuildConfiguration section */ 302 | 9A7B9CA7195FFB17007F2011 /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 307 | CLANG_CXX_LIBRARY = "libc++"; 308 | CLANG_ENABLE_MODULES = YES; 309 | CLANG_ENABLE_OBJC_ARC = YES; 310 | CLANG_WARN_BOOL_CONVERSION = YES; 311 | CLANG_WARN_CONSTANT_CONVERSION = YES; 312 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 313 | CLANG_WARN_EMPTY_BODY = YES; 314 | CLANG_WARN_ENUM_CONVERSION = YES; 315 | CLANG_WARN_INT_CONVERSION = YES; 316 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 318 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 319 | COPY_PHASE_STRIP = NO; 320 | ENABLE_TESTABILITY = YES; 321 | GCC_C_LANGUAGE_STANDARD = gnu99; 322 | GCC_DYNAMIC_NO_PIC = NO; 323 | GCC_OPTIMIZATION_LEVEL = 0; 324 | GCC_PREPROCESSOR_DEFINITIONS = ( 325 | "DEBUG=1", 326 | "$(inherited)", 327 | ); 328 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 329 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 330 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 331 | GCC_WARN_UNDECLARED_SELECTOR = YES; 332 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 333 | GCC_WARN_UNUSED_FUNCTION = YES; 334 | GCC_WARN_UNUSED_VARIABLE = YES; 335 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 336 | ONLY_ACTIVE_ARCH = YES; 337 | SDKROOT = iphoneos; 338 | TARGETED_DEVICE_FAMILY = "1,2"; 339 | }; 340 | name = Debug; 341 | }; 342 | 9A7B9CA8195FFB17007F2011 /* Release */ = { 343 | isa = XCBuildConfiguration; 344 | buildSettings = { 345 | ALWAYS_SEARCH_USER_PATHS = NO; 346 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 347 | CLANG_CXX_LIBRARY = "libc++"; 348 | CLANG_ENABLE_MODULES = YES; 349 | CLANG_ENABLE_OBJC_ARC = YES; 350 | CLANG_WARN_BOOL_CONVERSION = YES; 351 | CLANG_WARN_CONSTANT_CONVERSION = YES; 352 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 353 | CLANG_WARN_EMPTY_BODY = YES; 354 | CLANG_WARN_ENUM_CONVERSION = YES; 355 | CLANG_WARN_INT_CONVERSION = YES; 356 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 357 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 358 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 359 | COPY_PHASE_STRIP = YES; 360 | ENABLE_NS_ASSERTIONS = NO; 361 | GCC_C_LANGUAGE_STANDARD = gnu99; 362 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 363 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 364 | GCC_WARN_UNDECLARED_SELECTOR = YES; 365 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 366 | GCC_WARN_UNUSED_FUNCTION = YES; 367 | GCC_WARN_UNUSED_VARIABLE = YES; 368 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 369 | SDKROOT = iphoneos; 370 | TARGETED_DEVICE_FAMILY = "1,2"; 371 | VALIDATE_PRODUCT = YES; 372 | }; 373 | name = Release; 374 | }; 375 | 9A7B9CAA195FFB17007F2011 /* Debug */ = { 376 | isa = XCBuildConfiguration; 377 | baseConfigurationReference = 2741705BC69D5709710FDAC4 /* Pods-ZoomTransitionExample.debug.xcconfig */; 378 | buildSettings = { 379 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 380 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 381 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 382 | GCC_PREFIX_HEADER = ZoomSegueExample/Example.pch; 383 | INFOPLIST_FILE = ZoomSegueExample/Example.plist; 384 | PRODUCT_BUNDLE_IDENTIFIER = "com.mlsdev.${PRODUCT_NAME:rfc1034identifier}"; 385 | PRODUCT_NAME = ZoomTransitionExample; 386 | WRAPPER_EXTENSION = app; 387 | }; 388 | name = Debug; 389 | }; 390 | 9A7B9CAB195FFB17007F2011 /* Release */ = { 391 | isa = XCBuildConfiguration; 392 | baseConfigurationReference = FDD1F1D9C7C30D7B87167DC1 /* Pods-ZoomTransitionExample.release.xcconfig */; 393 | buildSettings = { 394 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 395 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 396 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 397 | GCC_PREFIX_HEADER = ZoomSegueExample/Example.pch; 398 | INFOPLIST_FILE = ZoomSegueExample/Example.plist; 399 | PRODUCT_BUNDLE_IDENTIFIER = "com.mlsdev.${PRODUCT_NAME:rfc1034identifier}"; 400 | PRODUCT_NAME = ZoomTransitionExample; 401 | WRAPPER_EXTENSION = app; 402 | }; 403 | name = Release; 404 | }; 405 | /* End XCBuildConfiguration section */ 406 | 407 | /* Begin XCConfigurationList section */ 408 | 9A7B9C78195FFB17007F2011 /* Build configuration list for PBXProject "ZoomTransitionExample" */ = { 409 | isa = XCConfigurationList; 410 | buildConfigurations = ( 411 | 9A7B9CA7195FFB17007F2011 /* Debug */, 412 | 9A7B9CA8195FFB17007F2011 /* Release */, 413 | ); 414 | defaultConfigurationIsVisible = 0; 415 | defaultConfigurationName = Release; 416 | }; 417 | 9A7B9CA9195FFB17007F2011 /* Build configuration list for PBXNativeTarget "ZoomTransitionExample" */ = { 418 | isa = XCConfigurationList; 419 | buildConfigurations = ( 420 | 9A7B9CAA195FFB17007F2011 /* Debug */, 421 | 9A7B9CAB195FFB17007F2011 /* Release */, 422 | ); 423 | defaultConfigurationIsVisible = 0; 424 | defaultConfigurationName = Release; 425 | }; 426 | /* End XCConfigurationList section */ 427 | }; 428 | rootObject = 9A7B9C75195FFB17007F2011 /* Project object */; 429 | } 430 | --------------------------------------------------------------------------------