├── ESSTransitionByZooming.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── ESSTransitionByZooming
├── main.m
├── AppDelegate.h
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
├── AppDelegate.m
├── NSView+ESSViewCategory.h
├── NSView+ESSViewCategory.m
└── Base.lproj
│ └── MainMenu.xib
├── .gitignore
├── ESSTransitionByZoomingTests
├── Info.plist
└── ESSTransitionByZoomingTests.m
└── README.md
/ESSTransitionByZooming.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // ESSTransitionByZooming
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // ESSTransitionByZooming
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | #Pods/
27 |
--------------------------------------------------------------------------------
/ESSTransitionByZoomingTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | at.EternalStorms.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ESSTransitionByZoomingTests/ESSTransitionByZoomingTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // ESSTransitionByZoomingTests.m
3 | // ESSTransitionByZoomingTests
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface ESSTransitionByZoomingTests : XCTestCase
13 |
14 | @end
15 |
16 | @implementation ESSTransitionByZoomingTests
17 |
18 | - (void)setUp {
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 | // Put teardown code here. This method is called after the invocation of each test method in the class.
25 | [super tearDown];
26 | }
27 |
28 | - (void)testExample {
29 | // This is an example of a functional test case.
30 | XCTAssert(YES, @"Pass");
31 | }
32 |
33 | - (void)testPerformanceExample {
34 | // This is an example of a performance test case.
35 | [self measureBlock:^{
36 | // Put the code you want to measure the time of here.
37 | }];
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/ESSTransitionByZooming/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | at.EternalStorms.$(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
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2015 Eternal Storms Software. All rights reserved.
29 | NSMainNibFile
30 | MainMenu
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // ESSTransitionByZooming
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "NSView+ESSViewCategory.h"
11 |
12 | @interface AppDelegate ()
13 |
14 | @property (weak) IBOutlet NSWindow *window;
15 | @property (strong) IBOutlet NSView *firstView;
16 | @property (strong) IBOutlet NSView *secondView;
17 |
18 | - (IBAction)transitionIn:(id)sender;
19 | - (IBAction)transitionOut:(id)sender;
20 |
21 | @end
22 |
23 | @implementation AppDelegate
24 |
25 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
26 | // Insert code here to initialize your application
27 | }
28 |
29 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
30 | // Insert code here to tear down your application
31 | }
32 |
33 | - (void)transitionOut:(id)sender
34 | {
35 | [NSView transitionFromView:self.firstView
36 | toView:self.secondView
37 | withZoomingTransition:ESSViewZoomTransitionZoomOut
38 | duration:0.15
39 | completionHandler:nil];
40 | }
41 |
42 | - (void)transitionIn:(id)sender
43 | {
44 | [NSView transitionFromView:self.secondView
45 | toView:self.firstView
46 | withZoomingTransition:ESSViewZoomTransitionZoomIn
47 | duration:0.15
48 | completionHandler:nil];
49 | }
50 |
51 | @end
52 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/NSView+ESSViewCategory.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSView+ESSViewCategory.h
3 | // ESSTransitionByZooming
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | /*!
12 | @typedef ESSViewZoomTransition
13 | @abstract The zoom animation to be used in +transitionFromView:toView:withZoomingTransition:duration:completionHandler:
14 | @discussion Might be used to create a zoom in, zoom out effect (like, zoom into a detailed setup view, zoom out of it to the more general overview-view)
15 | */
16 | typedef enum : NSUInteger {
17 | ESSViewZoomTransitionZoomIn,
18 | ESSViewZoomTransitionZoomOut
19 | } ESSViewZoomTransition;
20 |
21 | @interface NSView (ESSViewCategory)
22 |
23 | /*!
24 | @method transitionFromView:toView:withZoomingTransition:duration:completionHandler:
25 | @abstract A class method to transition from one view to another by zooming into or out of it.
26 | @param fromView
27 | The NSView to be transitioned from, already in a view hierarchy. Must not be nil.
28 | @param toView
29 | The NSView to be transitioned to, assumed not to be inside any view hierarchy. Must not be nil.
30 | @param transition
31 | The transition to be used.
32 | @param duration
33 | The duration of the transition animation.
34 | @param completionHandler
35 | An optional completionHandler that is called after the transition animation ends.
36 | @discussion fromView and toView should be of the same frame size.
37 | */
38 | + (void)transitionFromView:(NSView *)fromView
39 | toView:(NSView *)toView
40 | withZoomingTransition:(ESSViewZoomTransition)transition
41 | duration:(CGFloat)duration
42 | completionHandler:(void (^)(void))completionHandler;
43 |
44 | /*!
45 | @method transitionToView:withZoomingTransition:duration:completionHandler:
46 | @abstract An instance method to transition from one view to another by zooming into or out of it.
47 | @param toView
48 | The NSView to be transitioned to, assumed not to be inside any view hierarchy. Must not be nil.
49 | @param transition
50 | The transition to be used.
51 | @param duration
52 | The duration of the transition animation.
53 | @param completionHandler
54 | An optional completionHandler that is called after the transition animation ends.
55 | @discussion fromView and toView should be of the same frame size. This method calls the class method with the target of this method as fromView.
56 | */
57 | - (void)transitionToView:(NSView *)toView
58 | withZoomingTransition:(ESSViewZoomTransition)transition
59 | duration:(CGFloat)duration
60 | completionHandler:(void (^)(void))completionHandler;
61 |
62 | @end
63 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NSView+ESSViewCategory
2 | a category on NSView that simplifies zoom-transitioning between two NSViews, inspired by OS X 10.10.3's Photos.app ([Blog Post](http://wp.me/p1hxut-6f))
3 |
4 | 
5 |
6 | ## First, the License Agreement
7 |
8 | 1) You can use the code in your own products.
9 | 2) You can modify the code as you wish, and use the modified code in your products.
10 | 3) You can redistribute the original, unmodified code, but you have to include the full license text below.
11 | 4) You can redistribute the modified code as you wish (without the full license text below).
12 | 5) In all cases, you must include a credit mentioning Matthias Gansrigler as the original author of the source.
13 | 6) I’m not liable for anything you do with the code, no matter what. So be sensible.
14 | 7) You can’t use my name or other marks to promote your products based on the code.
15 | 8) If you agree to all of that, go ahead and download the source. Otherwise, don’t.
16 |
17 | # How To Use NSView+ESSViewCategory
18 |
19 | You’ll have to first add the NSView+ESSViewCategory.h and *.m files to your project.
20 | Please note that the category imports for Core Animation’s CAMediaTiming class, so you might have to add that framework to your project, too.
21 |
22 | fromView
23 | It has to be inside of a view hierarchy. Fades out during the transition.
24 |
25 | toView
26 | Can be in a different xib file (for example, a NSViewController) or in the same as fromView. It’s important that it is not already on screen somewhere. Fades in during the transition.
27 |
28 | Once you have set up your views, either call the class method and pass fromView and toView as well as the other parameters or call the instance method on fromView.
29 |
30 | The class method:
31 | `+ (void)transitionFromView:(NSView *)fromView toView:(NSView *)toView withZoomingTransition:(ESSViewZoomTransition)transition duration:(CGFloat)duration completionHandler:(void (^)(void))completionHandler;`
32 |
33 | The instance method:
34 | `- (void)transitionToView:(NSView *)toView withZoomingTransition:(ESSViewZoomTransition)transition duration:(CGFloat)duration completionHandler:(void (^)(void))completionHandler;`
35 |
36 | Please refer to the sample project and/or the ([Blog Post](http://wp.me/p1hxut-6f)) for more information.
37 |
38 | ## Requirements
39 | This code has been tested on OS X Yosemite 10.10.3. It might work with earlier versions of the operating system.
40 | Developed with Xcode 6.3.1
41 |
42 | ## Support
43 | The framework and code is provided as-is, but if you need help or have suggestions, you can contact me anytime at [opensource@eternalstorms.at](mailto:opensource@eternalstorms.at) or [@eternalstorms on twitter](http://twitter.com/eternalstorms)
44 |
45 | For other Open Source projects of mine, please visit http://www.eternalstorms.at/opensource
46 |
47 | # I'd like to hear from you
48 | If you use NSView+ESSViewCategory in one of your projects, please be sure to [let me know](mailto:opensource@eternalstorms.at)! I'd love to hear about your apps and mention them here on this project page :) !!
--------------------------------------------------------------------------------
/ESSTransitionByZooming/NSView+ESSViewCategory.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSView+ESSViewCategory.m
3 | // ESSTransitionByZooming
4 | //
5 | // Created by Matthias Gansrigler on 28.04.2015.
6 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved.
7 | //
8 |
9 | #import "NSView+ESSViewCategory.h"
10 | #import
11 |
12 | @implementation NSView (ESSViewCategory)
13 |
14 | + (void)transitionFromView:(NSView *)fromView
15 | toView:(NSView *)toView
16 | withZoomingTransition:(ESSViewZoomTransition)transition
17 | duration:(CGFloat)duration
18 | completionHandler:(void (^)(void))completionHandler
19 | {
20 | if (fromView == nil || toView == nil)
21 | {
22 | if (completionHandler)
23 | completionHandler();
24 | return;
25 | }
26 |
27 | BOOL wantsLayer = fromView.superview.wantsLayer;
28 | fromView.superview.wantsLayer = YES;
29 | toView.frame = fromView.frame;
30 |
31 | //create an image of the view we're transitioning to
32 | NSBitmapImageRep *rep = [toView bitmapImageRepForCachingDisplayInRect:toView.bounds];
33 | [toView cacheDisplayInRect:toView.bounds toBitmapImageRep:rep];
34 | NSImage *toImage = [[NSImage alloc] initWithSize:rep.size];
35 | [toImage addRepresentation:rep];
36 |
37 | NSRect initialToRect = NSZeroRect;
38 | CGFloat widthDiff = (fromView.superview.frame.size.width/20.0);
39 | CGFloat heightDiff = (fromView.superview.frame.size.height/20.0);
40 | if (transition == ESSViewZoomTransitionZoomOut)
41 | initialToRect = NSMakeRect(-widthDiff,
42 | -heightDiff,
43 | fromView.superview.frame.size.width+(widthDiff*2),
44 | fromView.superview.frame.size.height+(heightDiff*2));
45 | else if (transition == ESSViewZoomTransitionZoomIn)
46 | initialToRect = NSMakeRect(widthDiff,
47 | heightDiff,
48 | fromView.superview.frame.size.width-(widthDiff*2),
49 | fromView.superview.frame.size.height-(heightDiff*2));
50 |
51 | NSImageView *toImageView = [[NSImageView alloc] initWithFrame:initialToRect];
52 | toImageView.wantsLayer = YES;
53 | toImageView.image = toImage;
54 | toImageView.imageAlignment = NSImageAlignCenter;
55 | toImageView.imageScaling = NSImageScaleAxesIndependently;
56 | toImageView.editable = NO;
57 | toImageView.animates = NO;
58 | toImageView.allowsCutCopyPaste = NO;
59 | toImageView.imageFrameStyle = NSImageFrameNone;
60 | toImageView.alphaValue = 0.0;
61 |
62 | toView.alphaValue = 0.0;
63 | [fromView.superview addSubview:toView];
64 |
65 | //create an image of the view we're transitioning from
66 | rep = [fromView bitmapImageRepForCachingDisplayInRect:fromView.bounds];
67 | [fromView cacheDisplayInRect:fromView.bounds toBitmapImageRep:rep];
68 | NSImage *fromImage = [[NSImage alloc] initWithSize:rep.size];
69 | [fromImage addRepresentation:rep];
70 |
71 | NSImageView *fromImageView = [[NSImageView alloc] initWithFrame:fromView.frame];
72 | fromImageView.wantsLayer = YES;
73 | fromImageView.image = fromImage;
74 | fromImageView.imageAlignment = NSImageAlignCenter;
75 | fromImageView.imageScaling = NSImageScaleAxesIndependently;
76 | fromImageView.editable = NO;
77 | fromImageView.animates = NO;
78 | fromImageView.allowsCutCopyPaste = NO;
79 | fromImageView.imageFrameStyle = NSImageFrameNone;
80 |
81 | [fromView.superview addSubview:fromImageView positioned:NSWindowAbove relativeTo:nil];
82 | [fromView.superview addSubview:toImageView positioned:NSWindowAbove relativeTo:nil];
83 | [fromView removeFromSuperview];
84 |
85 | [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
86 | context.duration = duration;
87 | context.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
88 | fromImageView.animator.alphaValue = 0.0;
89 | NSRect zoomRect = NSZeroRect;
90 | if (transition == ESSViewZoomTransitionZoomOut)
91 | zoomRect = NSMakeRect(widthDiff,
92 | heightDiff,
93 | fromImageView.frame.size.width-(widthDiff*2),
94 | fromImageView.frame.size.height-(heightDiff*2));
95 | else if (transition == ESSViewZoomTransitionZoomIn)
96 | zoomRect = NSMakeRect(-widthDiff,
97 | -heightDiff,
98 | fromImageView.frame.size.width+(widthDiff*2),
99 | fromImageView.frame.size.height+(heightDiff*2));
100 | fromImageView.animator.frame = zoomRect;
101 |
102 | toImageView.animator.alphaValue = 1.0;
103 | toImageView.animator.frame = fromImageView.superview.frame;
104 | }
105 | completionHandler:^{
106 | toView.alphaValue = 1.0;
107 | [fromImageView.superview addSubview:toView positioned:NSWindowAbove relativeTo:nil];
108 | [fromImageView removeFromSuperview];
109 | [toImageView removeFromSuperview];
110 | [fromView removeFromSuperview];
111 | fromView.superview.wantsLayer = wantsLayer;
112 |
113 | if (completionHandler)
114 | completionHandler();
115 | }];
116 | }
117 |
118 | - (void)transitionToView:(NSView *)toView
119 | withZoomingTransition:(ESSViewZoomTransition)transition
120 | duration:(CGFloat)duration
121 | completionHandler:(void (^)(void))completionHandler
122 | {
123 | [[self class] transitionFromView:self
124 | toView:toView
125 | withZoomingTransition:transition
126 | duration:duration
127 | completionHandler:completionHandler];
128 | }
129 |
130 | @end
131 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 39240DFD1AF0273500D87089 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 39240DFC1AF0273500D87089 /* AppDelegate.m */; };
11 | 39240DFF1AF0273500D87089 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 39240DFE1AF0273500D87089 /* main.m */; };
12 | 39240E011AF0273500D87089 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 39240E001AF0273500D87089 /* Images.xcassets */; };
13 | 39240E041AF0273500D87089 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 39240E021AF0273500D87089 /* MainMenu.xib */; };
14 | 39240E101AF0273500D87089 /* ESSTransitionByZoomingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 39240E0F1AF0273500D87089 /* ESSTransitionByZoomingTests.m */; };
15 | 39240E1B1AF0279100D87089 /* NSView+ESSViewCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = 39240E1A1AF0279100D87089 /* NSView+ESSViewCategory.m */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXContainerItemProxy section */
19 | 39240E0A1AF0273500D87089 /* PBXContainerItemProxy */ = {
20 | isa = PBXContainerItemProxy;
21 | containerPortal = 39240DEE1AF0273500D87089 /* Project object */;
22 | proxyType = 1;
23 | remoteGlobalIDString = 39240DF51AF0273500D87089;
24 | remoteInfo = ESSTransitionByZooming;
25 | };
26 | /* End PBXContainerItemProxy section */
27 |
28 | /* Begin PBXFileReference section */
29 | 39240DF61AF0273500D87089 /* ESSTransitionByZooming.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ESSTransitionByZooming.app; sourceTree = BUILT_PRODUCTS_DIR; };
30 | 39240DFA1AF0273500D87089 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
31 | 39240DFB1AF0273500D87089 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
32 | 39240DFC1AF0273500D87089 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
33 | 39240DFE1AF0273500D87089 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
34 | 39240E001AF0273500D87089 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
35 | 39240E031AF0273500D87089 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
36 | 39240E091AF0273500D87089 /* ESSTransitionByZoomingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ESSTransitionByZoomingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
37 | 39240E0E1AF0273500D87089 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
38 | 39240E0F1AF0273500D87089 /* ESSTransitionByZoomingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ESSTransitionByZoomingTests.m; sourceTree = ""; };
39 | 39240E191AF0279100D87089 /* NSView+ESSViewCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSView+ESSViewCategory.h"; sourceTree = ""; };
40 | 39240E1A1AF0279100D87089 /* NSView+ESSViewCategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSView+ESSViewCategory.m"; sourceTree = ""; };
41 | /* End PBXFileReference section */
42 |
43 | /* Begin PBXFrameworksBuildPhase section */
44 | 39240DF31AF0273500D87089 /* Frameworks */ = {
45 | isa = PBXFrameworksBuildPhase;
46 | buildActionMask = 2147483647;
47 | files = (
48 | );
49 | runOnlyForDeploymentPostprocessing = 0;
50 | };
51 | 39240E061AF0273500D87089 /* Frameworks */ = {
52 | isa = PBXFrameworksBuildPhase;
53 | buildActionMask = 2147483647;
54 | files = (
55 | );
56 | runOnlyForDeploymentPostprocessing = 0;
57 | };
58 | /* End PBXFrameworksBuildPhase section */
59 |
60 | /* Begin PBXGroup section */
61 | 39240DED1AF0273500D87089 = {
62 | isa = PBXGroup;
63 | children = (
64 | 39240DF81AF0273500D87089 /* ESSTransitionByZooming */,
65 | 39240E0C1AF0273500D87089 /* ESSTransitionByZoomingTests */,
66 | 39240DF71AF0273500D87089 /* Products */,
67 | );
68 | sourceTree = "";
69 | };
70 | 39240DF71AF0273500D87089 /* Products */ = {
71 | isa = PBXGroup;
72 | children = (
73 | 39240DF61AF0273500D87089 /* ESSTransitionByZooming.app */,
74 | 39240E091AF0273500D87089 /* ESSTransitionByZoomingTests.xctest */,
75 | );
76 | name = Products;
77 | sourceTree = "";
78 | };
79 | 39240DF81AF0273500D87089 /* ESSTransitionByZooming */ = {
80 | isa = PBXGroup;
81 | children = (
82 | 39240DFB1AF0273500D87089 /* AppDelegate.h */,
83 | 39240DFC1AF0273500D87089 /* AppDelegate.m */,
84 | 39240E191AF0279100D87089 /* NSView+ESSViewCategory.h */,
85 | 39240E1A1AF0279100D87089 /* NSView+ESSViewCategory.m */,
86 | 39240E001AF0273500D87089 /* Images.xcassets */,
87 | 39240E021AF0273500D87089 /* MainMenu.xib */,
88 | 39240DF91AF0273500D87089 /* Supporting Files */,
89 | );
90 | path = ESSTransitionByZooming;
91 | sourceTree = "";
92 | };
93 | 39240DF91AF0273500D87089 /* Supporting Files */ = {
94 | isa = PBXGroup;
95 | children = (
96 | 39240DFA1AF0273500D87089 /* Info.plist */,
97 | 39240DFE1AF0273500D87089 /* main.m */,
98 | );
99 | name = "Supporting Files";
100 | sourceTree = "";
101 | };
102 | 39240E0C1AF0273500D87089 /* ESSTransitionByZoomingTests */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 39240E0F1AF0273500D87089 /* ESSTransitionByZoomingTests.m */,
106 | 39240E0D1AF0273500D87089 /* Supporting Files */,
107 | );
108 | path = ESSTransitionByZoomingTests;
109 | sourceTree = "";
110 | };
111 | 39240E0D1AF0273500D87089 /* Supporting Files */ = {
112 | isa = PBXGroup;
113 | children = (
114 | 39240E0E1AF0273500D87089 /* Info.plist */,
115 | );
116 | name = "Supporting Files";
117 | sourceTree = "";
118 | };
119 | /* End PBXGroup section */
120 |
121 | /* Begin PBXNativeTarget section */
122 | 39240DF51AF0273500D87089 /* ESSTransitionByZooming */ = {
123 | isa = PBXNativeTarget;
124 | buildConfigurationList = 39240E131AF0273500D87089 /* Build configuration list for PBXNativeTarget "ESSTransitionByZooming" */;
125 | buildPhases = (
126 | 39240DF21AF0273500D87089 /* Sources */,
127 | 39240DF31AF0273500D87089 /* Frameworks */,
128 | 39240DF41AF0273500D87089 /* Resources */,
129 | );
130 | buildRules = (
131 | );
132 | dependencies = (
133 | );
134 | name = ESSTransitionByZooming;
135 | productName = ESSTransitionByZooming;
136 | productReference = 39240DF61AF0273500D87089 /* ESSTransitionByZooming.app */;
137 | productType = "com.apple.product-type.application";
138 | };
139 | 39240E081AF0273500D87089 /* ESSTransitionByZoomingTests */ = {
140 | isa = PBXNativeTarget;
141 | buildConfigurationList = 39240E161AF0273500D87089 /* Build configuration list for PBXNativeTarget "ESSTransitionByZoomingTests" */;
142 | buildPhases = (
143 | 39240E051AF0273500D87089 /* Sources */,
144 | 39240E061AF0273500D87089 /* Frameworks */,
145 | 39240E071AF0273500D87089 /* Resources */,
146 | );
147 | buildRules = (
148 | );
149 | dependencies = (
150 | 39240E0B1AF0273500D87089 /* PBXTargetDependency */,
151 | );
152 | name = ESSTransitionByZoomingTests;
153 | productName = ESSTransitionByZoomingTests;
154 | productReference = 39240E091AF0273500D87089 /* ESSTransitionByZoomingTests.xctest */;
155 | productType = "com.apple.product-type.bundle.unit-test";
156 | };
157 | /* End PBXNativeTarget section */
158 |
159 | /* Begin PBXProject section */
160 | 39240DEE1AF0273500D87089 /* Project object */ = {
161 | isa = PBXProject;
162 | attributes = {
163 | LastUpgradeCheck = 0630;
164 | ORGANIZATIONNAME = "Eternal Storms Software";
165 | TargetAttributes = {
166 | 39240DF51AF0273500D87089 = {
167 | CreatedOnToolsVersion = 6.3.1;
168 | };
169 | 39240E081AF0273500D87089 = {
170 | CreatedOnToolsVersion = 6.3.1;
171 | TestTargetID = 39240DF51AF0273500D87089;
172 | };
173 | };
174 | };
175 | buildConfigurationList = 39240DF11AF0273500D87089 /* Build configuration list for PBXProject "ESSTransitionByZooming" */;
176 | compatibilityVersion = "Xcode 3.2";
177 | developmentRegion = English;
178 | hasScannedForEncodings = 0;
179 | knownRegions = (
180 | en,
181 | Base,
182 | );
183 | mainGroup = 39240DED1AF0273500D87089;
184 | productRefGroup = 39240DF71AF0273500D87089 /* Products */;
185 | projectDirPath = "";
186 | projectRoot = "";
187 | targets = (
188 | 39240DF51AF0273500D87089 /* ESSTransitionByZooming */,
189 | 39240E081AF0273500D87089 /* ESSTransitionByZoomingTests */,
190 | );
191 | };
192 | /* End PBXProject section */
193 |
194 | /* Begin PBXResourcesBuildPhase section */
195 | 39240DF41AF0273500D87089 /* Resources */ = {
196 | isa = PBXResourcesBuildPhase;
197 | buildActionMask = 2147483647;
198 | files = (
199 | 39240E011AF0273500D87089 /* Images.xcassets in Resources */,
200 | 39240E041AF0273500D87089 /* MainMenu.xib in Resources */,
201 | );
202 | runOnlyForDeploymentPostprocessing = 0;
203 | };
204 | 39240E071AF0273500D87089 /* Resources */ = {
205 | isa = PBXResourcesBuildPhase;
206 | buildActionMask = 2147483647;
207 | files = (
208 | );
209 | runOnlyForDeploymentPostprocessing = 0;
210 | };
211 | /* End PBXResourcesBuildPhase section */
212 |
213 | /* Begin PBXSourcesBuildPhase section */
214 | 39240DF21AF0273500D87089 /* Sources */ = {
215 | isa = PBXSourcesBuildPhase;
216 | buildActionMask = 2147483647;
217 | files = (
218 | 39240DFF1AF0273500D87089 /* main.m in Sources */,
219 | 39240DFD1AF0273500D87089 /* AppDelegate.m in Sources */,
220 | 39240E1B1AF0279100D87089 /* NSView+ESSViewCategory.m in Sources */,
221 | );
222 | runOnlyForDeploymentPostprocessing = 0;
223 | };
224 | 39240E051AF0273500D87089 /* Sources */ = {
225 | isa = PBXSourcesBuildPhase;
226 | buildActionMask = 2147483647;
227 | files = (
228 | 39240E101AF0273500D87089 /* ESSTransitionByZoomingTests.m in Sources */,
229 | );
230 | runOnlyForDeploymentPostprocessing = 0;
231 | };
232 | /* End PBXSourcesBuildPhase section */
233 |
234 | /* Begin PBXTargetDependency section */
235 | 39240E0B1AF0273500D87089 /* PBXTargetDependency */ = {
236 | isa = PBXTargetDependency;
237 | target = 39240DF51AF0273500D87089 /* ESSTransitionByZooming */;
238 | targetProxy = 39240E0A1AF0273500D87089 /* PBXContainerItemProxy */;
239 | };
240 | /* End PBXTargetDependency section */
241 |
242 | /* Begin PBXVariantGroup section */
243 | 39240E021AF0273500D87089 /* MainMenu.xib */ = {
244 | isa = PBXVariantGroup;
245 | children = (
246 | 39240E031AF0273500D87089 /* Base */,
247 | );
248 | name = MainMenu.xib;
249 | sourceTree = "";
250 | };
251 | /* End PBXVariantGroup section */
252 |
253 | /* Begin XCBuildConfiguration section */
254 | 39240E111AF0273500D87089 /* Debug */ = {
255 | isa = XCBuildConfiguration;
256 | buildSettings = {
257 | ALWAYS_SEARCH_USER_PATHS = NO;
258 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
259 | CLANG_CXX_LIBRARY = "libc++";
260 | CLANG_ENABLE_MODULES = YES;
261 | CLANG_ENABLE_OBJC_ARC = YES;
262 | CLANG_WARN_BOOL_CONVERSION = YES;
263 | CLANG_WARN_CONSTANT_CONVERSION = YES;
264 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
265 | CLANG_WARN_EMPTY_BODY = YES;
266 | CLANG_WARN_ENUM_CONVERSION = YES;
267 | CLANG_WARN_INT_CONVERSION = YES;
268 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
269 | CLANG_WARN_UNREACHABLE_CODE = YES;
270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
271 | CODE_SIGN_IDENTITY = "-";
272 | COPY_PHASE_STRIP = NO;
273 | DEBUG_INFORMATION_FORMAT = dwarf;
274 | ENABLE_STRICT_OBJC_MSGSEND = YES;
275 | GCC_C_LANGUAGE_STANDARD = gnu99;
276 | GCC_DYNAMIC_NO_PIC = NO;
277 | GCC_NO_COMMON_BLOCKS = YES;
278 | GCC_OPTIMIZATION_LEVEL = 0;
279 | GCC_PREPROCESSOR_DEFINITIONS = (
280 | "DEBUG=1",
281 | "$(inherited)",
282 | );
283 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
284 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
285 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
286 | GCC_WARN_UNDECLARED_SELECTOR = YES;
287 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
288 | GCC_WARN_UNUSED_FUNCTION = YES;
289 | GCC_WARN_UNUSED_VARIABLE = YES;
290 | MACOSX_DEPLOYMENT_TARGET = 10.10;
291 | MTL_ENABLE_DEBUG_INFO = YES;
292 | ONLY_ACTIVE_ARCH = YES;
293 | SDKROOT = macosx;
294 | };
295 | name = Debug;
296 | };
297 | 39240E121AF0273500D87089 /* Release */ = {
298 | isa = XCBuildConfiguration;
299 | buildSettings = {
300 | ALWAYS_SEARCH_USER_PATHS = NO;
301 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
302 | CLANG_CXX_LIBRARY = "libc++";
303 | CLANG_ENABLE_MODULES = YES;
304 | CLANG_ENABLE_OBJC_ARC = YES;
305 | CLANG_WARN_BOOL_CONVERSION = YES;
306 | CLANG_WARN_CONSTANT_CONVERSION = YES;
307 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
308 | CLANG_WARN_EMPTY_BODY = YES;
309 | CLANG_WARN_ENUM_CONVERSION = YES;
310 | CLANG_WARN_INT_CONVERSION = YES;
311 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
312 | CLANG_WARN_UNREACHABLE_CODE = YES;
313 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
314 | CODE_SIGN_IDENTITY = "-";
315 | COPY_PHASE_STRIP = NO;
316 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
317 | ENABLE_NS_ASSERTIONS = NO;
318 | ENABLE_STRICT_OBJC_MSGSEND = YES;
319 | GCC_C_LANGUAGE_STANDARD = gnu99;
320 | GCC_NO_COMMON_BLOCKS = YES;
321 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
322 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
323 | GCC_WARN_UNDECLARED_SELECTOR = YES;
324 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
325 | GCC_WARN_UNUSED_FUNCTION = YES;
326 | GCC_WARN_UNUSED_VARIABLE = YES;
327 | MACOSX_DEPLOYMENT_TARGET = 10.10;
328 | MTL_ENABLE_DEBUG_INFO = NO;
329 | SDKROOT = macosx;
330 | };
331 | name = Release;
332 | };
333 | 39240E141AF0273500D87089 /* Debug */ = {
334 | isa = XCBuildConfiguration;
335 | buildSettings = {
336 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
337 | COMBINE_HIDPI_IMAGES = YES;
338 | INFOPLIST_FILE = ESSTransitionByZooming/Info.plist;
339 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
340 | PRODUCT_NAME = "$(TARGET_NAME)";
341 | };
342 | name = Debug;
343 | };
344 | 39240E151AF0273500D87089 /* Release */ = {
345 | isa = XCBuildConfiguration;
346 | buildSettings = {
347 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
348 | COMBINE_HIDPI_IMAGES = YES;
349 | INFOPLIST_FILE = ESSTransitionByZooming/Info.plist;
350 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
351 | PRODUCT_NAME = "$(TARGET_NAME)";
352 | };
353 | name = Release;
354 | };
355 | 39240E171AF0273500D87089 /* Debug */ = {
356 | isa = XCBuildConfiguration;
357 | buildSettings = {
358 | BUNDLE_LOADER = "$(TEST_HOST)";
359 | COMBINE_HIDPI_IMAGES = YES;
360 | FRAMEWORK_SEARCH_PATHS = (
361 | "$(DEVELOPER_FRAMEWORKS_DIR)",
362 | "$(inherited)",
363 | );
364 | GCC_PREPROCESSOR_DEFINITIONS = (
365 | "DEBUG=1",
366 | "$(inherited)",
367 | );
368 | INFOPLIST_FILE = ESSTransitionByZoomingTests/Info.plist;
369 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
370 | PRODUCT_NAME = "$(TARGET_NAME)";
371 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ESSTransitionByZooming.app/Contents/MacOS/ESSTransitionByZooming";
372 | };
373 | name = Debug;
374 | };
375 | 39240E181AF0273500D87089 /* Release */ = {
376 | isa = XCBuildConfiguration;
377 | buildSettings = {
378 | BUNDLE_LOADER = "$(TEST_HOST)";
379 | COMBINE_HIDPI_IMAGES = YES;
380 | FRAMEWORK_SEARCH_PATHS = (
381 | "$(DEVELOPER_FRAMEWORKS_DIR)",
382 | "$(inherited)",
383 | );
384 | INFOPLIST_FILE = ESSTransitionByZoomingTests/Info.plist;
385 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
386 | PRODUCT_NAME = "$(TARGET_NAME)";
387 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ESSTransitionByZooming.app/Contents/MacOS/ESSTransitionByZooming";
388 | };
389 | name = Release;
390 | };
391 | /* End XCBuildConfiguration section */
392 |
393 | /* Begin XCConfigurationList section */
394 | 39240DF11AF0273500D87089 /* Build configuration list for PBXProject "ESSTransitionByZooming" */ = {
395 | isa = XCConfigurationList;
396 | buildConfigurations = (
397 | 39240E111AF0273500D87089 /* Debug */,
398 | 39240E121AF0273500D87089 /* Release */,
399 | );
400 | defaultConfigurationIsVisible = 0;
401 | defaultConfigurationName = Release;
402 | };
403 | 39240E131AF0273500D87089 /* Build configuration list for PBXNativeTarget "ESSTransitionByZooming" */ = {
404 | isa = XCConfigurationList;
405 | buildConfigurations = (
406 | 39240E141AF0273500D87089 /* Debug */,
407 | 39240E151AF0273500D87089 /* Release */,
408 | );
409 | defaultConfigurationIsVisible = 0;
410 | };
411 | 39240E161AF0273500D87089 /* Build configuration list for PBXNativeTarget "ESSTransitionByZoomingTests" */ = {
412 | isa = XCConfigurationList;
413 | buildConfigurations = (
414 | 39240E171AF0273500D87089 /* Debug */,
415 | 39240E181AF0273500D87089 /* Release */,
416 | );
417 | defaultConfigurationIsVisible = 0;
418 | };
419 | /* End XCConfigurationList section */
420 | };
421 | rootObject = 39240DEE1AF0273500D87089 /* Project object */;
422 | }
423 |
--------------------------------------------------------------------------------
/ESSTransitionByZooming/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 | Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.
711 | The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
760 |
768 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
--------------------------------------------------------------------------------