Commits

Joris Kluivers committed e40ec45

Initial transition. Image controller doesn't work properly yet.

Comments (0)

Files changed (12)

+# .gitignore in use by Joris Kluivers
+#
+# Latest version:
+# https://gist.github.com/gists/1923197
+ 
+*.DS_Store
+ 
+# Xcode
+*.pbxuser
+*.mode1v3
+*.move2v3
+*.perspectivev3
+*.xcuserstate
+project.xcworkspace/
+xcuserdata/
+ 
+build/
+ 
+# Generated
+*.o
+*.pyc   

ImageTransition.xcodeproj/project.pbxproj

 		A95F4B7C16A197130024807A /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A95F4B7B16A197130024807A /* Default-568h@2x.png */; };
 		A95F4B7F16A197130024807A /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A95F4B7D16A197130024807A /* MainStoryboard.storyboard */; };
 		A95F4B8216A197130024807A /* JKViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A95F4B8116A197130024807A /* JKViewController.m */; };
+		A95F4B8A16A1978C0024807A /* JKImageTransitionSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = A95F4B8916A1978C0024807A /* JKImageTransitionSegue.m */; };
+		A95F4B8E16A198B10024807A /* BeachFull.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A95F4B8B16A198B10024807A /* BeachFull.jpg */; };
+		A95F4B8F16A198B10024807A /* BeachThumb.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A95F4B8C16A198B10024807A /* BeachThumb.jpg */; };
+		A95F4B9016A198B10024807A /* BeachThumb@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A95F4B8D16A198B10024807A /* BeachThumb@2x.jpg */; };
+		A95F4B9216A199520024807A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A95F4B9116A199520024807A /* QuartzCore.framework */; };
+		A95F4B9916A1B5520024807A /* JKImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A95F4B9816A1B5520024807A /* JKImageViewController.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
 		A95F4B7E16A197130024807A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = "<group>"; };
 		A95F4B8016A197130024807A /* JKViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JKViewController.h; sourceTree = "<group>"; };
 		A95F4B8116A197130024807A /* JKViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JKViewController.m; sourceTree = "<group>"; };
+		A95F4B8816A1978C0024807A /* JKImageTransitionSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JKImageTransitionSegue.h; sourceTree = "<group>"; };
+		A95F4B8916A1978C0024807A /* JKImageTransitionSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JKImageTransitionSegue.m; sourceTree = "<group>"; };
+		A95F4B8B16A198B10024807A /* BeachFull.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = BeachFull.jpg; sourceTree = "<group>"; };
+		A95F4B8C16A198B10024807A /* BeachThumb.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = BeachThumb.jpg; sourceTree = "<group>"; };
+		A95F4B8D16A198B10024807A /* BeachThumb@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "BeachThumb@2x.jpg"; sourceTree = "<group>"; };
+		A95F4B9116A199520024807A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+		A95F4B9716A1B5520024807A /* JKImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JKImageViewController.h; sourceTree = "<group>"; };
+		A95F4B9816A1B5520024807A /* JKImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JKImageViewController.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
 				A95F4B6616A197130024807A /* UIKit.framework in Frameworks */,
 				A95F4B6816A197130024807A /* Foundation.framework in Frameworks */,
 				A95F4B6A16A197130024807A /* CoreGraphics.framework in Frameworks */,
+				A95F4B9216A199520024807A /* QuartzCore.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 				A95F4B6516A197130024807A /* UIKit.framework */,
 				A95F4B6716A197130024807A /* Foundation.framework */,
 				A95F4B6916A197130024807A /* CoreGraphics.framework */,
+				A95F4B9116A199520024807A /* QuartzCore.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
 				A95F4B7D16A197130024807A /* MainStoryboard.storyboard */,
 				A95F4B8016A197130024807A /* JKViewController.h */,
 				A95F4B8116A197130024807A /* JKViewController.m */,
+				A95F4B9716A1B5520024807A /* JKImageViewController.h */,
+				A95F4B9816A1B5520024807A /* JKImageViewController.m */,
 				A95F4B6C16A197130024807A /* Supporting Files */,
+				A95F4B8816A1978C0024807A /* JKImageTransitionSegue.h */,
+				A95F4B8916A1978C0024807A /* JKImageTransitionSegue.m */,
 			);
 			path = ImageTransition;
 			sourceTree = "<group>";
 		A95F4B6C16A197130024807A /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
+				A95F4B8B16A198B10024807A /* BeachFull.jpg */,
+				A95F4B8C16A198B10024807A /* BeachThumb.jpg */,
+				A95F4B8D16A198B10024807A /* BeachThumb@2x.jpg */,
 				A95F4B6D16A197130024807A /* ImageTransition-Info.plist */,
 				A95F4B6E16A197130024807A /* InfoPlist.strings */,
 				A95F4B7116A197130024807A /* main.m */,
 				A95F4B7A16A197130024807A /* Default@2x.png in Resources */,
 				A95F4B7C16A197130024807A /* Default-568h@2x.png in Resources */,
 				A95F4B7F16A197130024807A /* MainStoryboard.storyboard in Resources */,
+				A95F4B8E16A198B10024807A /* BeachFull.jpg in Resources */,
+				A95F4B8F16A198B10024807A /* BeachThumb.jpg in Resources */,
+				A95F4B9016A198B10024807A /* BeachThumb@2x.jpg in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 				A95F4B7216A197130024807A /* main.m in Sources */,
 				A95F4B7616A197130024807A /* JKAppDelegate.m in Sources */,
 				A95F4B8216A197130024807A /* JKViewController.m in Sources */,
+				A95F4B8A16A1978C0024807A /* JKImageTransitionSegue.m in Sources */,
+				A95F4B9916A1B5520024807A /* JKImageViewController.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

ImageTransition/BeachFull.jpg

Added
New image

ImageTransition/BeachThumb.jpg

Added
New image

ImageTransition/BeachThumb@2x.jpg

Added
New image

ImageTransition/JKImageTransitionSegue.h

+//
+//  JKImageTransitionSegue.h
+//  ImageTransition
+//
+//  Created by Joris Kluivers on 1/12/13.
+//  Copyright (c) 2013 Joris Kluivers. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JKImageTransitionSegue : UIStoryboardSegue
+
+@property(assign) CGRect sourceRect;
+@property(assign) CGRect destinationRect;
+
+@property(strong) UIImage *transitionImage;
+
+@end

ImageTransition/JKImageTransitionSegue.m

+//
+//  JKImageTransitionSegue.m
+//  ImageTransition
+//
+//  Created by Joris Kluivers on 1/12/13.
+//  Copyright (c) 2013 Joris Kluivers. All rights reserved.
+//
+
+#import "JKImageTransitionSegue.h"
+
+@interface JKImageTransitionSegue ()
+@property(readonly) UIImageView *transitionImageView;
+@end
+
+@implementation JKImageTransitionSegue {
+	UIImageView *_transitionImageView;
+}
+
+- (id) initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination
+{
+	self = [super initWithIdentifier:identifier source:source destination:destination];
+	if (self) {
+		_destinationRect = CGRectZero;
+	}
+	return self;
+}
+
+- (UIImageView *) transitionImageView {
+	if (!_transitionImageView) {
+		_transitionImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
+	}
+	
+	return _transitionImageView;
+}
+
+- (void) perform {
+	UIWindow *mainWindow = [[UIApplication sharedApplication].windows objectAtIndex:0];
+	
+	CGRect sourceRectInWindow = [mainWindow convertRect:self.sourceRect fromView:((UIViewController *)self.sourceViewController).view];
+	
+	UIImageView *imageView = self.transitionImageView;
+	imageView.image = self.transitionImage;
+	imageView.frame = sourceRectInWindow;
+	
+	[mainWindow addSubview:imageView];
+	
+	CGRect dest = self.destinationRect;
+	if (CGRectEqualToRect(dest, CGRectZero)) {
+		
+		CGSize transitionSize = self.transitionImage.size;
+		CGRect screenBounds = [UIScreen mainScreen].bounds;
+		
+		CGFloat factor = fminf(
+			CGRectGetWidth(screenBounds) / self.transitionImage.size.width,
+			CGRectGetHeight(screenBounds) / self.transitionImage.size.height
+		);
+		
+		dest.size = CGSizeMake(transitionSize.width * factor, transitionSize.height * factor);
+		dest.origin = CGPointMake(
+			roundf((CGRectGetWidth(screenBounds) - CGRectGetWidth(dest)) / 2.0f),
+			roundf((CGRectGetHeight(screenBounds) - CGRectGetHeight(dest)) / 2.0f)
+		);
+	}
+	
+	[UIView animateWithDuration:0.4f delay:.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+		
+		imageView.frame = dest;
+		
+		((UIViewController *)self.destinationViewController).modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
+		[self.sourceViewController presentViewController:self.destinationViewController animated:YES completion:nil];
+	} completion:^(BOOL completed) {
+		imageView.hidden = YES;
+		[imageView removeFromSuperview];
+	}];
+	
+	
+}
+
+@end

ImageTransition/JKImageViewController.h

+//
+//  JKImageViewController.h
+//  ImageTransition
+//
+//  Created by Joris Kluivers on 1/12/13.
+//  Copyright (c) 2013 Joris Kluivers. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JKImageViewController : UIViewController <UIScrollViewDelegate>
+
+@property(strong) UIImage *image;
+
+@property(weak) IBOutlet UIScrollView *scrollView;
+@property(weak) IBOutlet UIImageView *imageView;
+
+@end

ImageTransition/JKImageViewController.m

+//
+//  JKImageViewController.m
+//  ImageTransition
+//
+//  Created by Joris Kluivers on 1/12/13.
+//  Copyright (c) 2013 Joris Kluivers. All rights reserved.
+//
+
+#import <QuartzCore/QuartzCore.h>
+
+#import "JKImageViewController.h"
+
+@interface JKImageViewController ()
+
+@end
+
+@implementation JKImageViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
+    }
+    return self;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+	
+	self.scrollView.contentSize = [UIScreen mainScreen].bounds.size;
+}
+
+- (void) viewWillAppear:(BOOL)animated
+{
+	self.imageView.hidden = YES;
+	self.imageView.image = self.image;
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+	self.imageView.hidden = NO;
+}
+
+#pragma mark - Scroll & Zoom
+
+- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView {
+	return self.imageView;
+}
+
+@end

ImageTransition/JKViewController.h

 
 @interface JKViewController : UIViewController
 
+@property(nonatomic, weak) IBOutlet UIButton *imageButton;
+
+- (IBAction) unwindFromSegue:(UIStoryboardSegue *)segue;
+
 @end

ImageTransition/JKViewController.m

 //  Copyright (c) 2013 Joris Kluivers. All rights reserved.
 //
 
+#import <QuartzCore/QuartzCore.h>
+
 #import "JKViewController.h"
+#import "JKImageViewController.h"
+#import "JKImageTransitionSegue.h"
 
 @interface JKViewController ()
 
 - (void)viewDidLoad
 {
     [super viewDidLoad];
-	// Do any additional setup after loading the view, typically from a nib.
+	
+	self.imageButton.layer.shadowColor = [UIColor blackColor].CGColor;
+	self.imageButton.layer.shadowOffset = CGSizeMake(0, 1);
+	self.imageButton.layer.shadowOpacity = 0.6f;
+	self.imageButton.layer.shadowRadius = 1.0f;
+}
+
+- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
+{
+	if (![segue isKindOfClass:[JKImageTransitionSegue class]]) {
+		return;
+	}
+	
+	JKImageViewController *imageController = (JKImageViewController *)segue.destinationViewController;
+	
+	// provide destination with full image
+	imageController.image = [UIImage imageNamed:@"BeachFull.jpg"];
+	
+	// configure segue
+	UIButton *imageButton = (UIButton *)sender;
+	JKImageTransitionSegue *imageSegue = (JKImageTransitionSegue *)segue;
+	
+	imageSegue.sourceRect = imageButton.frame;
+	imageSegue.transitionImage = imageButton.imageView.image;
+	
+	imageButton.hidden = YES;
+}
+
+- (IBAction) unwindFromSegue:(UIStoryboardSegue *)segue
+{
+	self.imageButton.hidden = NO;
 }
 
-- (void)didReceiveMemoryWarning
+- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
 {
-    [super didReceiveMemoryWarning];
-    // Dispose of any resources that can be recreated.
+	// TODO: return a custom segue to unwind using a custom transition
+	return [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
 }
 
 @end

ImageTransition/en.lproj/MainStoryboard.storyboard

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="2519" systemVersion="12A206j" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="2">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="2844" systemVersion="12C60" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="2">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1856"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1930"/>
     </dependencies>
     <scenes>
-        <!--class Prefix:identifier View Controller-->
+        <!--View Controller-->
         <scene sceneID="5">
             <objects>
                 <viewController id="2" customClass="JKViewController" sceneMemberID="viewController">
                     <view key="view" contentMode="scaleToFill" id="3">
-                        <rect key="frame" x="0.0" y="20" width="320" height="460"/>
+                        <rect key="frame" x="0.0" y="20" width="320" height="548"/>
                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                        <subviews>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bsC-CX-Mba">
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                                <state key="normal" image="BeachThumb.jpg">
+                                    <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <state key="highlighted">
+                                    <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <connections>
+                                    <segue destination="qlX-TB-qXw" kind="custom" customClass="JKImageTransitionSegue" id="d6x-kM-MvW"/>
+                                </connections>
+                            </button>
+                        </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                        <constraints>
+                            <constraint firstItem="bsC-CX-Mba" firstAttribute="top" secondItem="3" secondAttribute="top" constant="74" id="4Vn-32-BZv"/>
+                            <constraint firstItem="bsC-CX-Mba" firstAttribute="centerX" secondItem="3" secondAttribute="centerX" type="default" id="KMc-kJ-zXP"/>
+                        </constraints>
                     </view>
+                    <connections>
+                        <outlet property="imageButton" destination="bsC-CX-Mba" id="DZs-Yo-DAV"/>
+                    </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="4" sceneMemberID="firstResponder"/>
             </objects>
+            <point key="canvasLocation" x="-215" y="-33"/>
+        </scene>
+        <!--Image View Controller-->
+        <scene sceneID="a6G-mg-rld">
+            <objects>
+                <viewController wantsFullScreenLayout="YES" id="qlX-TB-qXw" customClass="JKImageViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Amj-XQ-9JQ">
+                        <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                        <subviews>
+                            <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" maximumZoomScale="2" translatesAutoresizingMaskIntoConstraints="NO" id="Rwk-xo-GEk">
+                                <subviews>
+                                    <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="NTE-Pk-wLb"/>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="NTE-Pk-wLb" firstAttribute="top" secondItem="Rwk-xo-GEk" secondAttribute="top" type="default" id="8MH-Uy-49P"/>
+                                    <constraint firstItem="NTE-Pk-wLb" firstAttribute="bottom" secondItem="Rwk-xo-GEk" secondAttribute="bottom" type="default" id="l62-ag-72v"/>
+                                    <constraint firstAttribute="centerX" secondItem="NTE-Pk-wLb" secondAttribute="centerX" type="user" id="mlp-H1-xjx"/>
+                                    <constraint firstItem="NTE-Pk-wLb" firstAttribute="trailing" secondItem="Rwk-xo-GEk" secondAttribute="trailing" type="default" id="pxX-Y3-IA1"/>
+                                    <constraint firstItem="NTE-Pk-wLb" firstAttribute="leading" secondItem="Rwk-xo-GEk" secondAttribute="leading" type="default" id="wQU-zm-3yl"/>
+                                    <constraint firstItem="NTE-Pk-wLb" firstAttribute="centerY" secondItem="Rwk-xo-GEk" secondAttribute="centerY" type="default" id="xoQ-DD-jWY"/>
+                                </constraints>
+                                <connections>
+                                    <outlet property="delegate" destination="qlX-TB-qXw" id="h09-YD-XSW"/>
+                                </connections>
+                            </scrollView>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uHe-BA-wNi">
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                                <state key="normal" title="Done">
+                                    <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <state key="highlighted">
+                                    <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <connections>
+                                    <segue destination="zyv-8Z-hCj" kind="unwind" unwindAction="unwindFromSegue:" id="Dx9-Gs-AHx"/>
+                                </connections>
+                            </button>
+                        </subviews>
+                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+                        <constraints>
+                            <constraint firstItem="Rwk-xo-GEk" firstAttribute="bottom" secondItem="Amj-XQ-9JQ" secondAttribute="bottom" type="default" id="KGR-1C-6WP"/>
+                            <constraint firstItem="uHe-BA-wNi" firstAttribute="top" secondItem="Amj-XQ-9JQ" secondAttribute="top" constant="40" id="Qii-SD-1WI"/>
+                            <constraint firstItem="Rwk-xo-GEk" firstAttribute="top" secondItem="Amj-XQ-9JQ" secondAttribute="top" type="default" id="RQP-ac-BZ1"/>
+                            <constraint firstItem="Rwk-xo-GEk" firstAttribute="leading" secondItem="Amj-XQ-9JQ" secondAttribute="leading" type="default" id="hxH-FX-hnk"/>
+                            <constraint firstItem="Rwk-xo-GEk" firstAttribute="trailing" secondItem="Amj-XQ-9JQ" secondAttribute="trailing" type="default" id="tJq-p9-Clh"/>
+                            <constraint firstAttribute="trailing" secondItem="uHe-BA-wNi" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="xZL-t7-VYO"/>
+                        </constraints>
+                    </view>
+                    <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+                    <nil key="simulatedTopBarMetrics"/>
+                    <connections>
+                        <outlet property="imageView" destination="NTE-Pk-wLb" id="hgw-0r-9cF"/>
+                        <outlet property="scrollView" destination="Rwk-xo-GEk" id="7Rh-FT-GU2"/>
+                        <outlet property="view" destination="Amj-XQ-9JQ" id="Ewj-Qi-jRv"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="trF-LE-Gsy" userLabel="First Responder" sceneMemberID="firstResponder"/>
+                <exit id="zyv-8Z-hCj" userLabel="Exit" sceneMemberID="exit"/>
+            </objects>
+            <point key="canvasLocation" x="279" y="-33"/>
         </scene>
     </scenes>
+    <resources>
+        <image name="BeachThumb.jpg" width="300" height="188"/>
+    </resources>
+    <classes>
+        <class className="JKImageViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/JKImageViewController.h"/>
+            <relationships>
+                <relationship kind="outlet" name="imageView" candidateClass="UIImageView"/>
+                <relationship kind="outlet" name="scrollView" candidateClass="UIScrollView"/>
+            </relationships>
+        </class>
+        <class className="JKViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/JKViewController.h"/>
+            <relationships>
+                <relationship kind="action" name="unwindFromSegue:" candidateClass="UIStoryboardSegue"/>
+                <relationship kind="outlet" name="imageButton" candidateClass="UIButton"/>
+            </relationships>
+        </class>
+        <class className="NSLayoutConstraint" superclassName="NSObject">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
+        </class>
+        <class className="UIStoryboardSegue" superclassName="NSObject">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/UIStoryboardSegue.h"/>
+        </class>
+    </classes>
     <simulatedMetricsContainer key="defaultSimulatedMetrics">
         <simulatedStatusBarMetrics key="statusBar"/>
         <simulatedOrientationMetrics key="orientation"/>