├── .gitignore
├── CHANGELOG.md
├── ViewControllerTransitionPlayground
├── en.lproj
│ └── InfoPlist.strings
├── DDHMasterViewController.h
├── DDHAppDelegate.h
├── ViewControllerTransitionPlayground-Prefix.pch
├── main.m
├── DDHDetailViewController.h
├── Images.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── LaunchImage.launchimage
│ │ └── Contents.json
├── DDHDetailViewController.m
├── ViewControllerTransitionPlayground-Info.plist
├── DDHAppDelegate.m
├── DDHMasterViewController.m
└── Base.lproj
│ └── Main.storyboard
├── screencasts
├── snap.gif
├── gravity.gif
└── gravity_rotation.gif
├── ViewControllerTransitionPlaygroundTests
├── en.lproj
│ └── InfoPlist.strings
├── ViewControllerTransitionPlaygroundTests-Info.plist
└── ViewControllerTransitionPlaygroundTests.m
├── ViewControllerTransitionPlayground.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── dom.xcuserdatad
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── ViewControllerTransitionPlayground.xcscheme
└── project.pbxproj
├── DDHDynamicViewControllerTransitions.podspec
├── LICENSE
├── DynamicTransitionAnimators
├── DDHSnapPushAnimator.h
├── DDHGravityPopAnimator.h
├── DDHSnapPopAnimator.h
├── DDHGravityPushAnimator.h
├── DDHGravityRotationPopAnimator.h
├── DDHTransitionAnimator.h
├── DDHGravityRotationPushAnimator.h
├── DDHSnapPopAnimator.m
├── DDHSnapPushAnimator.m
├── DDHTransitionAnimator.m
├── DDHGravityPopAnimator.m
├── DDHGravityPushAnimator.m
├── DDHGravityRotationPopAnimator.m
└── DDHGravityRotationPushAnimator.m
├── DDHNavigationControllerDelegate.h
├── DDHNavigationControllerDelegate.m
├── README.md
└── Rakefile
/.gitignore:
--------------------------------------------------------------------------------
1 | xcuserdata
2 | xcdebugger
3 | xcshareddata
4 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # DDHDynamicViewControllerTransitions CHANGELOG
2 |
3 | ## 0.9.0
4 |
5 | Initial release.
6 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/screencasts/snap.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/HEAD/screencasts/snap.gif
--------------------------------------------------------------------------------
/ViewControllerTransitionPlaygroundTests/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/screencasts/gravity.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/HEAD/screencasts/gravity.gif
--------------------------------------------------------------------------------
/screencasts/gravity_rotation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/HEAD/screencasts/gravity_rotation.gif
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHMasterViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHMasterViewController.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface DDHMasterViewController : UITableViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHAppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAppDelegate.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface DDHAppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-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_5_0
10 | #warning "This project uses features only available in iOS SDK 5.0 and later."
11 | #endif
12 |
13 | #ifdef __OBJC__
14 | #import
15 | #import
16 | #endif
17 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #import "DDHAppDelegate.h"
12 |
13 | int main(int argc, char * argv[])
14 | {
15 | @autoreleasepool {
16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([DDHAppDelegate class]));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHDetailViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHDetailViewController.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface DDHDetailViewController : UIViewController
12 |
13 | @property (strong, nonatomic) id detailItem;
14 |
15 | @property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
16 | @end
17 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/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 | }
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/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 | }
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground.xcodeproj/xcuserdata/dom.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | ViewControllerTransitionPlayground.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | F297E58B18FDB2C300D73C3A
16 |
17 | primary
18 |
19 |
20 | F297E5AF18FDB2C300D73C3A
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlaygroundTests/ViewControllerTransitionPlaygroundTests-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | de.dasdom.${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 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlaygroundTests/ViewControllerTransitionPlaygroundTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewControllerTransitionPlaygroundTests.m
3 | // ViewControllerTransitionPlaygroundTests
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewControllerTransitionPlaygroundTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation ViewControllerTransitionPlaygroundTests
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 |
--------------------------------------------------------------------------------
/DDHDynamicViewControllerTransitions.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "DDHDynamicViewControllerTransitions"
3 | s.version = "0.9.0"
4 | s.summary = "View controller transitions using UIDynamics."
5 | s.homepage = "https://github.com/dasdom/DDHDynamicViewControllerTransitions"
6 | s.license = 'MIT'
7 | s.author = { "Dominik Hauser" => "dominik.hauser@dasdom.de" }
8 | s.source = { :git => "https://github.com/dasdom/DDHDynamicViewControllerTransitions.git", :tag => s.version.to_s }
9 | s.screenshots = [ "https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/master/screencasts/snap.gif",
10 | "https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/master/screencasts/gravity.gif",
11 | "https://raw.githubusercontent.com/dasdom/DDHDynamicViewControllerTransitions/master/screencasts/gravity_rotation.gif" ]
12 | s.platform = :ios, '7.0'
13 | s.requires_arc = true
14 |
15 | s.source_files = "DDHNavigationControllerDelegate.{h,m}", "DynamicTransitionAnimators/*.{h,m}"
16 | end
17 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014 Dominik Hauser
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHDetailViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHDetailViewController.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import "DDHDetailViewController.h"
10 |
11 | @interface DDHDetailViewController ()
12 | - (void)configureView;
13 | @end
14 |
15 | @implementation DDHDetailViewController
16 |
17 | #pragma mark - Managing the detail item
18 |
19 | - (void)setDetailItem:(id)newDetailItem
20 | {
21 | if (_detailItem != newDetailItem) {
22 | _detailItem = newDetailItem;
23 |
24 | // Update the view.
25 | [self configureView];
26 | }
27 | }
28 |
29 | - (void)configureView
30 | {
31 | // Update the user interface for the detail item.
32 |
33 | if (self.detailItem) {
34 | self.detailDescriptionLabel.text = [self.detailItem description];
35 | }
36 | }
37 |
38 | - (void)viewDidLoad
39 | {
40 | [super viewDidLoad];
41 | // Do any additional setup after loading the view, typically from a nib.
42 | [self configureView];
43 | }
44 |
45 | - (void)didReceiveMemoryWarning
46 | {
47 | [super didReceiveMemoryWarning];
48 | // Dispose of any resources that can be recreated.
49 | }
50 |
51 | @end
52 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHSnapPushAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #import "DDHTransitionAnimator.h"
27 |
28 | /**
29 | * Push animator for snap behavior
30 | */
31 | @interface DDHSnapPushAnimator : DDHTransitionAnimator
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityPopAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityPopAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #import "DDHTransitionAnimator.h"
27 |
28 | /**
29 | * Pop animator for gravity behavior
30 | */
31 | @interface DDHGravityPopAnimator : DDHTransitionAnimator
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHSnapPopAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHPopTransitionAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 16.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHTransitionAnimator.h"
28 |
29 | /**
30 | * Pop animator for snap behavior
31 | */
32 | @interface DDHSnapPopAnimator : DDHTransitionAnimator
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityPushAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityPushAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 17.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHTransitionAnimator.h"
28 |
29 | /**
30 | * Push animator for gravity behavior
31 | */
32 | @interface DDHGravityPushAnimator : DDHTransitionAnimator
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityRotationPopAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityRotationPopAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHTransitionAnimator.h"
28 |
29 | /**
30 | * Pop animator for gravity+rotation behavior
31 | */
32 | @interface DDHGravityRotationPopAnimator : DDHTransitionAnimator
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHTransitionAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHTransitionAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 17.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import
28 |
29 | /**
30 | * Abstract class for the transition animators
31 | */
32 | @interface DDHTransitionAnimator : NSObject
33 | @end
34 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityRotationPushAnimator.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityRotationPushAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHTransitionAnimator.h"
28 |
29 | /**
30 | * Push animator for gravity+rotation behavior
31 | */
32 | @interface DDHGravityRotationPushAnimator : DDHTransitionAnimator
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | ${PRODUCT_NAME}
9 | CFBundleExecutable
10 | ${EXECUTABLE_NAME}
11 | CFBundleIdentifier
12 | de.dasdom.${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 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UIStatusBarTintParameters
34 |
35 | UINavigationBar
36 |
37 | Style
38 | UIBarStyleDefault
39 | Translucent
40 |
41 |
42 |
43 | UISupportedInterfaceOrientations
44 |
45 | UIInterfaceOrientationPortrait
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/DDHNavigationControllerDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAnimator.h
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #import
27 |
28 | typedef NS_ENUM(NSUInteger, DDH_TRANSITION_TYPE) {
29 | DDH_TRANSITION_TYPE_SNAP = 0,
30 | DDH_TRANSITION_TYPE_GRAVITY,
31 | DDH_TRANSITION_TYPE_GRAVITY_PLUS_ROTATION,
32 | DDH_TRANSITION_TYPE_NUMBER_OF_TYPES
33 | };
34 |
35 | @interface DDHNavigationControllerDelegate : NSObject
36 | @property (nonatomic, assign) NSInteger transitionType;
37 |
38 | - (instancetype)initWithTransitionType:(NSInteger)transitionType;
39 | @end
40 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHAppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAppDelegate.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import "DDHAppDelegate.h"
10 |
11 | @implementation DDHAppDelegate
12 |
13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
14 | {
15 | // Override point for customization after application launch.
16 | return YES;
17 | }
18 |
19 | - (void)applicationWillResignActive:(UIApplication *)application
20 | {
21 | // 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.
22 | // 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.
23 | }
24 |
25 | - (void)applicationDidEnterBackground:(UIApplication *)application
26 | {
27 | // 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.
28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
29 | }
30 |
31 | - (void)applicationWillEnterForeground:(UIApplication *)application
32 | {
33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | - (void)applicationDidBecomeActive:(UIApplication *)application
37 | {
38 | // 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.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application
42 | {
43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHSnapPopAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHPopTransitionAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 16.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHSnapPopAnimator.h"
28 |
29 | @implementation DDHSnapPopAnimator
30 |
31 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
32 | return 0.8f;
33 | }
34 |
35 | /**
36 | * Prepare views, create animator and add behaviors.
37 | *
38 | * @param transitionContext the transitionContext
39 | *
40 | * @return dynamic animator
41 | */
42 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
43 | // Get the view controllers for the transition
44 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
45 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
46 |
47 | // Add the view of the toViewController to the containerView below the fromViewControllers view
48 | [[transitionContext containerView] insertSubview:toViewController.view atIndex:0];
49 |
50 | // Create animator
51 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
52 |
53 | // Add behaviors
54 | UISnapBehavior* snapBehavior = [[UISnapBehavior alloc] initWithItem:fromViewController.view snapToPoint:CGPointMake(1.6f*fromViewController.view.frame.size.width, fromViewController.view.center.y)];
55 |
56 | [animator addBehavior:snapBehavior];
57 |
58 | return animator;
59 | }
60 |
61 | @end
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHSnapPushAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHSnapPushAnimator.h"
28 |
29 | @implementation DDHSnapPushAnimator
30 |
31 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
32 | return 0.8f;
33 | }
34 |
35 | /**
36 | * Prepare views, create animator and add behaviors.
37 | *
38 | * @param transitionContext the transitionContext
39 | *
40 | * @return dynamic animator
41 | */
42 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
43 | // Get the view controllers for the transition
44 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
45 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
46 |
47 | // Prepare the view of the toViewController
48 | toViewController.view.frame = CGRectOffset(fromViewController.view.frame, 0.6f*fromViewController.view.frame.size.width, 0);
49 |
50 | // Add the view of the toViewController to the containerView
51 | [[transitionContext containerView] addSubview:toViewController.view];
52 |
53 | // Create animator
54 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
55 |
56 | // Add behaviors
57 | UISnapBehavior* snapBehavior = [[UISnapBehavior alloc] initWithItem:toViewController.view snapToPoint:fromViewController.view.center];
58 | [animator addBehavior:snapBehavior];
59 |
60 | return animator;
61 | }
62 |
63 | @end
64 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHTransitionAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHTransitionAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 17.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHTransitionAnimator.h"
28 |
29 | @implementation DDHTransitionAnimator
30 |
31 | #pragma mark - UIViewControllerAnimatedTransitioning
32 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
33 | // Should be implemented by subclasses. The duration depends on the compexity of the
34 | // dynamic animation.
35 | return 1.0f;
36 | }
37 |
38 | - (void)animateTransition:(id)transitionContext {
39 | __block UIDynamicAnimator *animator = [self animateForTransitionContext:transitionContext];
40 |
41 | // Wait some time. The time is hardcoded for every specific animation and is equal to the
42 | // transitionDuration. After this duration the animator is nilled and the transitionContext
43 | // is completed.
44 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([self transitionDuration:transitionContext] * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
45 | animator = nil;
46 | [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
47 | });
48 | }
49 |
50 | #pragma mark - dynamic animator
51 | /**
52 | * This method is meant to be implemented by subclasses. Sub classes should prepare the views,
53 | * create animator and add dynamic behaviors.
54 | *
55 | * @param transitionContext the transitionContext
56 | *
57 | * @return dynamic animator which is added to one of the views
58 | */
59 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
60 | // Has to be implemented by subclasses
61 | return nil;
62 | }
63 |
64 | @end
65 |
--------------------------------------------------------------------------------
/DDHNavigationControllerDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHNavigationControllerDelegate.h"
28 | #import "DDHSnapPushAnimator.h"
29 | #import "DDHSnapPopAnimator.h"
30 | #import "DDHGravityPushAnimator.h"
31 | #import "DDHGravityPopAnimator.h"
32 | #import "DDHGravityRotationPushAnimator.h"
33 | #import "DDHGravityRotationPopAnimator.h"
34 |
35 | @implementation DDHNavigationControllerDelegate
36 |
37 | - (instancetype)initWithTransitionType:(NSInteger)transitionType {
38 | self = [super init];
39 | if (self) {
40 | if (transitionType >= DDH_TRANSITION_TYPE_NUMBER_OF_TYPES) {
41 | NSAssert1(false, @"%d is not a valid type.", transitionType);
42 | transitionType = 0;
43 | }
44 | self.transitionType = transitionType;
45 | }
46 | return self;
47 | }
48 |
49 | #pragma mark - UINavigationControllerDelegate
50 | - (id)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {
51 | if (operation == UINavigationControllerOperationPush) {
52 | if (self.transitionType == 0) {
53 | return [[DDHSnapPushAnimator alloc] init];
54 | } else if (self.transitionType == 1) {
55 | return [[DDHGravityPushAnimator alloc] init];
56 | } else {
57 | return [[DDHGravityRotationPushAnimator alloc] init];
58 | }
59 | } else {
60 | if (self.transitionType == 0) {
61 | return [[DDHSnapPopAnimator alloc] init];
62 | } else if (self.transitionType == 1) {
63 | return [[DDHGravityPopAnimator alloc] init];
64 | } else {
65 | return [[DDHGravityRotationPopAnimator alloc] init];
66 | }
67 | }
68 | }
69 |
70 | @end
71 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityPopAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityPopAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #import "DDHGravityPopAnimator.h"
27 |
28 | @implementation DDHGravityPopAnimator
29 |
30 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
31 | return 1.5f;
32 | }
33 |
34 | /**
35 | * Prepare views, create animator and add behaviors.
36 | *
37 | * @param transitionContext the transitionContext
38 | *
39 | * @return dynamic animator
40 | */
41 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
42 | // Get the view controllers for the transition
43 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
44 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
45 |
46 | // Add the view of the toViewController to the containerView below the fromViewControllers view
47 | [[transitionContext containerView] insertSubview:toViewController.view atIndex:0];
48 |
49 | // Create animator
50 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
51 |
52 | // Add behaviors
53 | UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[fromViewController.view]];
54 | gravityBehavior.gravityDirection = CGVectorMake(0, -1);
55 |
56 | UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[fromViewController.view] mode:UIPushBehaviorModeInstantaneous];
57 | pushBehavior.angle = 3*M_PI_2;
58 | pushBehavior.magnitude = 100.0;
59 | [pushBehavior setTargetOffsetFromCenter:UIOffsetMake(30.0f, 0.0f) forItem:fromViewController.view];
60 |
61 | [animator addBehavior:pushBehavior];
62 | [animator addBehavior:gravityBehavior];
63 |
64 | return animator;
65 | }
66 |
67 | @end
68 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityPushAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityPushAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 17.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHGravityPushAnimator.h"
28 |
29 | @implementation DDHGravityPushAnimator
30 |
31 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
32 | return 1.5f;
33 | }
34 |
35 | /**
36 | * Prepare views, create animator and add behaviors.
37 | *
38 | * @param transitionContext the transitionContext
39 | *
40 | * @return dynamic animator
41 | */
42 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
43 | // Get the view controllers for the transition
44 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
45 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
46 |
47 | // Prepare the view of the toViewController
48 | toViewController.view.frame = CGRectOffset(fromViewController.view.frame, 0.0f, -1.0f*fromViewController.view.frame.size.height);
49 |
50 | // Add the view of the toViewController to the containerView
51 | [[transitionContext containerView] addSubview:toViewController.view];
52 |
53 | // Create animator
54 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
55 |
56 | // Add behaviors
57 | UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[toViewController.view]];
58 |
59 | UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[toViewController.view]];
60 | [collisionBehavior addBoundaryWithIdentifier:@"BotomBoundary" fromPoint:CGPointMake(0.0f, fromViewController.view.frame.size.height+1) toPoint:CGPointMake(fromViewController.view.frame.size.width, fromViewController.view.frame.size.height+1)];
61 |
62 | UIDynamicItemBehavior *propertiesBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[toViewController.view]];
63 | propertiesBehavior.elasticity = 0.2;
64 |
65 | UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[toViewController.view] mode:UIPushBehaviorModeInstantaneous];
66 | pushBehavior.angle = M_PI_2;
67 | pushBehavior.magnitude = 100.0;
68 |
69 | [animator addBehavior:pushBehavior];
70 | [animator addBehavior:propertiesBehavior];
71 | [animator addBehavior:collisionBehavior];
72 | [animator addBehavior:gravityBehavior];
73 |
74 | return animator;
75 | }
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground.xcodeproj/xcuserdata/dom.xcuserdatad/xcschemes/ViewControllerTransitionPlayground.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 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityRotationPopAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityRotationPopAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHGravityRotationPopAnimator.h"
28 |
29 | @implementation DDHGravityRotationPopAnimator
30 |
31 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
32 | return 1.5f;
33 | }
34 |
35 | /**
36 | * Prepare views, create animator and add behaviors.
37 | *
38 | * @param transitionContext the transitionContext
39 | *
40 | * @return dynamic animator
41 | */
42 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
43 | // Get the view controllers for the transition
44 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
45 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
46 |
47 | CGPoint center = fromViewController.view.center;
48 |
49 | // Add the view of the toViewController to the containerView below the fromViewControllers view
50 | [[transitionContext containerView] insertSubview:toViewController.view atIndex:0];
51 |
52 | // Create animator
53 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
54 |
55 | // Add behaviors
56 | UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[fromViewController.view]];
57 | // gravityBehavior.gravityDirection = CGVectorMake(0, -1);
58 |
59 | CGPoint anchorPoint = CGPointMake(fromViewController.view.frame.size.width, fromViewController.view.frame.size.height+10.0f);
60 | UIAttachmentBehavior *attachment1 = [[UIAttachmentBehavior alloc] initWithItem:fromViewController.view offsetFromCenter:UIOffsetMake(center.x, center.y) attachedToAnchor:anchorPoint];
61 | attachment1.length = 10.0f;
62 |
63 | UIAttachmentBehavior *attachment2 = [[UIAttachmentBehavior alloc] initWithItem:fromViewController.view offsetFromCenter:UIOffsetMake(center.x-100.0f, center.y) attachedToAnchor:anchorPoint];
64 | attachment2.length = 100.5f;
65 |
66 | // CGPoint anchorPoint = CGPointMake(0.0f, -10.0f);
67 | // UIAttachmentBehavior *attachment1 = [[UIAttachmentBehavior alloc] initWithItem:fromViewController.view offsetFromCenter:UIOffsetMake(-center.x, -center.y) attachedToAnchor:anchorPoint];
68 | // attachment1.length = 10.0f;
69 | //
70 | // UIAttachmentBehavior *attachment2 = [[UIAttachmentBehavior alloc] initWithItem:fromViewController.view offsetFromCenter:UIOffsetMake(-center.x+100.0f, -center.y) attachedToAnchor:anchorPoint];
71 | // attachment2.length = 100.5f;
72 |
73 | UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[fromViewController.view] mode:UIPushBehaviorModeInstantaneous];
74 | pushBehavior.angle = 0;
75 | pushBehavior.magnitude = 200.0;
76 |
77 | [animator addBehavior:gravityBehavior];
78 | [animator addBehavior:attachment1];
79 | [animator addBehavior:attachment2];
80 | [animator addBehavior:pushBehavior];
81 |
82 | return animator;
83 | }
84 |
85 | @end
86 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DDHDynamicViewControllerTransitions
2 |
3 | [](http://cocoadocs.org/docsets/DDHDynamicViewControllerTransitions)
4 | [](http://cocoadocs.org/docsets/DDHDynamicViewControllerTransitions)
5 |
6 | Custom view controller transitions using `UIDynamic` behaviors.
7 |
8 | Snap
9 |
10 | 
11 |
12 | Gravity
13 |
14 | 
15 |
16 | Gravity + Rotation
17 |
18 | 
19 |
20 | ## Usage
21 |
22 | Create an instance of `DDHNavigationControllerDelegate` and make it the delegate of you navigation controller.
23 |
24 | Example:
25 |
26 | ```objc
27 | #import "DDHAppDelegate.h"
28 | #import "DDHFirstViewController.h"
29 | #import "DDHNavigationControllerDelegate.h"
30 |
31 | @interface DDHAppDelegate ()
32 | @property (nonatomic, strong) DDHNavigationControllerDelegate *navigationControllerDelegate;
33 | @end
34 |
35 | @implementation DDHAppDelegate
36 |
37 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
38 | {
39 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
40 |
41 | DDHFirstViewController *firstViewController = [[DDHFirstViewController alloc] initWithNibName:@"DDHFirstViewController" bundle:nil];
42 | UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
43 |
44 | self.navigationControllerDelegate = [[DDHNavigationControllerDelegate alloc] initWithTransitionType:1];
45 | navigationController.delegate = self.navigationControllerDelegate;
46 |
47 | self.window.rootViewController = navigationController;
48 |
49 | self.window.backgroundColor = [UIColor whiteColor];
50 | [self.window makeKeyAndVisible];
51 | return YES;
52 | }
53 |
54 | ```
55 |
56 | **Important**: The navigation controller assigns it's delegate. Therefore you will need a reference to the navigation controller delegate somewhere. You can do this eighther in Interface Builder of in code like in the example.
57 |
58 | To change the transition type on the fly set the transitionType of the navigation controller delegate.
59 |
60 | ### Using a storyboard
61 |
62 | ```objc
63 | #import "DDHNavigationControllerDelegate.h"
64 |
65 | ...
66 |
67 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
68 | {
69 | ((DDHNavigationControllerDelegate*)self.navigationController.delegate).transitionType = DDH_TRANSITION_TYPE_GRAVITY;
70 | }
71 | ```
72 |
73 | ### Without a storyboard
74 |
75 | ```objc
76 | #import "DDHNavigationControllerDelegate.h"
77 |
78 | ...
79 |
80 | - (void)pushSecondViewController {
81 | ((DDHNavigationControllerDelegate*)self.navigationController.delegate).transitionType = DDH_TRANSITION_TYPE_GRAVITY;
82 |
83 | DDHSecondViewController *secondViewController = [[DDHSecondViewController alloc] initWithNibName:@"DDHSecondViewController" bundle:nil];
84 | [self.navigationController pushViewController:secondViewController animated:YES];
85 | }
86 | ```
87 |
88 | If you don't want to include the header file into your code you can use Key-Value-Coding:
89 |
90 | ```objc
91 | [(NSObject*)self.navigationController.delegate setValue:@1 forKey:@"transitionType"];
92 | ```
93 |
94 | ## Requirements
95 |
96 | ARC and iOS7.
97 |
98 | ## Installation
99 |
100 | ### Using CocoaPods
101 |
102 | DDHDynamicViewControllerTransitions is available through [CocoaPods](http://cocoapods.org), to install
103 | it simply add the following line to your Podfile:
104 |
105 | pod "DDHDynamicViewControllerTransitions"
106 |
107 | ### Manual
108 |
109 | Download the project and add the files `DDHNavigationControllerDelegate.{h,m}` and the directory `DynamicTransitionAnimators` to your project.
110 |
111 | ## Author
112 |
113 | Dominik Hauser, dominik.hauser@dasdom.de
114 |
115 | ## License
116 |
117 | DDHDynamicViewControllerTransitions is available under the MIT license. See the LICENSE file for more info.
118 |
119 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/DDHMasterViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHMasterViewController.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 15.04.14.
6 | // Copyright (c) 2014 Dominik Hauser. All rights reserved.
7 | //
8 |
9 | #import "DDHMasterViewController.h"
10 |
11 | #import "DDHDetailViewController.h"
12 |
13 | #import "DDHNavigationControllerDelegate.h"
14 |
15 | @interface DDHMasterViewController ()
16 | @property (nonatomic, strong) NSArray *animatorNames;
17 | @end
18 |
19 | @implementation DDHMasterViewController
20 |
21 | - (void)awakeFromNib
22 | {
23 | [super awakeFromNib];
24 |
25 | self.animatorNames = @[@"Snap", @"Gravity", @"Gravity+Rotation"];
26 | }
27 |
28 | - (void)viewDidLoad
29 | {
30 | [super viewDidLoad];
31 | // Do any additional setup after loading the view, typically from a nib.
32 | // self.navigationItem.leftBarButtonItem = self.editButtonItem;
33 | //
34 | // UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
35 | // self.navigationItem.rightBarButtonItem = addButton;
36 | }
37 |
38 | - (void)didReceiveMemoryWarning
39 | {
40 | [super didReceiveMemoryWarning];
41 | // Dispose of any resources that can be recreated.
42 | }
43 |
44 | //- (void)insertNewObject:(id)sender
45 | //{
46 | // if (!_objects) {
47 | // _objects = [[NSMutableArray alloc] init];
48 | // }
49 | // [_objects insertObject:[NSDate date] atIndex:0];
50 | // NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
51 | // [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
52 | //}
53 |
54 | #pragma mark - Table View
55 |
56 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
57 | {
58 | return 1;
59 | }
60 |
61 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
62 | {
63 | return [self.animatorNames count];
64 | }
65 |
66 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
67 | {
68 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
69 |
70 | NSDate *object = self.animatorNames[indexPath.row];
71 | cell.textLabel.text = [object description];
72 | return cell;
73 | }
74 |
75 | //- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
76 | //{
77 | // // Return NO if you do not want the specified item to be editable.
78 | // return YES;
79 | //}
80 |
81 | //- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
82 | //{
83 | // if (editingStyle == UITableViewCellEditingStyleDelete) {
84 | // [_objects removeObjectAtIndex:indexPath.row];
85 | // [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
86 | // } else if (editingStyle == UITableViewCellEditingStyleInsert) {
87 | // // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
88 | // }
89 | //}
90 |
91 | /*
92 | // Override to support rearranging the table view.
93 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
94 | {
95 | }
96 | */
97 |
98 | /*
99 | // Override to support conditional rearranging of the table view.
100 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
101 | {
102 | // Return NO if you do not want the item to be re-orderable.
103 | return YES;
104 | }
105 | */
106 |
107 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
108 | [tableView deselectRowAtIndexPath:indexPath animated:YES];
109 | }
110 |
111 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
112 | {
113 | if ([[segue identifier] isEqualToString:@"showDetail"]) {
114 | NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
115 | NSDate *object = self.animatorNames[indexPath.row];
116 | [[segue destinationViewController] setDetailItem:object];
117 | ((DDHNavigationControllerDelegate*)self.navigationController.delegate).transitionType = indexPath.row;
118 | }
119 | }
120 |
121 | @end
122 |
--------------------------------------------------------------------------------
/DynamicTransitionAnimators/DDHGravityRotationPushAnimator.m:
--------------------------------------------------------------------------------
1 | //
2 | // DDHGravityRotationPushAnimator.m
3 | // ViewControllerTransitionPlayground
4 | //
5 | // Created by Dominik Hauser on 18.04.14.
6 | // Copyright (c) 2014 Dominik Hauser
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 |
27 | #import "DDHGravityRotationPushAnimator.h"
28 |
29 | @implementation DDHGravityRotationPushAnimator
30 |
31 | - (NSTimeInterval)transitionDuration:(id)transitionContext {
32 | return 1.5f;
33 | }
34 |
35 | /**
36 | * Prepare views, create animator and add behaviors.
37 | *
38 | * @param transitionContext the transitionContext
39 | *
40 | * @return dynamic animator
41 | */
42 | - (UIDynamicAnimator*)animateForTransitionContext:(id)transitionContext {
43 | // Get the view controllers for the transition
44 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
45 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
46 |
47 | // Prepare the view of the toViewController
48 | CGPoint center = toViewController.view.center;
49 |
50 | toViewController.view.frame = CGRectOffset(toViewController.view.frame, toViewController.view.frame.size.width, -toViewController.view.frame.size.height-100);
51 | toViewController.view.transform = CGAffineTransformMakeRotation(-M_1_PI);
52 |
53 | // Add the view of the toViewController to the containerView
54 | [[transitionContext containerView] addSubview:toViewController.view];
55 |
56 | // Create animator
57 | UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];
58 |
59 | // Add behaviors
60 | UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[toViewController.view]];
61 |
62 | CGPoint anchorPoint = CGPointMake(0.0f, -10.0f);
63 | UIAttachmentBehavior *attachment1 = [[UIAttachmentBehavior alloc] initWithItem:toViewController.view offsetFromCenter:UIOffsetMake(-center.x, -center.y) attachedToAnchor:anchorPoint];
64 | attachment1.length = 10.0f;
65 |
66 | UIAttachmentBehavior *attachment2 = [[UIAttachmentBehavior alloc] initWithItem:toViewController.view offsetFromCenter:UIOffsetMake(-center.x+100.0f, -center.y) attachedToAnchor:anchorPoint];
67 | attachment2.length = 100.5f;
68 |
69 | UIDynamicItemBehavior *propertiesBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[toViewController.view]];
70 | propertiesBehavior.elasticity = 0.2;
71 |
72 | UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[toViewController.view] mode:UIPushBehaviorModeInstantaneous];
73 | pushBehavior.angle = M_PI_2;
74 | pushBehavior.magnitude = 100.0;
75 |
76 | UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[toViewController.view]];
77 | [collisionBehavior addBoundaryWithIdentifier:@"LeftBoundary" fromPoint:CGPointMake(-1.0f, 100.0f) toPoint:CGPointMake(-1.0f, fromViewController.view.frame.size.height)];
78 |
79 | [animator addBehavior:gravity];
80 | [animator addBehavior:attachment1];
81 | [animator addBehavior:attachment2];
82 | [animator addBehavior:propertiesBehavior];
83 | [animator addBehavior:pushBehavior];
84 | [animator addBehavior:collisionBehavior];
85 |
86 | return animator;
87 | }
88 |
89 | @end
90 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | desc "Runs the specs [EMPTY]"
2 | task :spec do
3 | # Provide your own implementation
4 | end
5 |
6 | task :version do
7 | git_remotes = `git remote`.strip.split("\n")
8 |
9 | if git_remotes.count > 0
10 | puts "-- fetching version number from github"
11 | sh 'git fetch'
12 |
13 | remote_version = remote_spec_version
14 | end
15 |
16 | if remote_version.nil?
17 | puts "There is no current released version. You're about to release a new Pod."
18 | version = "0.0.1"
19 | else
20 | puts "The current released version of your pod is " +
21 | remote_spec_version.to_s()
22 | version = suggested_version_number
23 | end
24 |
25 | puts "Enter the version you want to release (" + version + ") "
26 | new_version_number = $stdin.gets.strip
27 | if new_version_number == ""
28 | new_version_number = version
29 | end
30 |
31 | replace_version_number(new_version_number)
32 | end
33 |
34 | desc "Release a new version of the Pod (append repo=name to push to a private spec repo)"
35 | task :release do
36 | # Allow override of spec repo name using `repo=private` after task name
37 | repo = ENV["repo"] || "master"
38 |
39 | puts "* Running version"
40 | sh "rake version"
41 |
42 | unless ENV['SKIP_CHECKS']
43 | if `git symbolic-ref HEAD 2>/dev/null`.strip.split('/').last != 'master'
44 | $stderr.puts "[!] You need to be on the `master' branch in order to be able to do a release."
45 | exit 1
46 | end
47 |
48 | if `git tag`.strip.split("\n").include?(spec_version)
49 | $stderr.puts "[!] A tag for version `#{spec_version}' already exists. Change the version in the podspec"
50 | exit 1
51 | end
52 |
53 | puts "You are about to release `#{spec_version}`, is that correct? [y/n]"
54 | exit if $stdin.gets.strip.downcase != 'y'
55 | end
56 |
57 | puts "* Running specs"
58 | sh "rake spec"
59 |
60 | puts "* Linting the podspec"
61 | sh "pod lib lint"
62 |
63 | # Then release
64 | sh "git commit #{podspec_path} CHANGELOG.md -m 'Release #{spec_version}' --allow-empty"
65 | sh "git tag -a #{spec_version} -m 'Release #{spec_version}'"
66 | sh "git push origin master"
67 | sh "git push origin --tags"
68 | sh "pod push #{repo} #{podspec_path}"
69 | end
70 |
71 | # @return [Pod::Version] The version as reported by the Podspec.
72 | #
73 | def spec_version
74 | require 'cocoapods'
75 | spec = Pod::Specification.from_file(podspec_path)
76 | spec.version
77 | end
78 |
79 | # @return [Pod::Version] The version as reported by the Podspec from remote.
80 | #
81 | def remote_spec_version
82 | require 'cocoapods-core'
83 |
84 | if spec_file_exist_on_remote?
85 | remote_spec = eval(`git show origin/master:#{podspec_path}`)
86 | remote_spec.version
87 | else
88 | nil
89 | end
90 | end
91 |
92 | # @return [Bool] If the remote repository has a copy of the podpesc file or not.
93 | #
94 | def spec_file_exist_on_remote?
95 | test_condition = `if git rev-parse --verify --quiet origin/master:#{podspec_path} >/dev/null;
96 | then
97 | echo 'true'
98 | else
99 | echo 'false'
100 | fi`
101 |
102 | 'true' == test_condition.strip
103 | end
104 |
105 | # @return [String] The relative path of the Podspec.
106 | #
107 | def podspec_path
108 | podspecs = Dir.glob('*.podspec')
109 | if podspecs.count == 1
110 | podspecs.first
111 | else
112 | raise "Could not select a podspec"
113 | end
114 | end
115 |
116 | # @return [String] The suggested version number based on the local and remote
117 | # version numbers.
118 | #
119 | def suggested_version_number
120 | if spec_version != remote_spec_version
121 | spec_version.to_s()
122 | else
123 | next_version(spec_version).to_s()
124 | end
125 | end
126 |
127 | # @param [Pod::Version] version
128 | # the version for which you need the next version
129 | #
130 | # @note It is computed by bumping the last component of
131 | # the version string by 1.
132 | #
133 | # @return [Pod::Version] The version that comes next after
134 | # the version supplied.
135 | #
136 | def next_version(version)
137 | version_components = version.to_s().split(".");
138 | last = (version_components.last.to_i() + 1).to_s
139 | version_components[-1] = last
140 | Pod::Version.new(version_components.join("."))
141 | end
142 |
143 | # @param [String] new_version_number
144 | # the new version number
145 | #
146 | # @note This methods replaces the version number in the podspec file
147 | # with a new version number.
148 | #
149 | # @return void
150 | #
151 | def replace_version_number(new_version_number)
152 | text = File.read(podspec_path)
153 | text.gsub!(/(s.version( )*= ")#{spec_version}(")/,
154 | "\\1#{new_version_number}\\3")
155 | File.open(podspec_path, "w") { |file| file.puts text }
156 | end
157 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/ViewControllerTransitionPlayground.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | F297E59018FDB2C300D73C3A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E58F18FDB2C300D73C3A /* Foundation.framework */; };
11 | F297E59218FDB2C300D73C3A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E59118FDB2C300D73C3A /* CoreGraphics.framework */; };
12 | F297E59418FDB2C300D73C3A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E59318FDB2C300D73C3A /* UIKit.framework */; };
13 | F297E59A18FDB2C300D73C3A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F297E59818FDB2C300D73C3A /* InfoPlist.strings */; };
14 | F297E59C18FDB2C300D73C3A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F297E59B18FDB2C300D73C3A /* main.m */; };
15 | F297E5A018FDB2C300D73C3A /* DDHAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F297E59F18FDB2C300D73C3A /* DDHAppDelegate.m */; };
16 | F297E5A318FDB2C300D73C3A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F297E5A118FDB2C300D73C3A /* Main.storyboard */; };
17 | F297E5A618FDB2C300D73C3A /* DDHMasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F297E5A518FDB2C300D73C3A /* DDHMasterViewController.m */; };
18 | F297E5A918FDB2C300D73C3A /* DDHDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F297E5A818FDB2C300D73C3A /* DDHDetailViewController.m */; };
19 | F297E5AB18FDB2C300D73C3A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F297E5AA18FDB2C300D73C3A /* Images.xcassets */; };
20 | F297E5B218FDB2C300D73C3A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E5B118FDB2C300D73C3A /* XCTest.framework */; };
21 | F297E5B318FDB2C300D73C3A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E58F18FDB2C300D73C3A /* Foundation.framework */; };
22 | F297E5B418FDB2C300D73C3A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F297E59318FDB2C300D73C3A /* UIKit.framework */; };
23 | F297E5BC18FDB2C300D73C3A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F297E5BA18FDB2C300D73C3A /* InfoPlist.strings */; };
24 | F297E5BE18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F297E5BD18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.m */; };
25 | F2A1804A1901BE9900E5735D /* DDHGravityPopAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A1803D1901BE9900E5735D /* DDHGravityPopAnimator.m */; };
26 | F2A1804B1901BE9900E5735D /* DDHGravityPushAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A1803F1901BE9900E5735D /* DDHGravityPushAnimator.m */; };
27 | F2A1804C1901BE9900E5735D /* DDHGravityRotationPopAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A180411901BE9900E5735D /* DDHGravityRotationPopAnimator.m */; };
28 | F2A1804D1901BE9900E5735D /* DDHGravityRotationPushAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A180431901BE9900E5735D /* DDHGravityRotationPushAnimator.m */; };
29 | F2A1804E1901BE9900E5735D /* DDHSnapPopAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A180451901BE9900E5735D /* DDHSnapPopAnimator.m */; };
30 | F2A1804F1901BE9900E5735D /* DDHSnapPushAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A180471901BE9900E5735D /* DDHSnapPushAnimator.m */; };
31 | F2A180501901BE9900E5735D /* DDHTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A180491901BE9900E5735D /* DDHTransitionAnimator.m */; };
32 | F2A1805319026BD500E5735D /* DDHNavigationControllerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A1805219026BD500E5735D /* DDHNavigationControllerDelegate.m */; };
33 | /* End PBXBuildFile section */
34 |
35 | /* Begin PBXContainerItemProxy section */
36 | F297E5B518FDB2C300D73C3A /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = F297E58418FDB2C300D73C3A /* Project object */;
39 | proxyType = 1;
40 | remoteGlobalIDString = F297E58B18FDB2C300D73C3A;
41 | remoteInfo = ViewControllerTransitionPlayground;
42 | };
43 | /* End PBXContainerItemProxy section */
44 |
45 | /* Begin PBXFileReference section */
46 | F297E58C18FDB2C300D73C3A /* ViewControllerTransitionPlayground.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ViewControllerTransitionPlayground.app; sourceTree = BUILT_PRODUCTS_DIR; };
47 | F297E58F18FDB2C300D73C3A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
48 | F297E59118FDB2C300D73C3A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
49 | F297E59318FDB2C300D73C3A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
50 | F297E59718FDB2C300D73C3A /* ViewControllerTransitionPlayground-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ViewControllerTransitionPlayground-Info.plist"; sourceTree = ""; };
51 | F297E59918FDB2C300D73C3A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
52 | F297E59B18FDB2C300D73C3A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = main.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
53 | F297E59D18FDB2C300D73C3A /* ViewControllerTransitionPlayground-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ViewControllerTransitionPlayground-Prefix.pch"; sourceTree = ""; };
54 | F297E59E18FDB2C300D73C3A /* DDHAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHAppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
55 | F297E59F18FDB2C300D73C3A /* DDHAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHAppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
56 | F297E5A218FDB2C300D73C3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
57 | F297E5A418FDB2C300D73C3A /* DDHMasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHMasterViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
58 | F297E5A518FDB2C300D73C3A /* DDHMasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHMasterViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
59 | F297E5A718FDB2C300D73C3A /* DDHDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHDetailViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
60 | F297E5A818FDB2C300D73C3A /* DDHDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHDetailViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
61 | F297E5AA18FDB2C300D73C3A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
62 | F297E5B018FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ViewControllerTransitionPlaygroundTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
63 | F297E5B118FDB2C300D73C3A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
64 | F297E5B918FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ViewControllerTransitionPlaygroundTests-Info.plist"; sourceTree = ""; };
65 | F297E5BB18FDB2C300D73C3A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
66 | F297E5BD18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ViewControllerTransitionPlaygroundTests.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
67 | F2A1803C1901BE9900E5735D /* DDHGravityPopAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHGravityPopAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
68 | F2A1803D1901BE9900E5735D /* DDHGravityPopAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHGravityPopAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
69 | F2A1803E1901BE9900E5735D /* DDHGravityPushAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHGravityPushAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
70 | F2A1803F1901BE9900E5735D /* DDHGravityPushAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHGravityPushAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
71 | F2A180401901BE9900E5735D /* DDHGravityRotationPopAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHGravityRotationPopAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
72 | F2A180411901BE9900E5735D /* DDHGravityRotationPopAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHGravityRotationPopAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
73 | F2A180421901BE9900E5735D /* DDHGravityRotationPushAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHGravityRotationPushAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
74 | F2A180431901BE9900E5735D /* DDHGravityRotationPushAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHGravityRotationPushAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
75 | F2A180441901BE9900E5735D /* DDHSnapPopAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHSnapPopAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
76 | F2A180451901BE9900E5735D /* DDHSnapPopAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHSnapPopAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
77 | F2A180461901BE9900E5735D /* DDHSnapPushAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHSnapPushAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
78 | F2A180471901BE9900E5735D /* DDHSnapPushAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHSnapPushAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
79 | F2A180481901BE9900E5735D /* DDHTransitionAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHTransitionAnimator.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
80 | F2A180491901BE9900E5735D /* DDHTransitionAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHTransitionAnimator.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
81 | F2A1805119026BD500E5735D /* DDHNavigationControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DDHNavigationControllerDelegate.h; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
82 | F2A1805219026BD500E5735D /* DDHNavigationControllerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DDHNavigationControllerDelegate.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
83 | /* End PBXFileReference section */
84 |
85 | /* Begin PBXFrameworksBuildPhase section */
86 | F297E58918FDB2C300D73C3A /* Frameworks */ = {
87 | isa = PBXFrameworksBuildPhase;
88 | buildActionMask = 2147483647;
89 | files = (
90 | F297E59218FDB2C300D73C3A /* CoreGraphics.framework in Frameworks */,
91 | F297E59418FDB2C300D73C3A /* UIKit.framework in Frameworks */,
92 | F297E59018FDB2C300D73C3A /* Foundation.framework in Frameworks */,
93 | );
94 | runOnlyForDeploymentPostprocessing = 0;
95 | };
96 | F297E5AD18FDB2C300D73C3A /* Frameworks */ = {
97 | isa = PBXFrameworksBuildPhase;
98 | buildActionMask = 2147483647;
99 | files = (
100 | F297E5B218FDB2C300D73C3A /* XCTest.framework in Frameworks */,
101 | F297E5B418FDB2C300D73C3A /* UIKit.framework in Frameworks */,
102 | F297E5B318FDB2C300D73C3A /* Foundation.framework in Frameworks */,
103 | );
104 | runOnlyForDeploymentPostprocessing = 0;
105 | };
106 | /* End PBXFrameworksBuildPhase section */
107 |
108 | /* Begin PBXGroup section */
109 | F297E58318FDB2C300D73C3A = {
110 | isa = PBXGroup;
111 | children = (
112 | F297E59518FDB2C300D73C3A /* ViewControllerTransitionPlayground */,
113 | F297E5B718FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests */,
114 | F297E58E18FDB2C300D73C3A /* Frameworks */,
115 | F297E58D18FDB2C300D73C3A /* Products */,
116 | );
117 | sourceTree = "";
118 | };
119 | F297E58D18FDB2C300D73C3A /* Products */ = {
120 | isa = PBXGroup;
121 | children = (
122 | F297E58C18FDB2C300D73C3A /* ViewControllerTransitionPlayground.app */,
123 | F297E5B018FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.xctest */,
124 | );
125 | name = Products;
126 | sourceTree = "";
127 | };
128 | F297E58E18FDB2C300D73C3A /* Frameworks */ = {
129 | isa = PBXGroup;
130 | children = (
131 | F297E58F18FDB2C300D73C3A /* Foundation.framework */,
132 | F297E59118FDB2C300D73C3A /* CoreGraphics.framework */,
133 | F297E59318FDB2C300D73C3A /* UIKit.framework */,
134 | F297E5B118FDB2C300D73C3A /* XCTest.framework */,
135 | );
136 | name = Frameworks;
137 | sourceTree = "";
138 | };
139 | F297E59518FDB2C300D73C3A /* ViewControllerTransitionPlayground */ = {
140 | isa = PBXGroup;
141 | children = (
142 | F297E59E18FDB2C300D73C3A /* DDHAppDelegate.h */,
143 | F297E59F18FDB2C300D73C3A /* DDHAppDelegate.m */,
144 | F297E5A118FDB2C300D73C3A /* Main.storyboard */,
145 | F297E5A418FDB2C300D73C3A /* DDHMasterViewController.h */,
146 | F297E5A518FDB2C300D73C3A /* DDHMasterViewController.m */,
147 | F297E5A718FDB2C300D73C3A /* DDHDetailViewController.h */,
148 | F297E5A818FDB2C300D73C3A /* DDHDetailViewController.m */,
149 | F2A1805119026BD500E5735D /* DDHNavigationControllerDelegate.h */,
150 | F2A1805219026BD500E5735D /* DDHNavigationControllerDelegate.m */,
151 | F2A1803B1901BE9900E5735D /* DynamicTransitionAnimators */,
152 | F297E5AA18FDB2C300D73C3A /* Images.xcassets */,
153 | F297E59618FDB2C300D73C3A /* Supporting Files */,
154 | );
155 | path = ViewControllerTransitionPlayground;
156 | sourceTree = "";
157 | };
158 | F297E59618FDB2C300D73C3A /* Supporting Files */ = {
159 | isa = PBXGroup;
160 | children = (
161 | F297E59718FDB2C300D73C3A /* ViewControllerTransitionPlayground-Info.plist */,
162 | F297E59818FDB2C300D73C3A /* InfoPlist.strings */,
163 | F297E59B18FDB2C300D73C3A /* main.m */,
164 | F297E59D18FDB2C300D73C3A /* ViewControllerTransitionPlayground-Prefix.pch */,
165 | );
166 | name = "Supporting Files";
167 | sourceTree = "";
168 | };
169 | F297E5B718FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests */ = {
170 | isa = PBXGroup;
171 | children = (
172 | F297E5BD18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.m */,
173 | F297E5B818FDB2C300D73C3A /* Supporting Files */,
174 | );
175 | path = ViewControllerTransitionPlaygroundTests;
176 | sourceTree = "";
177 | };
178 | F297E5B818FDB2C300D73C3A /* Supporting Files */ = {
179 | isa = PBXGroup;
180 | children = (
181 | F297E5B918FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests-Info.plist */,
182 | F297E5BA18FDB2C300D73C3A /* InfoPlist.strings */,
183 | );
184 | name = "Supporting Files";
185 | sourceTree = "";
186 | };
187 | F2A1803B1901BE9900E5735D /* DynamicTransitionAnimators */ = {
188 | isa = PBXGroup;
189 | children = (
190 | F2A1803C1901BE9900E5735D /* DDHGravityPopAnimator.h */,
191 | F2A1803D1901BE9900E5735D /* DDHGravityPopAnimator.m */,
192 | F2A1803E1901BE9900E5735D /* DDHGravityPushAnimator.h */,
193 | F2A1803F1901BE9900E5735D /* DDHGravityPushAnimator.m */,
194 | F2A180401901BE9900E5735D /* DDHGravityRotationPopAnimator.h */,
195 | F2A180411901BE9900E5735D /* DDHGravityRotationPopAnimator.m */,
196 | F2A180421901BE9900E5735D /* DDHGravityRotationPushAnimator.h */,
197 | F2A180431901BE9900E5735D /* DDHGravityRotationPushAnimator.m */,
198 | F2A180441901BE9900E5735D /* DDHSnapPopAnimator.h */,
199 | F2A180451901BE9900E5735D /* DDHSnapPopAnimator.m */,
200 | F2A180461901BE9900E5735D /* DDHSnapPushAnimator.h */,
201 | F2A180471901BE9900E5735D /* DDHSnapPushAnimator.m */,
202 | F2A180481901BE9900E5735D /* DDHTransitionAnimator.h */,
203 | F2A180491901BE9900E5735D /* DDHTransitionAnimator.m */,
204 | );
205 | path = DynamicTransitionAnimators;
206 | sourceTree = SOURCE_ROOT;
207 | };
208 | /* End PBXGroup section */
209 |
210 | /* Begin PBXNativeTarget section */
211 | F297E58B18FDB2C300D73C3A /* ViewControllerTransitionPlayground */ = {
212 | isa = PBXNativeTarget;
213 | buildConfigurationList = F297E5C118FDB2C300D73C3A /* Build configuration list for PBXNativeTarget "ViewControllerTransitionPlayground" */;
214 | buildPhases = (
215 | F297E58818FDB2C300D73C3A /* Sources */,
216 | F297E58918FDB2C300D73C3A /* Frameworks */,
217 | F297E58A18FDB2C300D73C3A /* Resources */,
218 | );
219 | buildRules = (
220 | );
221 | dependencies = (
222 | );
223 | name = ViewControllerTransitionPlayground;
224 | productName = ViewControllerTransitionPlayground;
225 | productReference = F297E58C18FDB2C300D73C3A /* ViewControllerTransitionPlayground.app */;
226 | productType = "com.apple.product-type.application";
227 | };
228 | F297E5AF18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests */ = {
229 | isa = PBXNativeTarget;
230 | buildConfigurationList = F297E5C418FDB2C300D73C3A /* Build configuration list for PBXNativeTarget "ViewControllerTransitionPlaygroundTests" */;
231 | buildPhases = (
232 | F297E5AC18FDB2C300D73C3A /* Sources */,
233 | F297E5AD18FDB2C300D73C3A /* Frameworks */,
234 | F297E5AE18FDB2C300D73C3A /* Resources */,
235 | );
236 | buildRules = (
237 | );
238 | dependencies = (
239 | F297E5B618FDB2C300D73C3A /* PBXTargetDependency */,
240 | );
241 | name = ViewControllerTransitionPlaygroundTests;
242 | productName = ViewControllerTransitionPlaygroundTests;
243 | productReference = F297E5B018FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.xctest */;
244 | productType = "com.apple.product-type.bundle.unit-test";
245 | };
246 | /* End PBXNativeTarget section */
247 |
248 | /* Begin PBXProject section */
249 | F297E58418FDB2C300D73C3A /* Project object */ = {
250 | isa = PBXProject;
251 | attributes = {
252 | CLASSPREFIX = DDH;
253 | LastUpgradeCheck = 0510;
254 | ORGANIZATIONNAME = dasdom;
255 | TargetAttributes = {
256 | F297E5AF18FDB2C300D73C3A = {
257 | TestTargetID = F297E58B18FDB2C300D73C3A;
258 | };
259 | };
260 | };
261 | buildConfigurationList = F297E58718FDB2C300D73C3A /* Build configuration list for PBXProject "ViewControllerTransitionPlayground" */;
262 | compatibilityVersion = "Xcode 3.2";
263 | developmentRegion = English;
264 | hasScannedForEncodings = 0;
265 | knownRegions = (
266 | en,
267 | Base,
268 | );
269 | mainGroup = F297E58318FDB2C300D73C3A;
270 | productRefGroup = F297E58D18FDB2C300D73C3A /* Products */;
271 | projectDirPath = "";
272 | projectRoot = "";
273 | targets = (
274 | F297E58B18FDB2C300D73C3A /* ViewControllerTransitionPlayground */,
275 | F297E5AF18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests */,
276 | );
277 | };
278 | /* End PBXProject section */
279 |
280 | /* Begin PBXResourcesBuildPhase section */
281 | F297E58A18FDB2C300D73C3A /* Resources */ = {
282 | isa = PBXResourcesBuildPhase;
283 | buildActionMask = 2147483647;
284 | files = (
285 | F297E5AB18FDB2C300D73C3A /* Images.xcassets in Resources */,
286 | F297E59A18FDB2C300D73C3A /* InfoPlist.strings in Resources */,
287 | F297E5A318FDB2C300D73C3A /* Main.storyboard in Resources */,
288 | );
289 | runOnlyForDeploymentPostprocessing = 0;
290 | };
291 | F297E5AE18FDB2C300D73C3A /* Resources */ = {
292 | isa = PBXResourcesBuildPhase;
293 | buildActionMask = 2147483647;
294 | files = (
295 | F297E5BC18FDB2C300D73C3A /* InfoPlist.strings in Resources */,
296 | );
297 | runOnlyForDeploymentPostprocessing = 0;
298 | };
299 | /* End PBXResourcesBuildPhase section */
300 |
301 | /* Begin PBXSourcesBuildPhase section */
302 | F297E58818FDB2C300D73C3A /* Sources */ = {
303 | isa = PBXSourcesBuildPhase;
304 | buildActionMask = 2147483647;
305 | files = (
306 | F2A180501901BE9900E5735D /* DDHTransitionAnimator.m in Sources */,
307 | F2A1804F1901BE9900E5735D /* DDHSnapPushAnimator.m in Sources */,
308 | F2A1804A1901BE9900E5735D /* DDHGravityPopAnimator.m in Sources */,
309 | F2A1804D1901BE9900E5735D /* DDHGravityRotationPushAnimator.m in Sources */,
310 | F297E5A618FDB2C300D73C3A /* DDHMasterViewController.m in Sources */,
311 | F2A1805319026BD500E5735D /* DDHNavigationControllerDelegate.m in Sources */,
312 | F2A1804C1901BE9900E5735D /* DDHGravityRotationPopAnimator.m in Sources */,
313 | F297E59C18FDB2C300D73C3A /* main.m in Sources */,
314 | F2A1804E1901BE9900E5735D /* DDHSnapPopAnimator.m in Sources */,
315 | F297E5A918FDB2C300D73C3A /* DDHDetailViewController.m in Sources */,
316 | F2A1804B1901BE9900E5735D /* DDHGravityPushAnimator.m in Sources */,
317 | F297E5A018FDB2C300D73C3A /* DDHAppDelegate.m in Sources */,
318 | );
319 | runOnlyForDeploymentPostprocessing = 0;
320 | };
321 | F297E5AC18FDB2C300D73C3A /* Sources */ = {
322 | isa = PBXSourcesBuildPhase;
323 | buildActionMask = 2147483647;
324 | files = (
325 | F297E5BE18FDB2C300D73C3A /* ViewControllerTransitionPlaygroundTests.m in Sources */,
326 | );
327 | runOnlyForDeploymentPostprocessing = 0;
328 | };
329 | /* End PBXSourcesBuildPhase section */
330 |
331 | /* Begin PBXTargetDependency section */
332 | F297E5B618FDB2C300D73C3A /* PBXTargetDependency */ = {
333 | isa = PBXTargetDependency;
334 | target = F297E58B18FDB2C300D73C3A /* ViewControllerTransitionPlayground */;
335 | targetProxy = F297E5B518FDB2C300D73C3A /* PBXContainerItemProxy */;
336 | };
337 | /* End PBXTargetDependency section */
338 |
339 | /* Begin PBXVariantGroup section */
340 | F297E59818FDB2C300D73C3A /* InfoPlist.strings */ = {
341 | isa = PBXVariantGroup;
342 | children = (
343 | F297E59918FDB2C300D73C3A /* en */,
344 | );
345 | name = InfoPlist.strings;
346 | sourceTree = "";
347 | };
348 | F297E5A118FDB2C300D73C3A /* Main.storyboard */ = {
349 | isa = PBXVariantGroup;
350 | children = (
351 | F297E5A218FDB2C300D73C3A /* Base */,
352 | );
353 | name = Main.storyboard;
354 | sourceTree = "";
355 | };
356 | F297E5BA18FDB2C300D73C3A /* InfoPlist.strings */ = {
357 | isa = PBXVariantGroup;
358 | children = (
359 | F297E5BB18FDB2C300D73C3A /* en */,
360 | );
361 | name = InfoPlist.strings;
362 | sourceTree = "";
363 | };
364 | /* End PBXVariantGroup section */
365 |
366 | /* Begin XCBuildConfiguration section */
367 | F297E5BF18FDB2C300D73C3A /* Debug */ = {
368 | isa = XCBuildConfiguration;
369 | buildSettings = {
370 | ALWAYS_SEARCH_USER_PATHS = NO;
371 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
372 | CLANG_CXX_LIBRARY = "libc++";
373 | CLANG_ENABLE_MODULES = YES;
374 | CLANG_ENABLE_OBJC_ARC = YES;
375 | CLANG_WARN_BOOL_CONVERSION = YES;
376 | CLANG_WARN_CONSTANT_CONVERSION = YES;
377 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
378 | CLANG_WARN_EMPTY_BODY = YES;
379 | CLANG_WARN_ENUM_CONVERSION = YES;
380 | CLANG_WARN_INT_CONVERSION = YES;
381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
382 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
383 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
384 | COPY_PHASE_STRIP = NO;
385 | GCC_C_LANGUAGE_STANDARD = gnu99;
386 | GCC_DYNAMIC_NO_PIC = NO;
387 | GCC_OPTIMIZATION_LEVEL = 0;
388 | GCC_PREPROCESSOR_DEFINITIONS = (
389 | "DEBUG=1",
390 | "$(inherited)",
391 | );
392 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
393 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
394 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
395 | GCC_WARN_UNDECLARED_SELECTOR = YES;
396 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
397 | GCC_WARN_UNUSED_FUNCTION = YES;
398 | GCC_WARN_UNUSED_VARIABLE = YES;
399 | IPHONEOS_DEPLOYMENT_TARGET = 7.1;
400 | ONLY_ACTIVE_ARCH = YES;
401 | SDKROOT = iphoneos;
402 | };
403 | name = Debug;
404 | };
405 | F297E5C018FDB2C300D73C3A /* Release */ = {
406 | isa = XCBuildConfiguration;
407 | buildSettings = {
408 | ALWAYS_SEARCH_USER_PATHS = NO;
409 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
410 | CLANG_CXX_LIBRARY = "libc++";
411 | CLANG_ENABLE_MODULES = YES;
412 | CLANG_ENABLE_OBJC_ARC = YES;
413 | CLANG_WARN_BOOL_CONVERSION = YES;
414 | CLANG_WARN_CONSTANT_CONVERSION = YES;
415 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
416 | CLANG_WARN_EMPTY_BODY = YES;
417 | CLANG_WARN_ENUM_CONVERSION = YES;
418 | CLANG_WARN_INT_CONVERSION = YES;
419 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
420 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
422 | COPY_PHASE_STRIP = YES;
423 | ENABLE_NS_ASSERTIONS = NO;
424 | GCC_C_LANGUAGE_STANDARD = gnu99;
425 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
426 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
427 | GCC_WARN_UNDECLARED_SELECTOR = YES;
428 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
429 | GCC_WARN_UNUSED_FUNCTION = YES;
430 | GCC_WARN_UNUSED_VARIABLE = YES;
431 | IPHONEOS_DEPLOYMENT_TARGET = 7.1;
432 | SDKROOT = iphoneos;
433 | VALIDATE_PRODUCT = YES;
434 | };
435 | name = Release;
436 | };
437 | F297E5C218FDB2C300D73C3A /* Debug */ = {
438 | isa = XCBuildConfiguration;
439 | buildSettings = {
440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
441 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
442 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
443 | GCC_PREFIX_HEADER = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Prefix.pch";
444 | INFOPLIST_FILE = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Info.plist";
445 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
446 | PRODUCT_NAME = "$(TARGET_NAME)";
447 | WRAPPER_EXTENSION = app;
448 | };
449 | name = Debug;
450 | };
451 | F297E5C318FDB2C300D73C3A /* Release */ = {
452 | isa = XCBuildConfiguration;
453 | buildSettings = {
454 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
455 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
456 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
457 | GCC_PREFIX_HEADER = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Prefix.pch";
458 | INFOPLIST_FILE = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Info.plist";
459 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
460 | PRODUCT_NAME = "$(TARGET_NAME)";
461 | WRAPPER_EXTENSION = app;
462 | };
463 | name = Release;
464 | };
465 | F297E5C518FDB2C300D73C3A /* Debug */ = {
466 | isa = XCBuildConfiguration;
467 | buildSettings = {
468 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ViewControllerTransitionPlayground.app/ViewControllerTransitionPlayground";
469 | FRAMEWORK_SEARCH_PATHS = (
470 | "$(SDKROOT)/Developer/Library/Frameworks",
471 | "$(inherited)",
472 | "$(DEVELOPER_FRAMEWORKS_DIR)",
473 | );
474 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
475 | GCC_PREFIX_HEADER = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Prefix.pch";
476 | GCC_PREPROCESSOR_DEFINITIONS = (
477 | "DEBUG=1",
478 | "$(inherited)",
479 | );
480 | INFOPLIST_FILE = "ViewControllerTransitionPlaygroundTests/ViewControllerTransitionPlaygroundTests-Info.plist";
481 | PRODUCT_NAME = "$(TARGET_NAME)";
482 | TEST_HOST = "$(BUNDLE_LOADER)";
483 | WRAPPER_EXTENSION = xctest;
484 | };
485 | name = Debug;
486 | };
487 | F297E5C618FDB2C300D73C3A /* Release */ = {
488 | isa = XCBuildConfiguration;
489 | buildSettings = {
490 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ViewControllerTransitionPlayground.app/ViewControllerTransitionPlayground";
491 | FRAMEWORK_SEARCH_PATHS = (
492 | "$(SDKROOT)/Developer/Library/Frameworks",
493 | "$(inherited)",
494 | "$(DEVELOPER_FRAMEWORKS_DIR)",
495 | );
496 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
497 | GCC_PREFIX_HEADER = "ViewControllerTransitionPlayground/ViewControllerTransitionPlayground-Prefix.pch";
498 | INFOPLIST_FILE = "ViewControllerTransitionPlaygroundTests/ViewControllerTransitionPlaygroundTests-Info.plist";
499 | PRODUCT_NAME = "$(TARGET_NAME)";
500 | TEST_HOST = "$(BUNDLE_LOADER)";
501 | WRAPPER_EXTENSION = xctest;
502 | };
503 | name = Release;
504 | };
505 | /* End XCBuildConfiguration section */
506 |
507 | /* Begin XCConfigurationList section */
508 | F297E58718FDB2C300D73C3A /* Build configuration list for PBXProject "ViewControllerTransitionPlayground" */ = {
509 | isa = XCConfigurationList;
510 | buildConfigurations = (
511 | F297E5BF18FDB2C300D73C3A /* Debug */,
512 | F297E5C018FDB2C300D73C3A /* Release */,
513 | );
514 | defaultConfigurationIsVisible = 0;
515 | defaultConfigurationName = Release;
516 | };
517 | F297E5C118FDB2C300D73C3A /* Build configuration list for PBXNativeTarget "ViewControllerTransitionPlayground" */ = {
518 | isa = XCConfigurationList;
519 | buildConfigurations = (
520 | F297E5C218FDB2C300D73C3A /* Debug */,
521 | F297E5C318FDB2C300D73C3A /* Release */,
522 | );
523 | defaultConfigurationIsVisible = 0;
524 | defaultConfigurationName = Release;
525 | };
526 | F297E5C418FDB2C300D73C3A /* Build configuration list for PBXNativeTarget "ViewControllerTransitionPlaygroundTests" */ = {
527 | isa = XCConfigurationList;
528 | buildConfigurations = (
529 | F297E5C518FDB2C300D73C3A /* Debug */,
530 | F297E5C618FDB2C300D73C3A /* Release */,
531 | );
532 | defaultConfigurationIsVisible = 0;
533 | defaultConfigurationName = Release;
534 | };
535 | /* End XCConfigurationList section */
536 | };
537 | rootObject = F297E58418FDB2C300D73C3A /* Project object */;
538 | }
539 |
--------------------------------------------------------------------------------