├── OpenFlowProject ├── Sample Images │ ├── Read me.txt │ ├── 0.jpg │ ├── 1.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 2.jpg │ ├── 20.jpg │ ├── 21.jpg │ ├── 22.jpg │ ├── 23.jpg │ ├── 24.jpg │ ├── 25.jpg │ ├── 26.jpg │ ├── 27.jpg │ ├── 28.jpg │ ├── 29.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.jpg ├── iPad Sample Images │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── OpenFlowProject_Prefix.pch ├── main.m ├── Classes │ ├── OpenFlowProjectAppDelegate.h │ ├── OpenFlowProjectViewController.h │ ├── OpenFlowProjectAppDelegate.m │ ├── AFGetImageOperation.h │ ├── OpenFlowProjectViewController.m │ └── AFGetImageOperation.m ├── OpenFlowProject-Info.plist ├── MainWindow.xib ├── OpenFlowProjectViewController.xib ├── Resources-iPad │ └── MainWindow-iPad.xib └── OpenFlowProject.xcodeproj │ └── project.pbxproj ├── .gitignore ├── OpenFlow ├── AFOpenFlowGeometry.h ├── SBNotifyingWindow.h ├── SBNotifyingWindow.m ├── AFUIImageReflection.h ├── AFOpenFlowConstants.h ├── AFOpenFlowGeometry.m ├── AFItemView.h ├── AFOpenFlowView.h ├── AFItemView.m ├── AFUIImageReflection.m └── AFOpenFlowView.m └── README /OpenFlowProject/Sample Images/Read me.txt: -------------------------------------------------------------------------------- 1 | All pictures in this folder have been released by NASA to the public domain. -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/0.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/1.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/10.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/11.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/12.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/13.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/14.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/15.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/16.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/17.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/18.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/19.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/2.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/20.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/21.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/22.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/23.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/24.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/25.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/26.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/27.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/28.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/29.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/3.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/4.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/5.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/6.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/7.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/8.jpg -------------------------------------------------------------------------------- /OpenFlowProject/Sample Images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/Sample Images/9.jpg -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/0.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/1.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/10.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/11.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/12.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/13.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/14.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/15.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/16.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/17.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/18.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/19.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/2.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/20.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/21.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/22.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/23.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/24.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/25.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/26.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/27.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/28.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/29.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/3.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/4.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/5.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/6.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/7.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/8.png -------------------------------------------------------------------------------- /OpenFlowProject/iPad Sample Images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmarimba/OpenFlow/HEAD/OpenFlowProject/iPad Sample Images/9.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .svn 3 | profile 4 | *~.nib 5 | *.swp 6 | 7 | build/ 8 | *.perspective 9 | *.perspectivev3 10 | *.pbxuser 11 | *.mode1v3 12 | *.mode2v3 13 | -------------------------------------------------------------------------------- /OpenFlowProject/OpenFlowProject_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'OpenFlowProject' target in the 'OpenFlowProject' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /OpenFlowProject/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // OpenFlowProject 4 | // 5 | // Created by jonathan on 1/6/10. 6 | // Copyright __MyCompanyName__ 2010. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | [pool release]; 16 | return retVal; 17 | } 18 | -------------------------------------------------------------------------------- /OpenFlow/AFOpenFlowGeometry.h: -------------------------------------------------------------------------------- 1 | // 2 | // AFOpenFlowGeometry.h 3 | // AFOpenFlowDemo 4 | // 5 | // Created by Jonathan Saggau on 10/22/10. 6 | // Copyright 2010 Sounds Broken inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AFOpenFlowGeometry : NSObject { 12 | 13 | } 14 | 15 | +(CGFloat)sideCoverAngle; 16 | 17 | +(CGFloat)sideCoverZPosition; 18 | 19 | +(CGFloat)coverSpacing; 20 | 21 | +(CGFloat)centerCoverOffset; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /OpenFlow/SBNotifyingWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SBNotifyingWindow.h 3 | // GdataI 4 | // 5 | // Created by Jonathan Saggau on 6/29/09. 6 | // Copyright 2009 Sounds Broken inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface SBNotifyingWindow : UIWindow { 13 | NSMutableSet *objects; 14 | } 15 | 16 | //allows an object to observe touch events in a given view 17 | -(void)addObjectInterestedInTouches:(id )anObject; 18 | -(void)removeObjectWithInterest:(id)anObject; 19 | 20 | @end 21 | 22 | @protocol SBNotifyingWindowTouches 23 | 24 | @optional 25 | 26 | -(void)interestingEvent:(UIEvent *)event; 27 | 28 | @end -------------------------------------------------------------------------------- /OpenFlowProject/Classes/OpenFlowProjectAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // OpenFlowProjectAppDelegate.h 3 | // OpenFlowProject 4 | // 5 | // Created by jonathan on 1/6/10. 6 | // Copyright __MyCompanyName__ 2010. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class OpenFlowProjectViewController; 12 | 13 | @interface OpenFlowProjectAppDelegate : NSObject { 14 | UIWindow *window; 15 | OpenFlowProjectViewController *viewController; 16 | } 17 | 18 | @property (nonatomic, retain) IBOutlet UIWindow *window; 19 | @property (nonatomic, retain) IBOutlet OpenFlowProjectViewController *viewController; 20 | 21 | @end 22 | 23 | -------------------------------------------------------------------------------- /OpenFlowProject/Classes/OpenFlowProjectViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // OpenFlowProjectViewController.h 3 | // OpenFlowProject 4 | // 5 | // Created by jonathan on 1/6/10. 6 | // Copyright __MyCompanyName__ 2010. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AFOpenFlowView.h" 11 | 12 | @interface OpenFlowProjectViewController : UIViewController { 13 | AFOpenFlowView *openFlowView; 14 | NSArray *coverImageData; 15 | NSDictionary *interestingPhotosDictionary; 16 | NSOperationQueue *loadImagesOperationQueue; 17 | } 18 | 19 | - (void)imageDidLoad:(NSArray *)arguments; 20 | 21 | @property(nonatomic, retain)IBOutlet AFOpenFlowView *openFlowView; 22 | 23 | @end 24 | 25 | -------------------------------------------------------------------------------- /OpenFlowProject/Classes/OpenFlowProjectAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // OpenFlowProjectAppDelegate.m 3 | // OpenFlowProject 4 | // 5 | // Created by jonathan on 1/6/10. 6 | // Copyright __MyCompanyName__ 2010. All rights reserved. 7 | // 8 | 9 | #import "OpenFlowProjectAppDelegate.h" 10 | #import "OpenFlowProjectViewController.h" 11 | 12 | @implementation OpenFlowProjectAppDelegate 13 | 14 | @synthesize window; 15 | @synthesize viewController; 16 | 17 | 18 | - (void)applicationDidFinishLaunching:(UIApplication *)application { 19 | 20 | // Override point for customization after app launch 21 | [window addSubview:viewController.view]; 22 | [window makeKeyAndVisible]; 23 | } 24 | 25 | 26 | - (void)dealloc { 27 | [viewController release]; 28 | [window release]; 29 | [super dealloc]; 30 | } 31 | 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /OpenFlowProject/OpenFlowProject-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.soundsbroken.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | NSMainNibFile~ipad 30 | MainWindow-iPad 31 | 32 | 33 | -------------------------------------------------------------------------------- /OpenFlow/SBNotifyingWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // SBNotifyingWindow.m 3 | // GdataI 4 | // 5 | // Created by Jonathan Saggau on 6/29/09. 6 | // Copyright 2009 Sounds Broken inc. All rights reserved. 7 | // 8 | 9 | #import "SBNotifyingWindow.h" 10 | 11 | @implementation SBNotifyingWindow 12 | 13 | 14 | - (id)initWithFrame:(CGRect)frame; 15 | { 16 | 17 | self = [super initWithFrame:frame]; 18 | if (self != nil) { 19 | [self setBackgroundColor:[UIColor whiteColor]]; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)sendEvent:(UIEvent *)event; 25 | { 26 | [super sendEvent:event]; 27 | 28 | for (id someObj in objects) { 29 | if ([someObj respondsToSelector:@selector(interestingEvent:)]) { 30 | [someObj performSelector:@selector(interestingEvent:) withObject:event]; 31 | } 32 | } 33 | } 34 | 35 | -(void)addObjectInterestedInTouches:(id )anObject 36 | { 37 | if(!objects) 38 | { 39 | objects = [[NSMutableSet alloc] initWithCapacity:1]; 40 | } 41 | [objects addObject:anObject]; 42 | } 43 | 44 | -(void)removeObjectWithInterest:(id)anObject; 45 | { 46 | [objects removeObject:anObject]; 47 | } 48 | 49 | - (void)dealloc { 50 | [objects removeAllObjects]; [objects release]; objects = nil; 51 | [super dealloc]; 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /OpenFlow/AFUIImageReflection.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import 26 | 27 | @interface UIImage (AFUIImageReflection) 28 | 29 | - (UIImage *)addImageReflection:(CGFloat)reflectionFraction; 30 | 31 | @end -------------------------------------------------------------------------------- /OpenFlowProject/Classes/AFGetImageOperation.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import 26 | #import "OpenFlowProjectViewController.h" 27 | 28 | @interface AFGetImageOperation : NSOperation { 29 | OpenFlowProjectViewController *mainViewController; 30 | int photoIndex; 31 | } 32 | 33 | - (id)initWithIndex:(int)imageIndex viewController:(OpenFlowProjectViewController *)viewController; 34 | 35 | @end -------------------------------------------------------------------------------- /OpenFlow/AFOpenFlowConstants.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | 26 | // For OpenFlow 27 | 28 | //#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 29 | #define COVER_SPACING 60 30 | #define CENTER_COVER_OFFSET 70 31 | #define SIDE_COVER_ZPOSITION -100 32 | //#else 33 | //#define COVER_SPACING 40 34 | //#define CENTER_COVER_OFFSET 70 35 | //#define SIDE_COVER_ZPOSITION -90 36 | //#endif 37 | 38 | #define SIDE_COVER_ANGLE .79 39 | -------------------------------------------------------------------------------- /OpenFlowProject/Classes/OpenFlowProjectViewController.m: -------------------------------------------------------------------------------- 1 | 2 | #import "OpenFlowProjectViewController.h" 3 | #import "AFGetImageOperation.h" 4 | 5 | 6 | @implementation OpenFlowProjectViewController 7 | 8 | @synthesize openFlowView; 9 | 10 | - (void)dealloc { 11 | [loadImagesOperationQueue release]; loadImagesOperationQueue = nil; 12 | [openFlowView release]; openFlowView = nil; 13 | [super dealloc]; 14 | } 15 | 16 | -(void)viewWillAppear:(BOOL)animated 17 | { 18 | if(!loadImagesOperationQueue) 19 | loadImagesOperationQueue = [[NSOperationQueue alloc] init]; 20 | self.openFlowView.viewDelegate = self; 21 | self.openFlowView.dataSource = self; 22 | [(AFOpenFlowView *)self.openFlowView setNumberOfImages:30]; 23 | } 24 | 25 | - (void)imageDidLoad:(NSArray *)arguments { 26 | UIImage *loadedImage = (UIImage *)[arguments objectAtIndex:0]; 27 | NSNumber *imageIndex = (NSNumber *)[arguments objectAtIndex:1]; 28 | [(AFOpenFlowView *)self.openFlowView setImage:loadedImage forIndex:[imageIndex intValue]]; 29 | } 30 | 31 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 32 | return YES; 33 | } 34 | 35 | - (UIImage *)defaultImage { 36 | return [UIImage imageNamed:@"default.png"]; 37 | } 38 | 39 | - (void)openFlowView:(AFOpenFlowView *)openFlowView requestImageForIndex:(int)index { 40 | AFGetImageOperation *getImageOperation = [[AFGetImageOperation alloc] initWithIndex:index viewController:self]; 41 | [loadImagesOperationQueue addOperation:getImageOperation]; 42 | [getImageOperation release]; 43 | } 44 | 45 | - (void)openFlowView:(AFOpenFlowView *)openFlowView selectionDidChange:(int)index { 46 | NSLog(@"Cover Flow selection did change to %d", index); 47 | } 48 | 49 | @end -------------------------------------------------------------------------------- /OpenFlow/AFOpenFlowGeometry.m: -------------------------------------------------------------------------------- 1 | // 2 | // AFOpenFlowGeometry.m 3 | // AFOpenFlowDemo 4 | // 5 | // Created by Jonathan Saggau on 10/22/10. 6 | // Copyright 2010 Sounds Broken inc. All rights reserved. 7 | // 8 | 9 | #import "AFOpenFlowGeometry.h" 10 | 11 | 12 | @implementation AFOpenFlowGeometry 13 | 14 | 15 | +(CGFloat)sideCoverAngle 16 | { 17 | static CGFloat sideCoverAngle; 18 | if (!sideCoverAngle) { 19 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 20 | { 21 | sideCoverAngle = 0.79f; 22 | } 23 | else 24 | { 25 | sideCoverAngle = 0.79f; 26 | } 27 | } 28 | return sideCoverAngle; 29 | } 30 | 31 | 32 | +(CGFloat)sideCoverZPosition 33 | { 34 | static CGFloat sideCoverZPosition; 35 | if (!sideCoverZPosition) { 36 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 37 | { 38 | sideCoverZPosition = -100.0f; 39 | } 40 | else 41 | { 42 | sideCoverZPosition = -90.0f; 43 | } 44 | } 45 | return sideCoverZPosition; 46 | } 47 | 48 | +(CGFloat)coverSpacing 49 | { 50 | static CGFloat coverSpacing; 51 | if (!coverSpacing) { 52 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 53 | { 54 | coverSpacing = 60.0f; 55 | } 56 | else 57 | { 58 | coverSpacing = 40.0f; 59 | } 60 | } 61 | return coverSpacing; 62 | } 63 | 64 | +(CGFloat)centerCoverOffset 65 | { 66 | static CGFloat centerCoverOffset; 67 | if (!centerCoverOffset) { 68 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 69 | { 70 | centerCoverOffset = 70.0f; 71 | } 72 | else 73 | { 74 | centerCoverOffset = 70.0f; 75 | } 76 | } 77 | return centerCoverOffset; 78 | } 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /OpenFlow/AFItemView.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import 26 | 27 | 28 | @interface AFItemView : UIView { 29 | UIImageView *imageView; 30 | int number; 31 | CGFloat horizontalPosition; 32 | CGFloat verticalPosition; 33 | CGFloat originalImageHeight; 34 | } 35 | 36 | @property (nonatomic, assign) int number; 37 | @property (nonatomic, readonly) CGFloat horizontalPosition; 38 | @property (nonatomic, readonly) CGFloat verticalPosition; 39 | @property (nonatomic, readonly) UIImageView *imageView; 40 | 41 | - (void)setImage:(UIImage *)newImage originalImageHeight:(CGFloat)imageHeight reflectionFraction:(CGFloat)reflectionFraction; 42 | - (CGSize)calculateNewSize:(CGSize)originalImageSize boundingBox:(CGSize)boundingBox; 43 | 44 | @end -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Follow the project's status at http://apparentlogic.com/openflow and on Twitter at @openflow 2 | 3 | 4 | When I released my first iPhone app, Presenter, two months ago, Apple accused me of using their private iPhone CoverFlow API. After appealing to Apple & writing a blog post about my roadblock, Apple reversed their decision. 5 | 6 | The initial release is simple, but it is also efficient and very fast, even on first generation iPhones. 7 | 8 | The API should be easy to include in your own program. The main class, AFOpenFlowView, is a subclass of UIView. 9 | To use this in your own project: 10 | -Add the OpenFlow source code to your project. 11 | -Add the QuartzCore and CoreGraphics frameworks. 12 | -Import “AFOpenFlowView.h” & interact with it as you would a normal UIView. 13 | -You should implement both the AFOpenFlowViewDelegate and AFOpenFlowViewDataSource protocols. 14 | 15 | Currently, the delegate protocol is used to let your code know when the user selected a new object. The datasource protocol is called when AFOpenFlowView needs a UIImage object. This method should be *fast*. Don’t do NSURL requests or even disk access in this method. See the AFOpenFlowDemo app I provided for an example how to load images from a remote server. The datasource also needs to provide a default UIImage. 16 | 17 | At any point, you can set UIImage’s on your AFOpenFlowView. You don’t need to wait for the datasource protocol to ask you. Your AFOpenFlowView will start displaying images as soon as you call setNumberOfImages. 18 | 19 | This is an initial release of OpenFlow. I licensed it under the liberal MIT open source license. 20 | Please drop me a line to let me know what you think & where you want the project to go from here. 21 | 22 | The source code for both OpenFlow and the AFOpenFlowDemo project are currently available on Github at http://github.com/thefaj/OpenFlow. For the demo application, you will need to register for a Flickr API key and secret. If you try to compile the demo, you will quickly find the error message where your Key & Secret should be added. 23 | 24 | Enjoy! 25 | -Alex -------------------------------------------------------------------------------- /OpenFlowProject/Classes/AFGetImageOperation.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import "AFGetImageOperation.h" 26 | 27 | 28 | @implementation AFGetImageOperation 29 | 30 | - (id)initWithIndex:(int)imageIndex viewController:(OpenFlowProjectViewController *)viewController { 31 | if (self = [super init]) { 32 | photoIndex = imageIndex; 33 | mainViewController = [viewController retain]; 34 | } 35 | return self; 36 | } 37 | 38 | - (void)dealloc { 39 | [mainViewController release]; 40 | 41 | [super dealloc]; 42 | } 43 | 44 | - (void)main { 45 | NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 46 | // Load an image named photoIndex.jpg from our Resources. 47 | NSString *imageName = [[NSString alloc] initWithFormat:@"%d.jpg", photoIndex]; 48 | 49 | if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 50 | { 51 | imageName = [[NSString alloc] initWithFormat:@"%d.png", photoIndex]; 52 | 53 | } 54 | UIImage *theImage = [UIImage imageNamed:imageName]; 55 | if (theImage) { 56 | [mainViewController performSelectorOnMainThread:@selector(imageDidLoad:) 57 | withObject:[NSArray arrayWithObjects:theImage, [NSNumber numberWithInt:photoIndex], nil] 58 | waitUntilDone:YES]; 59 | } else 60 | NSLog(@"Unable to find sample image: %@", imageName); 61 | [imageName release]; 62 | 63 | [pool release]; 64 | } 65 | 66 | @end -------------------------------------------------------------------------------- /OpenFlow/AFOpenFlowView.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import 26 | #import 27 | 28 | #import "AFItemView.h" 29 | 30 | @protocol AFOpenFlowViewDataSource; 31 | @protocol AFOpenFlowViewDelegate; 32 | 33 | @interface AFOpenFlowView : UIScrollView { 34 | id dataSource; 35 | id viewDelegate; 36 | 37 | NSMutableSet *offscreenCovers; 38 | NSMutableDictionary *onscreenCovers; 39 | NSMutableDictionary *coverImages; 40 | NSMutableDictionary *coverImageHeights; 41 | UIImage *defaultImage; 42 | CGFloat defaultImageHeight; 43 | 44 | int lowerVisibleCover; 45 | int upperVisibleCover; 46 | int numberOfImages; 47 | int beginningCover; 48 | 49 | AFItemView *selectedCoverView; 50 | 51 | CATransform3D leftTransform, rightTransform, middleTransform; 52 | 53 | CGFloat halfScreenHeight; 54 | CGFloat halfScreenWidth; 55 | 56 | Boolean isSingleTap; 57 | Boolean isDoubleTap; 58 | Boolean isDraggingACover; 59 | CGFloat startPosition; 60 | } 61 | 62 | @property (nonatomic, assign) IBOutlet id dataSource; 63 | @property (nonatomic, assign) IBOutlet id viewDelegate; 64 | @property (nonatomic, retain) UIImage *defaultImage; 65 | @property (nonatomic, assign) int numberOfImages; 66 | 67 | - (void)setSelectedCover:(int)newSelectedCover; 68 | - (void)centerOnSelectedCover:(BOOL)animated; 69 | - (void)setImage:(UIImage *)image forIndex:(int)index; 70 | 71 | @end 72 | 73 | @protocol AFOpenFlowViewDelegate 74 | @optional 75 | - (void)openFlowView:(AFOpenFlowView *)openFlowView selectionDidChange:(int)index; 76 | @end 77 | 78 | @protocol AFOpenFlowViewDataSource 79 | - (void)openFlowView:(AFOpenFlowView *)openFlowView requestImageForIndex:(int)index; 80 | - (UIImage *)defaultImage; 81 | @end -------------------------------------------------------------------------------- /OpenFlow/AFItemView.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import "AFItemView.h" 26 | #import "AFOpenFlowGeometry.h" 27 | #import 28 | 29 | @implementation AFItemView 30 | @synthesize number, imageView, horizontalPosition, verticalPosition; 31 | 32 | - (id)initWithFrame:(CGRect)frame { 33 | if (self = [super initWithFrame:frame]) { 34 | self.opaque = YES; 35 | self.backgroundColor = nil; 36 | verticalPosition = 0; 37 | horizontalPosition = 0; 38 | 39 | // Image View 40 | imageView = [[UIImageView alloc] initWithFrame:frame]; 41 | imageView.opaque = YES; 42 | [self addSubview:imageView]; 43 | } 44 | 45 | return self; 46 | } 47 | 48 | - (void)setImage:(UIImage *)newImage originalImageHeight:(CGFloat)imageHeight reflectionFraction:(CGFloat)reflectionFraction { 49 | [imageView setImage:newImage]; 50 | verticalPosition = imageHeight * reflectionFraction / 2; 51 | originalImageHeight = imageHeight; 52 | self.frame = CGRectMake(0, 0, newImage.size.width, newImage.size.height); 53 | } 54 | 55 | - (void)setNumber:(int)newNumber { 56 | horizontalPosition = [AFOpenFlowGeometry coverSpacing] * newNumber; 57 | number = newNumber; 58 | } 59 | 60 | - (CGSize)calculateNewSize:(CGSize)baseImageSize boundingBox:(CGSize)boundingBox { 61 | CGFloat boundingRatio = boundingBox.width / boundingBox.height; 62 | CGFloat originalImageRatio = baseImageSize.width / baseImageSize.height; 63 | 64 | CGFloat newWidth; 65 | CGFloat newHeight; 66 | if (originalImageRatio > boundingRatio) { 67 | newWidth = boundingBox.width; 68 | newHeight = boundingBox.width * baseImageSize.height / baseImageSize.width; 69 | } else { 70 | newHeight = boundingBox.height; 71 | newWidth = boundingBox.height * baseImageSize.width / baseImageSize.height; 72 | } 73 | 74 | return CGSizeMake(newWidth, newHeight); 75 | } 76 | 77 | - (void)setFrame:(CGRect)newFrame { 78 | [super setFrame:newFrame]; 79 | [imageView setFrame:newFrame]; 80 | } 81 | 82 | - (void)dealloc { 83 | [imageView release]; 84 | 85 | [super dealloc]; 86 | } 87 | 88 | @end -------------------------------------------------------------------------------- /OpenFlow/AFUIImageReflection.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import "AFUIImageReflection.h" 26 | 27 | 28 | @implementation UIImage (AFUIImageReflection) 29 | 30 | - (UIImage *)addImageReflection:(CGFloat)reflectionFraction { 31 | int reflectionHeight = self.size.height * reflectionFraction; 32 | 33 | // create a 2 bit CGImage containing a gradient that will be used for masking the 34 | // main view content to create the 'fade' of the reflection. The CGImageCreateWithMask 35 | // function will stretch the bitmap image as required, so we can create a 1 pixel wide gradient 36 | CGImageRef gradientMaskImage = NULL; 37 | 38 | // gradient is always black-white and the mask must be in the gray colorspace 39 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 40 | 41 | // create the bitmap context 42 | CGContextRef gradientBitmapContext = CGBitmapContextCreate(nil, 1, reflectionHeight, 43 | 8, 0, colorSpace, kCGImageAlphaNone); 44 | 45 | // define the start and end grayscale values (with the alpha, even though 46 | // our bitmap context doesn't support alpha the gradient requires it) 47 | CGFloat colors[] = {0.0, 1.0, 1.0, 1.0}; 48 | 49 | // create the CGGradient and then release the gray color space 50 | CGGradientRef grayScaleGradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2); 51 | CGColorSpaceRelease(colorSpace); 52 | 53 | // create the start and end points for the gradient vector (straight down) 54 | CGPoint gradientStartPoint = CGPointMake(0, reflectionHeight); 55 | CGPoint gradientEndPoint = CGPointZero; 56 | 57 | // draw the gradient into the gray bitmap context 58 | CGContextDrawLinearGradient(gradientBitmapContext, grayScaleGradient, gradientStartPoint, 59 | gradientEndPoint, kCGGradientDrawsAfterEndLocation); 60 | CGGradientRelease(grayScaleGradient); 61 | 62 | // add a black fill with 60% opacity 63 | CGContextSetGrayFillColor(gradientBitmapContext, 0.0, 0.60); 64 | CGContextFillRect(gradientBitmapContext, CGRectMake(0, 0, 1, reflectionHeight)); 65 | 66 | // convert the context into a CGImageRef and release the context 67 | gradientMaskImage = CGBitmapContextCreateImage(gradientBitmapContext); 68 | CGContextRelease(gradientBitmapContext); 69 | 70 | // create an image by masking the bitmap of the mainView content with the gradient view 71 | // then release the pre-masked content bitmap and the gradient bitmap 72 | CGImageRef reflectionImage = CGImageCreateWithMask(self.CGImage, gradientMaskImage); 73 | CGImageRelease(gradientMaskImage); 74 | 75 | CGSize size = CGSizeMake(self.size.width, self.size.height + reflectionHeight); 76 | 77 | UIGraphicsBeginImageContext(size); 78 | 79 | [self drawAtPoint:CGPointZero]; 80 | CGContextRef context = UIGraphicsGetCurrentContext(); 81 | CGRect imgRect = CGRectMake(0, self.size.height, self.size.width, reflectionHeight); 82 | 83 | //black background to occlude covers behind this one 84 | CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 85 | CGContextFillRect(context, imgRect); 86 | CGContextDrawImage(context, imgRect, reflectionImage); 87 | 88 | UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); 89 | UIGraphicsEndImageContext(); 90 | CGImageRelease(reflectionImage); 91 | 92 | return result; 93 | } 94 | 95 | @end -------------------------------------------------------------------------------- /OpenFlowProject/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 784 5 | 10A394 6 | 732 7 | 1027.1 8 | 430.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 60 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | 35 | 36 | IBFirstResponder 37 | 38 | 39 | 40 | OpenFlowProjectViewController 41 | 42 | 43 | 44 | 45 | 292 46 | {320, 480} 47 | 48 | 1 49 | MSAxIDEAA 50 | 51 | NO 52 | NO 53 | 54 | 55 | 56 | 57 | 58 | YES 59 | 60 | 61 | delegate 62 | 63 | 64 | 65 | 4 66 | 67 | 68 | 69 | viewController 70 | 71 | 72 | 73 | 11 74 | 75 | 76 | 77 | window 78 | 79 | 80 | 81 | 14 82 | 83 | 84 | 85 | 86 | YES 87 | 88 | 0 89 | 90 | 91 | 92 | 93 | 94 | -1 95 | 96 | 97 | File's Owner 98 | 99 | 100 | 3 101 | 102 | 103 | OpenFlowProject App Delegate 104 | 105 | 106 | -2 107 | 108 | 109 | 110 | 111 | 10 112 | 113 | 114 | 115 | 116 | 12 117 | 118 | 119 | 120 | 121 | 122 | 123 | YES 124 | 125 | YES 126 | -1.CustomClassName 127 | -2.CustomClassName 128 | 10.CustomClassName 129 | 10.IBEditorWindowLastContentRect 130 | 10.IBPluginDependency 131 | 12.IBEditorWindowLastContentRect 132 | 12.IBPluginDependency 133 | 3.CustomClassName 134 | 3.IBPluginDependency 135 | 136 | 137 | YES 138 | UIApplication 139 | UIResponder 140 | OpenFlowProjectViewController 141 | {{512, 351}, {320, 480}} 142 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 143 | {{525, 346}, {320, 480}} 144 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 145 | OpenFlowProjectAppDelegate 146 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 147 | 148 | 149 | 150 | YES 151 | 152 | 153 | YES 154 | 155 | 156 | 157 | 158 | YES 159 | 160 | 161 | YES 162 | 163 | 164 | 165 | 14 166 | 167 | 168 | 169 | YES 170 | 171 | OpenFlowProjectAppDelegate 172 | NSObject 173 | 174 | YES 175 | 176 | YES 177 | viewController 178 | window 179 | 180 | 181 | YES 182 | OpenFlowProjectViewController 183 | UIWindow 184 | 185 | 186 | 187 | IBProjectSource 188 | Classes/OpenFlowProjectAppDelegate.h 189 | 190 | 191 | 192 | OpenFlowProjectAppDelegate 193 | NSObject 194 | 195 | IBUserSource 196 | 197 | 198 | 199 | 200 | OpenFlowProjectViewController 201 | UIViewController 202 | 203 | IBProjectSource 204 | Classes/OpenFlowProjectViewController.h 205 | 206 | 207 | 208 | 209 | 0 210 | 211 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 212 | 213 | 214 | YES 215 | OpenFlowProject.xcodeproj 216 | 3 217 | 3.1 218 | 219 | 220 | -------------------------------------------------------------------------------- /OpenFlowProject/OpenFlowProjectViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 784 5 | 9L30 6 | 680 7 | 949.54 8 | 353.00 9 | 10 | YES 11 | 12 | 13 | 14 | YES 15 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 16 | 17 | 18 | YES 19 | 20 | YES 21 | 22 | 23 | YES 24 | 25 | 26 | 27 | YES 28 | 29 | IBFilesOwner 30 | 31 | 32 | IBFirstResponder 33 | 34 | 35 | 36 | 274 37 | 38 | YES 39 | 40 | 41 | 274 42 | {320, 460} 43 | 44 | YES 45 | YES 46 | YES 47 | YES 48 | NO 49 | 50 | 51 | {320, 460} 52 | 53 | 54 | 3 55 | MC43NQA 56 | 57 | 2 58 | 59 | 60 | NO 61 | 62 | 63 | 64 | 65 | 66 | YES 67 | 68 | 69 | view 70 | 71 | 72 | 73 | 10 74 | 75 | 76 | 77 | openFlowView 78 | 79 | 80 | 81 | 11 82 | 83 | 84 | 85 | dataSource 86 | 87 | 88 | 89 | 12 90 | 91 | 92 | 93 | viewDelegate 94 | 95 | 96 | 97 | 13 98 | 99 | 100 | 101 | 102 | YES 103 | 104 | 0 105 | 106 | YES 107 | 108 | 109 | 110 | 111 | 112 | -1 113 | 114 | 115 | RmlsZSdzIE93bmVyA 116 | 117 | 118 | -2 119 | 120 | 121 | 122 | 123 | 6 124 | 125 | 126 | YES 127 | 128 | 129 | 130 | 131 | 132 | 8 133 | 134 | 135 | 136 | 137 | 138 | 139 | YES 140 | 141 | YES 142 | -1.CustomClassName 143 | -2.CustomClassName 144 | 6.IBEditorWindowLastContentRect 145 | 6.IBPluginDependency 146 | 8.CustomClassName 147 | 8.IBPluginDependency 148 | 149 | 150 | YES 151 | OpenFlowProjectViewController 152 | UIResponder 153 | {{557, 580}, {320, 480}} 154 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 155 | AFOpenFlowView 156 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 157 | 158 | 159 | 160 | YES 161 | 162 | YES 163 | 164 | 165 | YES 166 | 167 | 168 | 169 | 170 | YES 171 | 172 | YES 173 | 174 | 175 | YES 176 | 177 | 178 | 179 | 13 180 | 181 | 182 | 183 | YES 184 | 185 | AFOpenFlowView 186 | UIScrollView 187 | 188 | YES 189 | 190 | YES 191 | dataSource 192 | viewDelegate 193 | 194 | 195 | YES 196 | id 197 | id 198 | 199 | 200 | 201 | IBProjectSource 202 | ../OpenFlow/AFOpenFlowView.h 203 | 204 | 205 | 206 | OpenFlowProjectViewController 207 | UIViewController 208 | 209 | infoButtonPressed: 210 | id 211 | 212 | 213 | openFlowView 214 | AFOpenFlowView 215 | 216 | 217 | IBProjectSource 218 | Classes/OpenFlowProjectViewController.h 219 | 220 | 221 | 222 | 223 | 0 224 | OpenFlowProject.xcodeproj 225 | 3 226 | 3.1 227 | 228 | 229 | -------------------------------------------------------------------------------- /OpenFlowProject/Resources-iPad/MainWindow-iPad.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1056 5 | 10J567 6 | 851 7 | 1038.35 8 | 462.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 141 12 | 13 | 14 | YES 15 | 16 | 17 | YES 18 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 19 | 20 | 21 | YES 22 | 23 | YES 24 | 25 | 26 | YES 27 | 28 | 29 | 30 | YES 31 | 32 | IBFilesOwner 33 | IBIPadFramework 34 | 35 | 36 | IBFirstResponder 37 | IBIPadFramework 38 | 39 | 40 | IBIPadFramework 41 | 42 | 43 | OpenFlowProjectViewController 44 | 45 | 2 46 | 47 | 48 | 1 49 | 50 | IBIPadFramework 51 | NO 52 | 53 | 54 | 55 | 292 56 | {768, 1004} 57 | 58 | 1 59 | MSAxIDEAA 60 | 61 | NO 62 | NO 63 | 64 | IBIPadFramework 65 | YES 66 | 67 | 68 | 69 | 70 | YES 71 | 72 | 73 | delegate 74 | 75 | 76 | 77 | 4 78 | 79 | 80 | 81 | viewController 82 | 83 | 84 | 85 | 11 86 | 87 | 88 | 89 | window 90 | 91 | 92 | 93 | 14 94 | 95 | 96 | 97 | 98 | YES 99 | 100 | 0 101 | 102 | 103 | 104 | 105 | 106 | -1 107 | 108 | 109 | File's Owner 110 | 111 | 112 | 3 113 | 114 | 115 | OpenFlowProject App Delegate 116 | 117 | 118 | -2 119 | 120 | 121 | 122 | 123 | 10 124 | 125 | 126 | 127 | 128 | 12 129 | 130 | 131 | 132 | 133 | 134 | 135 | YES 136 | 137 | YES 138 | -1.CustomClassName 139 | -2.CustomClassName 140 | 10.CustomClassName 141 | 10.IBEditorWindowLastContentRect 142 | 10.IBLastUsedUIStatusBarStylesToTargetRuntimesMap 143 | 10.IBPluginDependency 144 | 12.IBEditorWindowLastContentRect 145 | 12.IBLastUsedUIStatusBarStylesToTargetRuntimesMap 146 | 12.IBPluginDependency 147 | 3.CustomClassName 148 | 3.IBPluginDependency 149 | 150 | 151 | YES 152 | UIApplication 153 | UIResponder 154 | OpenFlowProjectViewController 155 | {{512, 351}, {320, 480}} 156 | 157 | IBCocoaTouchFramework 158 | 159 | 160 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 161 | {{525, 346}, {320, 480}} 162 | 163 | IBCocoaTouchFramework 164 | 165 | 166 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 167 | OpenFlowProjectAppDelegate 168 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 169 | 170 | 171 | 172 | YES 173 | 174 | 175 | YES 176 | 177 | 178 | 179 | 180 | YES 181 | 182 | 183 | YES 184 | 185 | 186 | 187 | 14 188 | 189 | 190 | 191 | YES 192 | 193 | OpenFlowProjectAppDelegate 194 | NSObject 195 | 196 | YES 197 | 198 | YES 199 | viewController 200 | window 201 | 202 | 203 | YES 204 | OpenFlowProjectViewController 205 | UIWindow 206 | 207 | 208 | 209 | YES 210 | 211 | YES 212 | viewController 213 | window 214 | 215 | 216 | YES 217 | 218 | viewController 219 | OpenFlowProjectViewController 220 | 221 | 222 | window 223 | UIWindow 224 | 225 | 226 | 227 | 228 | IBProjectSource 229 | Classes/OpenFlowProjectAppDelegate.h 230 | 231 | 232 | 233 | OpenFlowProjectAppDelegate 234 | NSObject 235 | 236 | IBUserSource 237 | 238 | 239 | 240 | 241 | OpenFlowProjectViewController 242 | UIViewController 243 | 244 | IBProjectSource 245 | Classes/OpenFlowProjectViewController.h 246 | 247 | 248 | 249 | 250 | 0 251 | IBIPadFramework 252 | 253 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 254 | 255 | 256 | 257 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 258 | 259 | 260 | YES 261 | OpenFlowProject.xcodeproj 262 | 3 263 | 141 264 | 265 | 266 | -------------------------------------------------------------------------------- /OpenFlow/AFOpenFlowView.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Alex Fajkowski, Apparent Logic LLC 3 | * 4 | * Permission is hereby granted, free of charge, to any person 5 | * obtaining a copy of this software and associated documentation 6 | * files (the "Software"), to deal in the Software without 7 | * restriction, including without limitation the rights to use, 8 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the 10 | * Software is furnished to do so, subject to the following 11 | * conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | * OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | #import "AFOpenFlowView.h" 26 | #import "AFUIImageReflection.h" 27 | #import "AFOpenFlowGeometry.h" 28 | 29 | @interface AFOpenFlowView (hidden) 30 | 31 | - (void)setUpInitialState; 32 | - (AFItemView *)coverForIndex:(int)coverIndex; 33 | - (void)updateCoverImage:(AFItemView *)aCover; 34 | - (AFItemView *)dequeueReusableCover; 35 | - (void)layoutCovers:(int)selected fromCover:(int)lowerBound toCover:(int)upperBound; 36 | - (void)layoutCover:(AFItemView *)aCover selectedCover:(int)selectedIndex animated:(Boolean)animated; 37 | - (AFItemView *)findCoverOnscreen:(CALayer *)targetLayer; 38 | 39 | @end 40 | 41 | @implementation AFOpenFlowView (hidden) 42 | 43 | const static CGFloat kReflectionFraction = 0.85; 44 | 45 | - (void)setUpInitialState { 46 | 47 | [self setBackgroundColor:[UIColor blackColor]]; 48 | // Set up the default image for the coverflow. 49 | self.defaultImage = [self.dataSource defaultImage]; 50 | 51 | // Create data holders for onscreen & offscreen covers & UIImage objects. 52 | coverImages = [[NSMutableDictionary alloc] init]; 53 | coverImageHeights = [[NSMutableDictionary alloc] init]; 54 | offscreenCovers = [[NSMutableSet alloc] init]; 55 | onscreenCovers = [[NSMutableDictionary alloc] init]; 56 | 57 | // Initialize the visible and selected cover range. 58 | lowerVisibleCover = upperVisibleCover = -1; 59 | selectedCoverView = nil; 60 | 61 | // Set up the cover's left & right transforms. 62 | leftTransform = CATransform3DIdentity; 63 | CGFloat sideCoverAngle = [AFOpenFlowGeometry sideCoverAngle]; 64 | leftTransform = CATransform3DRotate(leftTransform, sideCoverAngle, 0.0f, 1.0f, 0.0f); 65 | rightTransform = CATransform3DIdentity; 66 | rightTransform = CATransform3DRotate(rightTransform, sideCoverAngle, 0.0f, -1.0f, 0.0f); 67 | middleTransform = CATransform3DMakeTranslation(0.0, 0.0, 80.0); 68 | self.scrollEnabled = YES; 69 | self.userInteractionEnabled = YES; 70 | self.showsVerticalScrollIndicator = NO; 71 | self.showsHorizontalScrollIndicator = NO; 72 | 73 | // UIScrollViewDecelerationRateNormal = 0.998 74 | // UIScrollViewDecelerationRateFast = 0.990 75 | self.decelerationRate = .992; 76 | [super setDelegate:self]; 77 | 78 | // Set some perspective 79 | CATransform3D sublayerTransform = CATransform3DIdentity; 80 | sublayerTransform.m34 = -0.01; 81 | [self.layer setSublayerTransform:sublayerTransform]; 82 | } 83 | 84 | - (AFItemView *)coverForIndex:(int)coverIndex { 85 | AFItemView *coverView = [self dequeueReusableCover]; 86 | if (!coverView) 87 | { 88 | coverView = [[[AFItemView alloc] initWithFrame:CGRectZero] autorelease]; 89 | UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)]; 90 | [coverView addGestureRecognizer:tapGesture]; 91 | // [tapGesture setDelegate:self]; 92 | [tapGesture release]; 93 | 94 | UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDoubleTapped:)]; 95 | [doubleTapGesture setNumberOfTapsRequired:2]; 96 | [coverView addGestureRecognizer:doubleTapGesture]; 97 | // [tapGesture setDelegate:self]; 98 | [doubleTapGesture release]; 99 | 100 | } 101 | 102 | coverView.number = coverIndex; 103 | 104 | return coverView; 105 | } 106 | 107 | - (void)updateCoverImage:(AFItemView *)aCover { 108 | NSNumber *coverNumber = [NSNumber numberWithInt:aCover.number]; 109 | UIImage *coverImage = (UIImage *)[coverImages objectForKey:coverNumber]; 110 | if (coverImage) { 111 | NSNumber *coverImageHeightNumber = (NSNumber *)[coverImageHeights objectForKey:coverNumber]; 112 | if (coverImageHeightNumber) 113 | [aCover setImage:coverImage originalImageHeight:[coverImageHeightNumber floatValue] reflectionFraction:kReflectionFraction]; 114 | } else { 115 | [aCover setImage:defaultImage originalImageHeight:defaultImageHeight reflectionFraction:kReflectionFraction]; 116 | [self.dataSource openFlowView:self requestImageForIndex:aCover.number]; 117 | } 118 | } 119 | 120 | - (AFItemView *)dequeueReusableCover { 121 | AFItemView *aCover = [offscreenCovers anyObject]; 122 | if (aCover) { 123 | [[aCover retain] autorelease]; 124 | [offscreenCovers removeObject:aCover]; 125 | } 126 | return aCover; 127 | } 128 | 129 | - (void)layoutCover:(AFItemView *)aCover selectedCover:(int)selectedIndex animated:(Boolean)animated { 130 | int coverNumber = aCover.number; 131 | CATransform3D newTransform; 132 | CGFloat newZPosition = [AFOpenFlowGeometry sideCoverZPosition]; 133 | CGPoint newPosition; 134 | 135 | newPosition.x = halfScreenWidth + aCover.horizontalPosition; 136 | newPosition.y = halfScreenHeight + aCover.verticalPosition; 137 | if (coverNumber < selectedIndex) { 138 | newPosition.x -= [AFOpenFlowGeometry centerCoverOffset]; 139 | newTransform = leftTransform; 140 | } else if (coverNumber > selectedIndex) { 141 | newPosition.x += [AFOpenFlowGeometry centerCoverOffset]; 142 | newTransform = rightTransform; 143 | } else { 144 | newTransform = middleTransform; 145 | } 146 | 147 | if (animated) { 148 | [UIView beginAnimations:nil context:nil]; 149 | [UIView setAnimationDuration:0.3]; 150 | [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 151 | [UIView setAnimationBeginsFromCurrentState:YES]; 152 | } 153 | 154 | aCover.layer.transform = newTransform; 155 | aCover.layer.zPosition = newZPosition; 156 | aCover.layer.position = newPosition; 157 | 158 | if (animated) { 159 | [UIView commitAnimations]; 160 | } 161 | } 162 | 163 | - (void)layoutCovers:(int)selected fromCover:(int)lowerBound toCover:(int)upperBound { 164 | // NSLog(@"[%@ %s]", self, _cmd); 165 | AFItemView *cover; 166 | NSNumber *coverNumber; 167 | for (int i = lowerBound; i <= upperBound; i++) { 168 | coverNumber = [[NSNumber alloc] initWithInt:i]; 169 | cover = (AFItemView *)[onscreenCovers objectForKey:coverNumber]; 170 | [coverNumber release]; 171 | [self layoutCover:cover selectedCover:selected animated:YES]; 172 | } 173 | } 174 | 175 | - (AFItemView *)findCoverOnscreen:(CALayer *)targetLayer { 176 | // See if this layer is one of our covers. 177 | NSEnumerator *coverEnumerator = [onscreenCovers objectEnumerator]; 178 | AFItemView *aCover = nil; 179 | while (aCover = (AFItemView *)[coverEnumerator nextObject]) 180 | if ([[aCover.imageView layer] isEqual:targetLayer]) 181 | break; 182 | 183 | return aCover; 184 | } 185 | @end 186 | 187 | 188 | @implementation AFOpenFlowView 189 | @synthesize dataSource, viewDelegate, numberOfImages, defaultImage; 190 | 191 | #define COVER_BUFFER 6 192 | 193 | - (void)awakeFromNib { 194 | [self setUpInitialState]; 195 | } 196 | 197 | - (id)initWithFrame:(CGRect)frame { 198 | if (self = [super initWithFrame:frame]) { 199 | [self setUpInitialState]; 200 | } 201 | 202 | return self; 203 | } 204 | 205 | - (void)dealloc { 206 | [defaultImage release]; 207 | 208 | [coverImages release]; 209 | [coverImageHeights release]; 210 | [offscreenCovers removeAllObjects]; 211 | [offscreenCovers release]; 212 | 213 | [onscreenCovers removeAllObjects]; 214 | [onscreenCovers release]; 215 | 216 | [super dealloc]; 217 | } 218 | 219 | - (void)layoutSubviews 220 | { 221 | // NSLog(@"[%@ %s]", self, _cmd); 222 | halfScreenWidth = self.bounds.size.width / 2; 223 | halfScreenHeight = self.bounds.size.height / 2; 224 | [self setNumberOfImages:numberOfImages]; // resets view bounds and stuff 225 | CGPoint contentOffset = [self contentOffset]; 226 | int targetCover = (int) roundf(contentOffset.x / 227 | [AFOpenFlowGeometry coverSpacing]); 228 | if (targetCover != selectedCoverView.number) { 229 | if (targetCover < 0) 230 | [self setSelectedCover:0]; 231 | else if (targetCover >= self.numberOfImages) 232 | [self setSelectedCover:self.numberOfImages - 1]; 233 | else 234 | [self setSelectedCover:targetCover]; 235 | } 236 | } 237 | 238 | #pragma mark UIScrollViewDelegate 239 | - (void)centerCoverHelperAnimated 240 | { 241 | [self centerOnSelectedCover:YES]; 242 | } 243 | 244 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; // called on finger up if user dragged. decelerate is true if it will continue moving afterwards 245 | { 246 | //NSLog(@"%s %f", _cmd, CACurrentMediaTime()); 247 | if(!decelerate) 248 | { 249 | [self centerOnSelectedCover:YES]; 250 | } 251 | } 252 | 253 | #pragma mark SBNotifyingWindowTouches 254 | 255 | #pragma mark UIScrollView 256 | 257 | - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; 258 | { 259 | // NSLog(@"contentOffset = %@ animated:%@", NSStringFromCGPoint(contentOffset), (animated) ? @"YES" : @"NO"); 260 | [super setContentOffset:contentOffset animated:animated]; 261 | if(!animated) 262 | { 263 | [self centerOnSelectedCover:NO]; 264 | } 265 | } 266 | 267 | - (void)setNumberOfImages:(int)newNumberOfImages { 268 | numberOfImages = newNumberOfImages; 269 | self.contentSize = CGSizeMake((newNumberOfImages-1)* [AFOpenFlowGeometry coverSpacing] + self.bounds.size.width, self.bounds.size.height); 270 | 271 | int lowerBound = MAX(0, selectedCoverView.number - COVER_BUFFER); 272 | int upperBound = MIN(self.numberOfImages - 1, selectedCoverView.number + COVER_BUFFER); 273 | 274 | if (selectedCoverView) 275 | [self layoutCovers:selectedCoverView.number fromCover:lowerBound toCover:upperBound]; 276 | else 277 | [self setSelectedCover:0]; 278 | } 279 | 280 | - (void)setDefaultImage:(UIImage *)newDefaultImage { 281 | [defaultImage release]; 282 | defaultImageHeight = newDefaultImage.size.height; 283 | defaultImage = [[newDefaultImage addImageReflection:kReflectionFraction] retain]; 284 | } 285 | 286 | - (void)setImage:(UIImage *)image forIndex:(int)index { 287 | // Create a reflection for this image. 288 | UIImage *imageWithReflection = [image addImageReflection:kReflectionFraction]; 289 | NSNumber *coverNumber = [NSNumber numberWithInt:index]; 290 | [coverImages setObject:imageWithReflection forKey:coverNumber]; 291 | [coverImageHeights setObject:[NSNumber numberWithFloat:image.size.height] forKey:coverNumber]; 292 | 293 | // If this cover is onscreen, set its image and call layoutCover. 294 | AFItemView *aCover = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:index]]; 295 | if (aCover) { 296 | [aCover setImage:imageWithReflection originalImageHeight:image.size.height reflectionFraction:kReflectionFraction]; 297 | [self layoutCover:aCover selectedCover:selectedCoverView.number animated:NO]; 298 | } 299 | } 300 | 301 | -(void)viewTapped:(UIGestureRecognizer *)sender 302 | { 303 | AFItemView *targetCover = (AFItemView *)[sender view]; 304 | int number = [targetCover number]; 305 | if (targetCover && (number != selectedCoverView.number)) 306 | { 307 | CGPoint selectedOffset = CGPointMake([AFOpenFlowGeometry coverSpacing] * targetCover.number, 0); 308 | [self setContentOffset:selectedOffset animated:YES]; 309 | } 310 | } 311 | 312 | -(void)viewDoubleTapped:(UIGestureRecognizer *)sender 313 | { 314 | AFItemView *targetCover = (AFItemView *)[sender view]; 315 | int number = [targetCover number]; 316 | NSLog(@"Double tapped %d", number); 317 | } 318 | 319 | 320 | - (void)centerOnSelectedCover:(BOOL)animated { 321 | CGPoint selectedOffset = CGPointMake([AFOpenFlowGeometry coverSpacing] * selectedCoverView.number, 0); 322 | [self setContentOffset:selectedOffset animated:animated]; 323 | } 324 | 325 | -(void)notifyCoverSelection 326 | { 327 | // And send the delegate the newly selected cover message. 328 | if ([self.viewDelegate respondsToSelector:@selector(openFlowView:selectionDidChange:)]) 329 | [self.viewDelegate openFlowView:self selectionDidChange:selectedCoverView.number]; 330 | } 331 | 332 | - (void)setSelectedCover:(int)newSelectedCover { 333 | if (selectedCoverView && (newSelectedCover == selectedCoverView.number)) 334 | return; 335 | 336 | AFItemView *cover; 337 | int newLowerBound = MAX(0, newSelectedCover - COVER_BUFFER); 338 | int newUpperBound = MIN(self.numberOfImages - 1, newSelectedCover + COVER_BUFFER); 339 | if (!selectedCoverView) { 340 | // Allocate and display covers from newLower to newUpper bounds. 341 | for (int i=newLowerBound; i <= newUpperBound; i++) { 342 | cover = [self coverForIndex:i]; 343 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:i]]; 344 | [self updateCoverImage:cover]; 345 | [self addSubview:cover]; 346 | [self layoutCover:cover selectedCover:newSelectedCover animated:NO]; 347 | } 348 | 349 | lowerVisibleCover = newLowerBound; 350 | upperVisibleCover = newUpperBound; 351 | selectedCoverView = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:newSelectedCover]]; 352 | [self notifyCoverSelection]; 353 | return; 354 | } 355 | 356 | // Check to see if the new & current ranges overlap. 357 | if ((newLowerBound > upperVisibleCover) || (newUpperBound < lowerVisibleCover)) { 358 | // They do not overlap at all. 359 | // This does not animate--assuming it's programmatically set from view controller. 360 | // Recycle all onscreen covers. 361 | AFItemView *cover; 362 | for (int i = lowerVisibleCover; i <= upperVisibleCover; i++) { 363 | cover = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:i]]; 364 | [offscreenCovers addObject:cover]; 365 | [cover removeFromSuperview]; 366 | [onscreenCovers removeObjectForKey:[NSNumber numberWithInt:cover.number]]; 367 | } 368 | 369 | // Move all available covers to new location. 370 | for (int i=newLowerBound; i <= newUpperBound; i++) { 371 | cover = [self coverForIndex:i]; 372 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:i]]; 373 | [self updateCoverImage:cover]; 374 | //[self.layer addSublayer:cover.layer]; 375 | [self addSubview:cover]; 376 | } 377 | 378 | lowerVisibleCover = newLowerBound; 379 | upperVisibleCover = newUpperBound; 380 | selectedCoverView = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:newSelectedCover]]; 381 | [self layoutCovers:newSelectedCover fromCover:newLowerBound toCover:newUpperBound]; 382 | [self notifyCoverSelection]; 383 | return; 384 | } else if (newSelectedCover > selectedCoverView.number) { 385 | // Move covers that are now out of range on the left to the right side, 386 | // but only if appropriate (within the range set by newUpperBound). 387 | for (int i=lowerVisibleCover; i < newLowerBound; i++) { 388 | cover = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:i]]; 389 | if (upperVisibleCover < newUpperBound) { 390 | // Tack it on the right side. 391 | upperVisibleCover++; 392 | cover.number = upperVisibleCover; 393 | [self updateCoverImage:cover]; 394 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:cover.number]]; 395 | [self layoutCover:cover selectedCover:newSelectedCover animated:NO]; 396 | } else { 397 | // Recycle this cover. 398 | [offscreenCovers addObject:cover]; 399 | [cover removeFromSuperview]; 400 | } 401 | [onscreenCovers removeObjectForKey:[NSNumber numberWithInt:i]]; 402 | } 403 | lowerVisibleCover = newLowerBound; 404 | 405 | // Add in any missing covers on the right up to the newUpperBound. 406 | for (int i=upperVisibleCover + 1; i <= newUpperBound; i++) { 407 | cover = [self coverForIndex:i]; 408 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:i]]; 409 | [self updateCoverImage:cover]; 410 | //[self.layer addSublayer:cover.layer]; 411 | [self addSubview:cover]; 412 | [self layoutCover:cover selectedCover:newSelectedCover animated:NO]; 413 | } 414 | upperVisibleCover = newUpperBound; 415 | } else { 416 | // Move covers that are now out of range on the right to the left side, 417 | // but only if appropriate (within the range set by newLowerBound). 418 | for (int i=upperVisibleCover; i > newUpperBound; i--) { 419 | cover = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:i]]; 420 | if (lowerVisibleCover > newLowerBound) { 421 | // Tack it on the left side. 422 | lowerVisibleCover --; 423 | cover.number = lowerVisibleCover; 424 | [self updateCoverImage:cover]; 425 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:lowerVisibleCover]]; 426 | [self layoutCover:cover selectedCover:newSelectedCover animated:NO]; 427 | } else { 428 | // Recycle this cover. 429 | [offscreenCovers addObject:cover]; 430 | [cover removeFromSuperview]; 431 | } 432 | [onscreenCovers removeObjectForKey:[NSNumber numberWithInt:i]]; 433 | } 434 | upperVisibleCover = newUpperBound; 435 | 436 | // Add in any missing covers on the left down to the newLowerBound. 437 | for (int i=lowerVisibleCover - 1; i >= newLowerBound; i--) { 438 | cover = [self coverForIndex:i]; 439 | [onscreenCovers setObject:cover forKey:[NSNumber numberWithInt:i]]; 440 | [self updateCoverImage:cover]; 441 | //[self.layer addSublayer:cover.layer]; 442 | [self addSubview:cover]; 443 | [self layoutCover:cover selectedCover:newSelectedCover animated:NO]; 444 | } 445 | lowerVisibleCover = newLowerBound; 446 | } 447 | 448 | if (selectedCoverView.number > newSelectedCover) 449 | [self layoutCovers:newSelectedCover fromCover:newSelectedCover toCover:selectedCoverView.number]; 450 | else if (newSelectedCover > selectedCoverView.number) 451 | [self layoutCovers:newSelectedCover fromCover:selectedCoverView.number toCover:newSelectedCover]; 452 | 453 | selectedCoverView = (AFItemView *)[onscreenCovers objectForKey:[NSNumber numberWithInt:newSelectedCover]]; 454 | [self notifyCoverSelection]; 455 | } 456 | 457 | @end -------------------------------------------------------------------------------- /OpenFlowProject/OpenFlowProject.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* OpenFlowProjectAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* OpenFlowProjectAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 15 | 2899E5220DE3E06400AC0155 /* OpenFlowProjectViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* OpenFlowProjectViewController.xib */; }; 16 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 17 | 28D7ACF80DDB3853001CB0EB /* OpenFlowProjectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* OpenFlowProjectViewController.m */; }; 18 | AB1C193210F462F50060F12D /* AFGetImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB1C193110F462F50060F12D /* AFGetImageOperation.m */; }; 19 | AB1C193B10F4630A0060F12D /* AFItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = AB1C193510F4630A0060F12D /* AFItemView.m */; }; 20 | AB1C193C10F4630A0060F12D /* AFOpenFlowView.m in Sources */ = {isa = PBXBuildFile; fileRef = AB1C193810F4630A0060F12D /* AFOpenFlowView.m */; }; 21 | AB1C193D10F4630A0060F12D /* AFUIImageReflection.m in Sources */ = {isa = PBXBuildFile; fileRef = AB1C193A10F4630A0060F12D /* AFUIImageReflection.m */; }; 22 | AB1C195510F463A40060F12D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1C195410F463A40060F12D /* QuartzCore.framework */; }; 23 | AB28F116134C2BF700DD8914 /* 0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0F7134C2BF700DD8914 /* 0.jpg */; }; 24 | AB28F117134C2BF700DD8914 /* 1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0F8134C2BF700DD8914 /* 1.jpg */; }; 25 | AB28F118134C2BF700DD8914 /* 10.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0F9134C2BF700DD8914 /* 10.jpg */; }; 26 | AB28F119134C2BF700DD8914 /* 11.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FA134C2BF700DD8914 /* 11.jpg */; }; 27 | AB28F11A134C2BF700DD8914 /* 12.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FB134C2BF700DD8914 /* 12.jpg */; }; 28 | AB28F11B134C2BF700DD8914 /* 13.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FC134C2BF700DD8914 /* 13.jpg */; }; 29 | AB28F11C134C2BF700DD8914 /* 14.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FD134C2BF700DD8914 /* 14.jpg */; }; 30 | AB28F11D134C2BF700DD8914 /* 15.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FE134C2BF700DD8914 /* 15.jpg */; }; 31 | AB28F11E134C2BF700DD8914 /* 16.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F0FF134C2BF700DD8914 /* 16.jpg */; }; 32 | AB28F11F134C2BF700DD8914 /* 17.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F100134C2BF700DD8914 /* 17.jpg */; }; 33 | AB28F120134C2BF700DD8914 /* 18.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F101134C2BF700DD8914 /* 18.jpg */; }; 34 | AB28F121134C2BF700DD8914 /* 19.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F102134C2BF700DD8914 /* 19.jpg */; }; 35 | AB28F122134C2BF700DD8914 /* 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F103134C2BF700DD8914 /* 2.jpg */; }; 36 | AB28F123134C2BF700DD8914 /* 20.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F104134C2BF700DD8914 /* 20.jpg */; }; 37 | AB28F124134C2BF700DD8914 /* 21.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F105134C2BF700DD8914 /* 21.jpg */; }; 38 | AB28F125134C2BF700DD8914 /* 22.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F106134C2BF700DD8914 /* 22.jpg */; }; 39 | AB28F126134C2BF700DD8914 /* 23.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F107134C2BF700DD8914 /* 23.jpg */; }; 40 | AB28F127134C2BF700DD8914 /* 24.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F108134C2BF700DD8914 /* 24.jpg */; }; 41 | AB28F128134C2BF700DD8914 /* 25.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F109134C2BF700DD8914 /* 25.jpg */; }; 42 | AB28F129134C2BF700DD8914 /* 26.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10A134C2BF700DD8914 /* 26.jpg */; }; 43 | AB28F12A134C2BF700DD8914 /* 27.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10B134C2BF700DD8914 /* 27.jpg */; }; 44 | AB28F12B134C2BF700DD8914 /* 28.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10C134C2BF700DD8914 /* 28.jpg */; }; 45 | AB28F12C134C2BF700DD8914 /* 29.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10D134C2BF700DD8914 /* 29.jpg */; }; 46 | AB28F12D134C2BF700DD8914 /* 3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10E134C2BF700DD8914 /* 3.jpg */; }; 47 | AB28F12E134C2BF700DD8914 /* 4.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F10F134C2BF700DD8914 /* 4.jpg */; }; 48 | AB28F12F134C2BF700DD8914 /* 5.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F110134C2BF700DD8914 /* 5.jpg */; }; 49 | AB28F130134C2BF700DD8914 /* 6.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F111134C2BF700DD8914 /* 6.jpg */; }; 50 | AB28F131134C2BF700DD8914 /* 7.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F112134C2BF700DD8914 /* 7.jpg */; }; 51 | AB28F132134C2BF700DD8914 /* 8.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F113134C2BF700DD8914 /* 8.jpg */; }; 52 | AB28F133134C2BF700DD8914 /* 9.jpg in Resources */ = {isa = PBXBuildFile; fileRef = AB28F114134C2BF700DD8914 /* 9.jpg */; }; 53 | AB28F134134C2BF700DD8914 /* Read me.txt in Resources */ = {isa = PBXBuildFile; fileRef = AB28F115134C2BF700DD8914 /* Read me.txt */; }; 54 | AB28F154134C2C0400DD8914 /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F136134C2C0400DD8914 /* 0.png */; }; 55 | AB28F155134C2C0400DD8914 /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F137134C2C0400DD8914 /* 1.png */; }; 56 | AB28F156134C2C0400DD8914 /* 10.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F138134C2C0400DD8914 /* 10.png */; }; 57 | AB28F157134C2C0400DD8914 /* 11.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F139134C2C0400DD8914 /* 11.png */; }; 58 | AB28F158134C2C0400DD8914 /* 12.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13A134C2C0400DD8914 /* 12.png */; }; 59 | AB28F159134C2C0400DD8914 /* 13.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13B134C2C0400DD8914 /* 13.png */; }; 60 | AB28F15A134C2C0400DD8914 /* 14.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13C134C2C0400DD8914 /* 14.png */; }; 61 | AB28F15B134C2C0400DD8914 /* 15.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13D134C2C0400DD8914 /* 15.png */; }; 62 | AB28F15C134C2C0400DD8914 /* 16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13E134C2C0400DD8914 /* 16.png */; }; 63 | AB28F15D134C2C0400DD8914 /* 17.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F13F134C2C0400DD8914 /* 17.png */; }; 64 | AB28F15E134C2C0400DD8914 /* 18.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F140134C2C0400DD8914 /* 18.png */; }; 65 | AB28F15F134C2C0400DD8914 /* 19.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F141134C2C0400DD8914 /* 19.png */; }; 66 | AB28F160134C2C0400DD8914 /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F142134C2C0400DD8914 /* 2.png */; }; 67 | AB28F161134C2C0400DD8914 /* 20.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F143134C2C0400DD8914 /* 20.png */; }; 68 | AB28F162134C2C0400DD8914 /* 21.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F144134C2C0400DD8914 /* 21.png */; }; 69 | AB28F163134C2C0400DD8914 /* 22.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F145134C2C0400DD8914 /* 22.png */; }; 70 | AB28F164134C2C0400DD8914 /* 23.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F146134C2C0400DD8914 /* 23.png */; }; 71 | AB28F165134C2C0400DD8914 /* 24.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F147134C2C0400DD8914 /* 24.png */; }; 72 | AB28F166134C2C0400DD8914 /* 25.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F148134C2C0400DD8914 /* 25.png */; }; 73 | AB28F167134C2C0400DD8914 /* 26.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F149134C2C0400DD8914 /* 26.png */; }; 74 | AB28F168134C2C0400DD8914 /* 27.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14A134C2C0400DD8914 /* 27.png */; }; 75 | AB28F169134C2C0400DD8914 /* 28.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14B134C2C0400DD8914 /* 28.png */; }; 76 | AB28F16A134C2C0400DD8914 /* 29.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14C134C2C0400DD8914 /* 29.png */; }; 77 | AB28F16B134C2C0400DD8914 /* 3.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14D134C2C0400DD8914 /* 3.png */; }; 78 | AB28F16C134C2C0400DD8914 /* 4.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14E134C2C0400DD8914 /* 4.png */; }; 79 | AB28F16D134C2C0400DD8914 /* 5.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F14F134C2C0400DD8914 /* 5.png */; }; 80 | AB28F16E134C2C0400DD8914 /* 6.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F150134C2C0400DD8914 /* 6.png */; }; 81 | AB28F16F134C2C0400DD8914 /* 7.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F151134C2C0400DD8914 /* 7.png */; }; 82 | AB28F170134C2C0400DD8914 /* 8.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F152134C2C0400DD8914 /* 8.png */; }; 83 | AB28F171134C2C0400DD8914 /* 9.png in Resources */ = {isa = PBXBuildFile; fileRef = AB28F153134C2C0400DD8914 /* 9.png */; }; 84 | ABB6D303134C257B0027EDCA /* AFOpenFlowGeometry.m in Sources */ = {isa = PBXBuildFile; fileRef = ABB6D300134C257B0027EDCA /* AFOpenFlowGeometry.m */; }; 85 | ABB6D39D134C27BC0027EDCA /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABB6D39C134C27BC0027EDCA /* MainWindow-iPad.xib */; }; 86 | /* End PBXBuildFile section */ 87 | 88 | /* Begin PBXFileReference section */ 89 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 90 | 1D3623240D0F684500981E51 /* OpenFlowProjectAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenFlowProjectAppDelegate.h; sourceTree = ""; }; 91 | 1D3623250D0F684500981E51 /* OpenFlowProjectAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenFlowProjectAppDelegate.m; sourceTree = ""; }; 92 | 1D6058910D05DD3D006BFB54 /* OpenFlowProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenFlowProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; 93 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 94 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 95 | 2899E5210DE3E06400AC0155 /* OpenFlowProjectViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = OpenFlowProjectViewController.xib; sourceTree = ""; }; 96 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 97 | 28D7ACF60DDB3853001CB0EB /* OpenFlowProjectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenFlowProjectViewController.h; sourceTree = ""; }; 98 | 28D7ACF70DDB3853001CB0EB /* OpenFlowProjectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenFlowProjectViewController.m; sourceTree = ""; }; 99 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 100 | 32CA4F630368D1EE00C91783 /* OpenFlowProject_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenFlowProject_Prefix.pch; sourceTree = ""; }; 101 | 8D1107310486CEB800E47090 /* OpenFlowProject-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "OpenFlowProject-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 102 | AB1C193010F462F50060F12D /* AFGetImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFGetImageOperation.h; sourceTree = ""; }; 103 | AB1C193110F462F50060F12D /* AFGetImageOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFGetImageOperation.m; sourceTree = ""; }; 104 | AB1C193410F4630A0060F12D /* AFItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AFItemView.h; path = ../OpenFlow/AFItemView.h; sourceTree = SOURCE_ROOT; }; 105 | AB1C193510F4630A0060F12D /* AFItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AFItemView.m; path = ../OpenFlow/AFItemView.m; sourceTree = SOURCE_ROOT; }; 106 | AB1C193610F4630A0060F12D /* AFOpenFlowConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AFOpenFlowConstants.h; path = ../OpenFlow/AFOpenFlowConstants.h; sourceTree = SOURCE_ROOT; }; 107 | AB1C193710F4630A0060F12D /* AFOpenFlowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AFOpenFlowView.h; path = ../OpenFlow/AFOpenFlowView.h; sourceTree = SOURCE_ROOT; }; 108 | AB1C193810F4630A0060F12D /* AFOpenFlowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AFOpenFlowView.m; path = ../OpenFlow/AFOpenFlowView.m; sourceTree = SOURCE_ROOT; }; 109 | AB1C193910F4630A0060F12D /* AFUIImageReflection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AFUIImageReflection.h; path = ../OpenFlow/AFUIImageReflection.h; sourceTree = SOURCE_ROOT; }; 110 | AB1C193A10F4630A0060F12D /* AFUIImageReflection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AFUIImageReflection.m; path = ../OpenFlow/AFUIImageReflection.m; sourceTree = SOURCE_ROOT; }; 111 | AB1C195410F463A40060F12D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 112 | AB28F0F7134C2BF700DD8914 /* 0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 0.jpg; sourceTree = ""; }; 113 | AB28F0F8134C2BF700DD8914 /* 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 1.jpg; sourceTree = ""; }; 114 | AB28F0F9134C2BF700DD8914 /* 10.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 10.jpg; sourceTree = ""; }; 115 | AB28F0FA134C2BF700DD8914 /* 11.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 11.jpg; sourceTree = ""; }; 116 | AB28F0FB134C2BF700DD8914 /* 12.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 12.jpg; sourceTree = ""; }; 117 | AB28F0FC134C2BF700DD8914 /* 13.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 13.jpg; sourceTree = ""; }; 118 | AB28F0FD134C2BF700DD8914 /* 14.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 14.jpg; sourceTree = ""; }; 119 | AB28F0FE134C2BF700DD8914 /* 15.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 15.jpg; sourceTree = ""; }; 120 | AB28F0FF134C2BF700DD8914 /* 16.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 16.jpg; sourceTree = ""; }; 121 | AB28F100134C2BF700DD8914 /* 17.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 17.jpg; sourceTree = ""; }; 122 | AB28F101134C2BF700DD8914 /* 18.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 18.jpg; sourceTree = ""; }; 123 | AB28F102134C2BF700DD8914 /* 19.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 19.jpg; sourceTree = ""; }; 124 | AB28F103134C2BF700DD8914 /* 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 2.jpg; sourceTree = ""; }; 125 | AB28F104134C2BF700DD8914 /* 20.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 20.jpg; sourceTree = ""; }; 126 | AB28F105134C2BF700DD8914 /* 21.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 21.jpg; sourceTree = ""; }; 127 | AB28F106134C2BF700DD8914 /* 22.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 22.jpg; sourceTree = ""; }; 128 | AB28F107134C2BF700DD8914 /* 23.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 23.jpg; sourceTree = ""; }; 129 | AB28F108134C2BF700DD8914 /* 24.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 24.jpg; sourceTree = ""; }; 130 | AB28F109134C2BF700DD8914 /* 25.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 25.jpg; sourceTree = ""; }; 131 | AB28F10A134C2BF700DD8914 /* 26.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 26.jpg; sourceTree = ""; }; 132 | AB28F10B134C2BF700DD8914 /* 27.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 27.jpg; sourceTree = ""; }; 133 | AB28F10C134C2BF700DD8914 /* 28.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 28.jpg; sourceTree = ""; }; 134 | AB28F10D134C2BF700DD8914 /* 29.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 29.jpg; sourceTree = ""; }; 135 | AB28F10E134C2BF700DD8914 /* 3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 3.jpg; sourceTree = ""; }; 136 | AB28F10F134C2BF700DD8914 /* 4.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 4.jpg; sourceTree = ""; }; 137 | AB28F110134C2BF700DD8914 /* 5.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 5.jpg; sourceTree = ""; }; 138 | AB28F111134C2BF700DD8914 /* 6.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 6.jpg; sourceTree = ""; }; 139 | AB28F112134C2BF700DD8914 /* 7.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 7.jpg; sourceTree = ""; }; 140 | AB28F113134C2BF700DD8914 /* 8.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 8.jpg; sourceTree = ""; }; 141 | AB28F114134C2BF700DD8914 /* 9.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 9.jpg; sourceTree = ""; }; 142 | AB28F115134C2BF700DD8914 /* Read me.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Read me.txt"; sourceTree = ""; }; 143 | AB28F136134C2C0400DD8914 /* 0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 0.png; sourceTree = ""; }; 144 | AB28F137134C2C0400DD8914 /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = ""; }; 145 | AB28F138134C2C0400DD8914 /* 10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 10.png; sourceTree = ""; }; 146 | AB28F139134C2C0400DD8914 /* 11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 11.png; sourceTree = ""; }; 147 | AB28F13A134C2C0400DD8914 /* 12.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 12.png; sourceTree = ""; }; 148 | AB28F13B134C2C0400DD8914 /* 13.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 13.png; sourceTree = ""; }; 149 | AB28F13C134C2C0400DD8914 /* 14.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 14.png; sourceTree = ""; }; 150 | AB28F13D134C2C0400DD8914 /* 15.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 15.png; sourceTree = ""; }; 151 | AB28F13E134C2C0400DD8914 /* 16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 16.png; sourceTree = ""; }; 152 | AB28F13F134C2C0400DD8914 /* 17.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 17.png; sourceTree = ""; }; 153 | AB28F140134C2C0400DD8914 /* 18.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 18.png; sourceTree = ""; }; 154 | AB28F141134C2C0400DD8914 /* 19.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 19.png; sourceTree = ""; }; 155 | AB28F142134C2C0400DD8914 /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = ""; }; 156 | AB28F143134C2C0400DD8914 /* 20.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 20.png; sourceTree = ""; }; 157 | AB28F144134C2C0400DD8914 /* 21.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 21.png; sourceTree = ""; }; 158 | AB28F145134C2C0400DD8914 /* 22.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 22.png; sourceTree = ""; }; 159 | AB28F146134C2C0400DD8914 /* 23.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 23.png; sourceTree = ""; }; 160 | AB28F147134C2C0400DD8914 /* 24.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 24.png; sourceTree = ""; }; 161 | AB28F148134C2C0400DD8914 /* 25.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 25.png; sourceTree = ""; }; 162 | AB28F149134C2C0400DD8914 /* 26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 26.png; sourceTree = ""; }; 163 | AB28F14A134C2C0400DD8914 /* 27.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 27.png; sourceTree = ""; }; 164 | AB28F14B134C2C0400DD8914 /* 28.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 28.png; sourceTree = ""; }; 165 | AB28F14C134C2C0400DD8914 /* 29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 29.png; sourceTree = ""; }; 166 | AB28F14D134C2C0400DD8914 /* 3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 3.png; sourceTree = ""; }; 167 | AB28F14E134C2C0400DD8914 /* 4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 4.png; sourceTree = ""; }; 168 | AB28F14F134C2C0400DD8914 /* 5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 5.png; sourceTree = ""; }; 169 | AB28F150134C2C0400DD8914 /* 6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 6.png; sourceTree = ""; }; 170 | AB28F151134C2C0400DD8914 /* 7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 7.png; sourceTree = ""; }; 171 | AB28F152134C2C0400DD8914 /* 8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 8.png; sourceTree = ""; }; 172 | AB28F153134C2C0400DD8914 /* 9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 9.png; sourceTree = ""; }; 173 | ABB6D2FF134C257B0027EDCA /* AFOpenFlowGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFOpenFlowGeometry.h; sourceTree = ""; }; 174 | ABB6D300134C257B0027EDCA /* AFOpenFlowGeometry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFOpenFlowGeometry.m; sourceTree = ""; }; 175 | ABB6D39C134C27BC0027EDCA /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainWindow-iPad.xib"; path = "Resources-iPad/MainWindow-iPad.xib"; sourceTree = ""; }; 176 | /* End PBXFileReference section */ 177 | 178 | /* Begin PBXFrameworksBuildPhase section */ 179 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 180 | isa = PBXFrameworksBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 184 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 185 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, 186 | AB1C195510F463A40060F12D /* QuartzCore.framework in Frameworks */, 187 | ); 188 | runOnlyForDeploymentPostprocessing = 0; 189 | }; 190 | /* End PBXFrameworksBuildPhase section */ 191 | 192 | /* Begin PBXGroup section */ 193 | 080E96DDFE201D6D7F000001 /* Classes */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | AB1C193310F4630A0060F12D /* OpenFlow */, 197 | AB1C193010F462F50060F12D /* AFGetImageOperation.h */, 198 | AB1C193110F462F50060F12D /* AFGetImageOperation.m */, 199 | 1D3623240D0F684500981E51 /* OpenFlowProjectAppDelegate.h */, 200 | 1D3623250D0F684500981E51 /* OpenFlowProjectAppDelegate.m */, 201 | 28D7ACF60DDB3853001CB0EB /* OpenFlowProjectViewController.h */, 202 | 28D7ACF70DDB3853001CB0EB /* OpenFlowProjectViewController.m */, 203 | ); 204 | path = Classes; 205 | sourceTree = ""; 206 | }; 207 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 208 | isa = PBXGroup; 209 | children = ( 210 | 1D6058910D05DD3D006BFB54 /* OpenFlowProject.app */, 211 | ); 212 | name = Products; 213 | sourceTree = ""; 214 | }; 215 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 216 | isa = PBXGroup; 217 | children = ( 218 | 080E96DDFE201D6D7F000001 /* Classes */, 219 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 220 | 29B97317FDCFA39411CA2CEA /* Resources */, 221 | ABB6D39B134C27BB0027EDCA /* Resources-iPad */, 222 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 223 | 19C28FACFE9D520D11CA2CBB /* Products */, 224 | ); 225 | name = CustomTemplate; 226 | sourceTree = ""; 227 | }; 228 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 229 | isa = PBXGroup; 230 | children = ( 231 | 32CA4F630368D1EE00C91783 /* OpenFlowProject_Prefix.pch */, 232 | 29B97316FDCFA39411CA2CEA /* main.m */, 233 | ); 234 | name = "Other Sources"; 235 | sourceTree = ""; 236 | }; 237 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 238 | isa = PBXGroup; 239 | children = ( 240 | AB28F0F6134C2BF700DD8914 /* Sample Images */, 241 | 2899E5210DE3E06400AC0155 /* OpenFlowProjectViewController.xib */, 242 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 243 | 8D1107310486CEB800E47090 /* OpenFlowProject-Info.plist */, 244 | ); 245 | name = Resources; 246 | sourceTree = ""; 247 | }; 248 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 249 | isa = PBXGroup; 250 | children = ( 251 | AB1C195410F463A40060F12D /* QuartzCore.framework */, 252 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 253 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 254 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */, 255 | ); 256 | name = Frameworks; 257 | sourceTree = ""; 258 | }; 259 | AB1C193310F4630A0060F12D /* OpenFlow */ = { 260 | isa = PBXGroup; 261 | children = ( 262 | ABB6D2FF134C257B0027EDCA /* AFOpenFlowGeometry.h */, 263 | ABB6D300134C257B0027EDCA /* AFOpenFlowGeometry.m */, 264 | AB1C193410F4630A0060F12D /* AFItemView.h */, 265 | AB1C193510F4630A0060F12D /* AFItemView.m */, 266 | AB1C193610F4630A0060F12D /* AFOpenFlowConstants.h */, 267 | AB1C193710F4630A0060F12D /* AFOpenFlowView.h */, 268 | AB1C193810F4630A0060F12D /* AFOpenFlowView.m */, 269 | AB1C193910F4630A0060F12D /* AFUIImageReflection.h */, 270 | AB1C193A10F4630A0060F12D /* AFUIImageReflection.m */, 271 | ); 272 | name = OpenFlow; 273 | path = ../OpenFlow; 274 | sourceTree = SOURCE_ROOT; 275 | }; 276 | AB28F0F6134C2BF700DD8914 /* Sample Images */ = { 277 | isa = PBXGroup; 278 | children = ( 279 | AB28F0F7134C2BF700DD8914 /* 0.jpg */, 280 | AB28F0F8134C2BF700DD8914 /* 1.jpg */, 281 | AB28F0F9134C2BF700DD8914 /* 10.jpg */, 282 | AB28F0FA134C2BF700DD8914 /* 11.jpg */, 283 | AB28F0FB134C2BF700DD8914 /* 12.jpg */, 284 | AB28F0FC134C2BF700DD8914 /* 13.jpg */, 285 | AB28F0FD134C2BF700DD8914 /* 14.jpg */, 286 | AB28F0FE134C2BF700DD8914 /* 15.jpg */, 287 | AB28F0FF134C2BF700DD8914 /* 16.jpg */, 288 | AB28F100134C2BF700DD8914 /* 17.jpg */, 289 | AB28F101134C2BF700DD8914 /* 18.jpg */, 290 | AB28F102134C2BF700DD8914 /* 19.jpg */, 291 | AB28F103134C2BF700DD8914 /* 2.jpg */, 292 | AB28F104134C2BF700DD8914 /* 20.jpg */, 293 | AB28F105134C2BF700DD8914 /* 21.jpg */, 294 | AB28F106134C2BF700DD8914 /* 22.jpg */, 295 | AB28F107134C2BF700DD8914 /* 23.jpg */, 296 | AB28F108134C2BF700DD8914 /* 24.jpg */, 297 | AB28F109134C2BF700DD8914 /* 25.jpg */, 298 | AB28F10A134C2BF700DD8914 /* 26.jpg */, 299 | AB28F10B134C2BF700DD8914 /* 27.jpg */, 300 | AB28F10C134C2BF700DD8914 /* 28.jpg */, 301 | AB28F10D134C2BF700DD8914 /* 29.jpg */, 302 | AB28F10E134C2BF700DD8914 /* 3.jpg */, 303 | AB28F10F134C2BF700DD8914 /* 4.jpg */, 304 | AB28F110134C2BF700DD8914 /* 5.jpg */, 305 | AB28F111134C2BF700DD8914 /* 6.jpg */, 306 | AB28F112134C2BF700DD8914 /* 7.jpg */, 307 | AB28F113134C2BF700DD8914 /* 8.jpg */, 308 | AB28F114134C2BF700DD8914 /* 9.jpg */, 309 | AB28F115134C2BF700DD8914 /* Read me.txt */, 310 | ); 311 | path = "Sample Images"; 312 | sourceTree = ""; 313 | }; 314 | AB28F135134C2C0400DD8914 /* iPad Sample Images */ = { 315 | isa = PBXGroup; 316 | children = ( 317 | AB28F136134C2C0400DD8914 /* 0.png */, 318 | AB28F137134C2C0400DD8914 /* 1.png */, 319 | AB28F138134C2C0400DD8914 /* 10.png */, 320 | AB28F139134C2C0400DD8914 /* 11.png */, 321 | AB28F13A134C2C0400DD8914 /* 12.png */, 322 | AB28F13B134C2C0400DD8914 /* 13.png */, 323 | AB28F13C134C2C0400DD8914 /* 14.png */, 324 | AB28F13D134C2C0400DD8914 /* 15.png */, 325 | AB28F13E134C2C0400DD8914 /* 16.png */, 326 | AB28F13F134C2C0400DD8914 /* 17.png */, 327 | AB28F140134C2C0400DD8914 /* 18.png */, 328 | AB28F141134C2C0400DD8914 /* 19.png */, 329 | AB28F142134C2C0400DD8914 /* 2.png */, 330 | AB28F143134C2C0400DD8914 /* 20.png */, 331 | AB28F144134C2C0400DD8914 /* 21.png */, 332 | AB28F145134C2C0400DD8914 /* 22.png */, 333 | AB28F146134C2C0400DD8914 /* 23.png */, 334 | AB28F147134C2C0400DD8914 /* 24.png */, 335 | AB28F148134C2C0400DD8914 /* 25.png */, 336 | AB28F149134C2C0400DD8914 /* 26.png */, 337 | AB28F14A134C2C0400DD8914 /* 27.png */, 338 | AB28F14B134C2C0400DD8914 /* 28.png */, 339 | AB28F14C134C2C0400DD8914 /* 29.png */, 340 | AB28F14D134C2C0400DD8914 /* 3.png */, 341 | AB28F14E134C2C0400DD8914 /* 4.png */, 342 | AB28F14F134C2C0400DD8914 /* 5.png */, 343 | AB28F150134C2C0400DD8914 /* 6.png */, 344 | AB28F151134C2C0400DD8914 /* 7.png */, 345 | AB28F152134C2C0400DD8914 /* 8.png */, 346 | AB28F153134C2C0400DD8914 /* 9.png */, 347 | ); 348 | path = "iPad Sample Images"; 349 | sourceTree = ""; 350 | }; 351 | ABB6D39B134C27BB0027EDCA /* Resources-iPad */ = { 352 | isa = PBXGroup; 353 | children = ( 354 | AB28F135134C2C0400DD8914 /* iPad Sample Images */, 355 | ABB6D39C134C27BC0027EDCA /* MainWindow-iPad.xib */, 356 | ); 357 | name = "Resources-iPad"; 358 | sourceTree = ""; 359 | }; 360 | /* End PBXGroup section */ 361 | 362 | /* Begin PBXNativeTarget section */ 363 | 1D6058900D05DD3D006BFB54 /* OpenFlowProject */ = { 364 | isa = PBXNativeTarget; 365 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "OpenFlowProject" */; 366 | buildPhases = ( 367 | 1D60588D0D05DD3D006BFB54 /* Resources */, 368 | 1D60588E0D05DD3D006BFB54 /* Sources */, 369 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 370 | ); 371 | buildRules = ( 372 | ); 373 | dependencies = ( 374 | ); 375 | name = OpenFlowProject; 376 | productName = OpenFlowProject; 377 | productReference = 1D6058910D05DD3D006BFB54 /* OpenFlowProject.app */; 378 | productType = "com.apple.product-type.application"; 379 | }; 380 | /* End PBXNativeTarget section */ 381 | 382 | /* Begin PBXProject section */ 383 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 384 | isa = PBXProject; 385 | attributes = { 386 | LastUpgradeCheck = 0420; 387 | }; 388 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "OpenFlowProject" */; 389 | compatibilityVersion = "Xcode 3.2"; 390 | developmentRegion = English; 391 | hasScannedForEncodings = 1; 392 | knownRegions = ( 393 | English, 394 | Japanese, 395 | French, 396 | German, 397 | ); 398 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 399 | projectDirPath = ""; 400 | projectRoot = ""; 401 | targets = ( 402 | 1D6058900D05DD3D006BFB54 /* OpenFlowProject */, 403 | ); 404 | }; 405 | /* End PBXProject section */ 406 | 407 | /* Begin PBXResourcesBuildPhase section */ 408 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 409 | isa = PBXResourcesBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 413 | 2899E5220DE3E06400AC0155 /* OpenFlowProjectViewController.xib in Resources */, 414 | ABB6D39D134C27BC0027EDCA /* MainWindow-iPad.xib in Resources */, 415 | AB28F116134C2BF700DD8914 /* 0.jpg in Resources */, 416 | AB28F117134C2BF700DD8914 /* 1.jpg in Resources */, 417 | AB28F118134C2BF700DD8914 /* 10.jpg in Resources */, 418 | AB28F119134C2BF700DD8914 /* 11.jpg in Resources */, 419 | AB28F11A134C2BF700DD8914 /* 12.jpg in Resources */, 420 | AB28F11B134C2BF700DD8914 /* 13.jpg in Resources */, 421 | AB28F11C134C2BF700DD8914 /* 14.jpg in Resources */, 422 | AB28F11D134C2BF700DD8914 /* 15.jpg in Resources */, 423 | AB28F11E134C2BF700DD8914 /* 16.jpg in Resources */, 424 | AB28F11F134C2BF700DD8914 /* 17.jpg in Resources */, 425 | AB28F120134C2BF700DD8914 /* 18.jpg in Resources */, 426 | AB28F121134C2BF700DD8914 /* 19.jpg in Resources */, 427 | AB28F122134C2BF700DD8914 /* 2.jpg in Resources */, 428 | AB28F123134C2BF700DD8914 /* 20.jpg in Resources */, 429 | AB28F124134C2BF700DD8914 /* 21.jpg in Resources */, 430 | AB28F125134C2BF700DD8914 /* 22.jpg in Resources */, 431 | AB28F126134C2BF700DD8914 /* 23.jpg in Resources */, 432 | AB28F127134C2BF700DD8914 /* 24.jpg in Resources */, 433 | AB28F128134C2BF700DD8914 /* 25.jpg in Resources */, 434 | AB28F129134C2BF700DD8914 /* 26.jpg in Resources */, 435 | AB28F12A134C2BF700DD8914 /* 27.jpg in Resources */, 436 | AB28F12B134C2BF700DD8914 /* 28.jpg in Resources */, 437 | AB28F12C134C2BF700DD8914 /* 29.jpg in Resources */, 438 | AB28F12D134C2BF700DD8914 /* 3.jpg in Resources */, 439 | AB28F12E134C2BF700DD8914 /* 4.jpg in Resources */, 440 | AB28F12F134C2BF700DD8914 /* 5.jpg in Resources */, 441 | AB28F130134C2BF700DD8914 /* 6.jpg in Resources */, 442 | AB28F131134C2BF700DD8914 /* 7.jpg in Resources */, 443 | AB28F132134C2BF700DD8914 /* 8.jpg in Resources */, 444 | AB28F133134C2BF700DD8914 /* 9.jpg in Resources */, 445 | AB28F134134C2BF700DD8914 /* Read me.txt in Resources */, 446 | AB28F154134C2C0400DD8914 /* 0.png in Resources */, 447 | AB28F155134C2C0400DD8914 /* 1.png in Resources */, 448 | AB28F156134C2C0400DD8914 /* 10.png in Resources */, 449 | AB28F157134C2C0400DD8914 /* 11.png in Resources */, 450 | AB28F158134C2C0400DD8914 /* 12.png in Resources */, 451 | AB28F159134C2C0400DD8914 /* 13.png in Resources */, 452 | AB28F15A134C2C0400DD8914 /* 14.png in Resources */, 453 | AB28F15B134C2C0400DD8914 /* 15.png in Resources */, 454 | AB28F15C134C2C0400DD8914 /* 16.png in Resources */, 455 | AB28F15D134C2C0400DD8914 /* 17.png in Resources */, 456 | AB28F15E134C2C0400DD8914 /* 18.png in Resources */, 457 | AB28F15F134C2C0400DD8914 /* 19.png in Resources */, 458 | AB28F160134C2C0400DD8914 /* 2.png in Resources */, 459 | AB28F161134C2C0400DD8914 /* 20.png in Resources */, 460 | AB28F162134C2C0400DD8914 /* 21.png in Resources */, 461 | AB28F163134C2C0400DD8914 /* 22.png in Resources */, 462 | AB28F164134C2C0400DD8914 /* 23.png in Resources */, 463 | AB28F165134C2C0400DD8914 /* 24.png in Resources */, 464 | AB28F166134C2C0400DD8914 /* 25.png in Resources */, 465 | AB28F167134C2C0400DD8914 /* 26.png in Resources */, 466 | AB28F168134C2C0400DD8914 /* 27.png in Resources */, 467 | AB28F169134C2C0400DD8914 /* 28.png in Resources */, 468 | AB28F16A134C2C0400DD8914 /* 29.png in Resources */, 469 | AB28F16B134C2C0400DD8914 /* 3.png in Resources */, 470 | AB28F16C134C2C0400DD8914 /* 4.png in Resources */, 471 | AB28F16D134C2C0400DD8914 /* 5.png in Resources */, 472 | AB28F16E134C2C0400DD8914 /* 6.png in Resources */, 473 | AB28F16F134C2C0400DD8914 /* 7.png in Resources */, 474 | AB28F170134C2C0400DD8914 /* 8.png in Resources */, 475 | AB28F171134C2C0400DD8914 /* 9.png in Resources */, 476 | ); 477 | runOnlyForDeploymentPostprocessing = 0; 478 | }; 479 | /* End PBXResourcesBuildPhase section */ 480 | 481 | /* Begin PBXSourcesBuildPhase section */ 482 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 483 | isa = PBXSourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 487 | 1D3623260D0F684500981E51 /* OpenFlowProjectAppDelegate.m in Sources */, 488 | 28D7ACF80DDB3853001CB0EB /* OpenFlowProjectViewController.m in Sources */, 489 | AB1C193210F462F50060F12D /* AFGetImageOperation.m in Sources */, 490 | AB1C193B10F4630A0060F12D /* AFItemView.m in Sources */, 491 | AB1C193C10F4630A0060F12D /* AFOpenFlowView.m in Sources */, 492 | AB1C193D10F4630A0060F12D /* AFUIImageReflection.m in Sources */, 493 | ABB6D303134C257B0027EDCA /* AFOpenFlowGeometry.m in Sources */, 494 | ); 495 | runOnlyForDeploymentPostprocessing = 0; 496 | }; 497 | /* End PBXSourcesBuildPhase section */ 498 | 499 | /* Begin XCBuildConfiguration section */ 500 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 501 | isa = XCBuildConfiguration; 502 | buildSettings = { 503 | ALWAYS_SEARCH_USER_PATHS = NO; 504 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 505 | COPY_PHASE_STRIP = NO; 506 | GCC_DYNAMIC_NO_PIC = NO; 507 | GCC_OPTIMIZATION_LEVEL = 0; 508 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 509 | GCC_PREFIX_HEADER = OpenFlowProject_Prefix.pch; 510 | INFOPLIST_FILE = "OpenFlowProject-Info.plist"; 511 | PRODUCT_NAME = OpenFlowProject; 512 | SDKROOT = iphoneos; 513 | TARGETED_DEVICE_FAMILY = "1,2"; 514 | }; 515 | name = Debug; 516 | }; 517 | 1D6058950D05DD3E006BFB54 /* Release */ = { 518 | isa = XCBuildConfiguration; 519 | buildSettings = { 520 | ALWAYS_SEARCH_USER_PATHS = NO; 521 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 522 | COPY_PHASE_STRIP = YES; 523 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 524 | GCC_PREFIX_HEADER = OpenFlowProject_Prefix.pch; 525 | INFOPLIST_FILE = "OpenFlowProject-Info.plist"; 526 | PRODUCT_NAME = OpenFlowProject; 527 | SDKROOT = iphoneos; 528 | TARGETED_DEVICE_FAMILY = "1,2"; 529 | }; 530 | name = Release; 531 | }; 532 | C01FCF4F08A954540054247B /* Debug */ = { 533 | isa = XCBuildConfiguration; 534 | buildSettings = { 535 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 536 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 537 | GCC_C_LANGUAGE_STANDARD = c99; 538 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 539 | GCC_WARN_UNUSED_VARIABLE = YES; 540 | IPHONEOS_DEPLOYMENT_TARGET = 4.0; 541 | SDKROOT = iphoneos; 542 | }; 543 | name = Debug; 544 | }; 545 | C01FCF5008A954540054247B /* Release */ = { 546 | isa = XCBuildConfiguration; 547 | buildSettings = { 548 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 549 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 550 | GCC_C_LANGUAGE_STANDARD = c99; 551 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 552 | GCC_WARN_UNUSED_VARIABLE = YES; 553 | IPHONEOS_DEPLOYMENT_TARGET = 4.0; 554 | SDKROOT = iphoneos; 555 | }; 556 | name = Release; 557 | }; 558 | /* End XCBuildConfiguration section */ 559 | 560 | /* Begin XCConfigurationList section */ 561 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "OpenFlowProject" */ = { 562 | isa = XCConfigurationList; 563 | buildConfigurations = ( 564 | 1D6058940D05DD3E006BFB54 /* Debug */, 565 | 1D6058950D05DD3E006BFB54 /* Release */, 566 | ); 567 | defaultConfigurationIsVisible = 0; 568 | defaultConfigurationName = Release; 569 | }; 570 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "OpenFlowProject" */ = { 571 | isa = XCConfigurationList; 572 | buildConfigurations = ( 573 | C01FCF4F08A954540054247B /* Debug */, 574 | C01FCF5008A954540054247B /* Release */, 575 | ); 576 | defaultConfigurationIsVisible = 0; 577 | defaultConfigurationName = Release; 578 | }; 579 | /* End XCConfigurationList section */ 580 | }; 581 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 582 | } 583 | --------------------------------------------------------------------------------