Skip to content
This repository
Browse code

GridView added

  • Loading branch information...
commit 657f91247b74265bf173569bd2647a41b2326051 0 parents
AliSoftware authored

Showing 26 changed files with 1,653 additions and 0 deletions. Show diff stats Hide diff stats

  1. +68 0 GridView.h
  2. +225 0 GridView.m
  3. +22 0 GridViewExample/Classes/GridViewExampleAppDelegate.h
  4. +40 0 GridViewExample/Classes/GridViewExampleAppDelegate.m
  5. +16 0 GridViewExample/Classes/GridViewExampleViewController.h
  6. +61 0 GridViewExample/Classes/GridViewExampleViewController.m
  7. +30 0 GridViewExample/GridViewExample-Info.plist
  8. +317 0 GridViewExample/GridViewExample.xcodeproj/project.pbxproj
  9. +391 0 GridViewExample/GridViewExampleViewController.xib
  10. +8 0 GridViewExample/GridViewExample_Prefix.pch
  11. +444 0 GridViewExample/MainWindow.xib
  12. BIN  GridViewExample/icons/browser-64x64.png
  13. BIN  GridViewExample/icons/calc-64x64.png
  14. BIN  GridViewExample/icons/chat-blank-64x64.png
  15. BIN  GridViewExample/icons/clock-64x64.png
  16. BIN  GridViewExample/icons/graph-64x64.png
  17. BIN  GridViewExample/icons/ipod-64x64.png
  18. BIN  GridViewExample/icons/mail-64x64.png
  19. BIN  GridViewExample/icons/map-64x64.png
  20. BIN  GridViewExample/icons/notes-64x64.png
  21. BIN  GridViewExample/icons/photo-64x64.png
  22. BIN  GridViewExample/icons/tools-64x64.png
  23. BIN  GridViewExample/icons/wallpaper-64x64.png
  24. BIN  GridViewExample/icons/weather-64x64.png
  25. +17 0 GridViewExample/main.m
  26. +14 0 README
68 GridView.h
... ... @@ -0,0 +1,68 @@
  1 +//
  2 +// GridView.h
  3 +// Clementine
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright 2010 AliSoftware. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +
  12 +/////////////////////////////////////////////////////////////////////////////
  13 +// MARK: -
  14 +// MARK: GridViewCell
  15 +/////////////////////////////////////////////////////////////////////////////
  16 +
  17 +@interface GridViewCell : UIView {
  18 + NSIndexPath* indexPath;
  19 + UIImageView* imageView;
  20 + UILabel* textLabel;
  21 +}
  22 +@property(nonatomic,retain) UIImageView* imageView;
  23 +@property(nonatomic,retain) UILabel* textLabel;
  24 +@end
  25 +
  26 +
  27 +
  28 +
  29 +/////////////////////////////////////////////////////////////////////////////
  30 +// MARK: -
  31 +// MARK: GridView
  32 +/////////////////////////////////////////////////////////////////////////////
  33 +
  34 +
  35 +@class GridView;
  36 +@protocol GridViewDataSource
  37 +-(NSUInteger)numberOfItemsInGridView:(GridView*)aGridView;
  38 +-(GridViewCell*)gridView:(GridView*)aGridView cellAtIndexPath:(NSIndexPath*)indexPath;
  39 +@end
  40 +
  41 +@protocol GridViewDelegate <NSObject>
  42 +@optional
  43 +-(void)gridView:(GridView*)aGridView willDisplayCell:(GridViewCell*)aCell forIndexPath:(NSIndexPath*)indexPath;
  44 +-(void)gridView:(GridView*)aGridView didSelectCellAtIndexPath:(NSIndexPath*)indexPath;
  45 +@end
  46 +
  47 +/////////////////////////////////////////////////////////////////////////////
  48 +
  49 +@interface GridView : UIScrollView {
  50 + id<GridViewDelegate> delegate;
  51 + id<GridViewDataSource> dataSource;
  52 +
  53 + NSUInteger columnsCount;
  54 + CGFloat rowHeight;
  55 + CGFloat marginWidth;
  56 + NSUInteger itemsCount;
  57 +
  58 + NSMutableSet* visibleCells;
  59 + NSMutableSet* recyclePool;
  60 +}
  61 +-(GridViewCell*)dequeueReusableCell;
  62 +-(void)reloadData;
  63 +@property(nonatomic,assign) id<GridViewDelegate> delegate;
  64 +@property(nonatomic,assign) id<GridViewDataSource> dataSource;
  65 +@property(nonatomic,assign) NSUInteger columnsCount;
  66 +@property(nonatomic,assign) CGFloat rowHeight;
  67 +@property(nonatomic,assign) CGFloat marginWidth;
  68 +@end
225 GridView.m
... ... @@ -0,0 +1,225 @@
  1 +//
  2 +// GridView.m
  3 +// Clementine
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright 2010 AliSoftware. All rights reserved.
  7 +//
  8 +
  9 +#import "GridView.h"
  10 +
  11 +/////////////////////////////////////////////////////////////////////////////
  12 +// MARK: -
  13 +// MARK: GridViewCell
  14 +/////////////////////////////////////////////////////////////////////////////
  15 +
  16 +@interface GridViewCell()
  17 +@property(nonatomic,retain) NSIndexPath* indexPath;
  18 +@end
  19 +
  20 +@implementation GridViewCell
  21 +@synthesize indexPath;
  22 +@synthesize imageView, textLabel;
  23 +
  24 +/////////////////////////////////////////////////////////////////////////////
  25 +// MARK: Init/Dealloc
  26 +
  27 +-(void)configure
  28 +{
  29 + imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
  30 + imageView.contentMode = UIViewContentModeScaleAspectFit;
  31 + [self addSubview:imageView];
  32 +
  33 + textLabel = [[UILabel alloc] initWithFrame:CGRectZero];
  34 + textLabel.textAlignment = UITextAlignmentCenter;
  35 + textLabel.backgroundColor = [UIColor clearColor];
  36 + [self addSubview:textLabel];
  37 +}
  38 +
  39 +-(id)initWithFrame:(CGRect)frame {
  40 + if ((self = [super initWithFrame:frame]) != nil) {
  41 + [self configure];
  42 + }
  43 + return self;
  44 +}
  45 +
  46 +- (id)initWithCoder:(NSCoder *)decoder {
  47 + if ((self = [super initWithCoder:decoder]) != nil) {
  48 + [self configure];
  49 + }
  50 + return self;
  51 +}
  52 +
  53 +-(void)dealloc {
  54 + [indexPath release];
  55 + [imageView release];
  56 + [textLabel release];
  57 + [super dealloc];
  58 +}
  59 +
  60 +/////////////////////////////////////////////////////////////////////////////
  61 +// MARK: Tiling & Touch Mgmt
  62 +
  63 +-(void)layoutSubviews {
  64 + const CGFloat kLabelHeight = 21;
  65 + CGRect r = CGRectInset(self.bounds,5,5);
  66 + r.size.height -= kLabelHeight;
  67 + imageView.frame = r;
  68 +
  69 + r = CGRectInset(self.bounds,5,5);
  70 + r.size.height = kLabelHeight;
  71 + r.origin.y = CGRectGetMaxY(imageView.frame);
  72 + textLabel.frame = r;
  73 +}
  74 +
  75 +-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  76 + GridView* gridView = (GridView*)self.superview;
  77 + if ([gridView.delegate respondsToSelector:@selector(gridView:didSelectCellAtIndexPath:)])
  78 + [gridView.delegate gridView:gridView didSelectCellAtIndexPath:self.indexPath];
  79 +}
  80 +
  81 +@end
  82 +
  83 +
  84 +
  85 +
  86 +
  87 +/////////////////////////////////////////////////////////////////////////////
  88 +// MARK: -
  89 +// MARK: GridView
  90 +/////////////////////////////////////////////////////////////////////////////
  91 +
  92 +@implementation GridView
  93 +@synthesize delegate, dataSource;
  94 +@synthesize columnsCount, rowHeight, marginWidth;
  95 +
  96 +/////////////////////////////////////////////////////////////////////////////
  97 +// MARK: Init/Dealloc
  98 +
  99 +-(void)configure {
  100 + visibleCells = [[NSMutableSet alloc] init];
  101 + recyclePool = [[NSMutableSet alloc] init];
  102 + columnsCount = 3;
  103 + rowHeight = 200.f;
  104 + marginWidth = 0.5f;
  105 + self.clipsToBounds = YES;
  106 +}
  107 +- (id) initWithCoder:(NSCoder*)aDecoder
  108 +{
  109 + self = [super initWithCoder:aDecoder];
  110 + if (self != nil) {
  111 + [self configure];
  112 + }
  113 + return self;
  114 +}
  115 +
  116 +- (id) initWithFrame:(CGRect)aFrame
  117 +{
  118 + self = [super initWithFrame:aFrame];
  119 + if (self != nil) {
  120 + [self configure];
  121 + }
  122 + return self;
  123 +}
  124 +
  125 +-(void)dealloc {
  126 + [visibleCells release];
  127 + [recyclePool release];
  128 + [super dealloc];
  129 +}
  130 +
  131 +-(void)willMoveToWindow:(UIWindow *)newWindow {
  132 + if (newWindow) [self reloadData];
  133 +}
  134 +
  135 +/////////////////////////////////////////////////////////////////////////////
  136 +// MARK: Loading & Tiling cells
  137 +
  138 +-(void)reloadData {
  139 + itemsCount = [self.dataSource numberOfItemsInGridView:self];
  140 + NSUInteger nbRows = (itemsCount>0) ? ((itemsCount-1) / columnsCount)+1 : 0;
  141 + self.contentSize = CGSizeMake(self.bounds.size.width, self.rowHeight*nbRows);
  142 + // remove all cells
  143 + for(UIView* v in visibleCells) {
  144 + [recyclePool addObject:v];
  145 + [v removeFromSuperview];
  146 + }
  147 + [visibleCells removeAllObjects];
  148 + // relayout and reload cells
  149 + [self setNeedsLayout];
  150 +}
  151 +
  152 +-(void)setColumnsCount:(NSUInteger)val {
  153 + [self willChangeValueForKey:@"columnsCount"];
  154 + columnsCount = val;
  155 + [self didChangeValueForKey:@"columnsCount"];
  156 + // as previous index paths for some columns may not be accessible anymore, we need to recreate it all
  157 + [self reloadData]; // this will relayout and recompute the contentSize too
  158 +}
  159 +
  160 +-(void)setRowHeight:(CGFloat)val {
  161 + [self willChangeValueForKey:@"rowHeight"];
  162 + rowHeight = val;
  163 + [self setNeedsLayout]; // no need to reload all data, only relayout.
  164 + [self didChangeValueForKey:@"rowHeight"];
  165 +}
  166 +
  167 +/////////////////////////////////////////////////////////////////////////////
  168 +
  169 +-(GridViewCell*)dequeueReusableCell {
  170 + id obj = [recyclePool anyObject];
  171 + if (obj) {
  172 + [[obj retain] autorelease];
  173 + [recyclePool removeObject:obj];
  174 + }
  175 + return obj;
  176 +}
  177 +
  178 +-(GridViewCell*)visibleCellForIndexPath:(NSIndexPath*)indexPath {
  179 + for(GridViewCell* cell in visibleCells) {
  180 + if (cell.indexPath == indexPath) {
  181 + return cell;
  182 + }
  183 + }
  184 + return nil;
  185 +}
  186 +
  187 +-(void)layoutSubviews
  188 +{
  189 + // remove cells that are no longer visible
  190 + for(UIView* v in visibleCells) {
  191 + if (!CGRectIntersectsRect(v.frame, self.bounds)) {
  192 + [recyclePool addObject:v];
  193 + [v removeFromSuperview];
  194 + }
  195 + }
  196 + [visibleCells minusSet:recyclePool];
  197 +
  198 + if (itemsCount==0) return;
  199 +
  200 + // tile missing cells
  201 + NSUInteger firstRow = floorf( CGRectGetMinY(self.bounds) / rowHeight );
  202 + firstRow = MAX(firstRow,0);
  203 + NSUInteger lastRow = floorf( (CGRectGetMaxY(self.bounds)-1) / rowHeight ) + 1;
  204 + NSUInteger totalNumRows = (itemsCount>0) ? ((itemsCount-1) / columnsCount)+1 : 0;
  205 + lastRow = MIN(lastRow, totalNumRows);
  206 + CGFloat w = self.bounds.size.width / columnsCount;
  207 + for(int row = firstRow; row<lastRow; ++row) {
  208 + for (NSUInteger col= 0; col < self.columnsCount; ++col) {
  209 + if (row*columnsCount+col>=itemsCount) return;
  210 + NSIndexPath* path = [NSIndexPath indexPathForRow:row inSection:col];
  211 + GridViewCell* cell = [self visibleCellForIndexPath:path];
  212 + if (!cell) {
  213 + cell = [self.dataSource gridView:self cellAtIndexPath:path];
  214 + cell.indexPath = path;
  215 + [visibleCells addObject:cell];
  216 + [self addSubview:cell];
  217 + }
  218 + cell.frame = CGRectInset( CGRectMake(col*w,row*rowHeight,w,rowHeight) , marginWidth,marginWidth);
  219 + if ([self.delegate respondsToSelector:@selector(gridView:willDisplayCell:forIndexPath:)])
  220 + [self.delegate gridView:self willDisplayCell:cell forIndexPath:path];
  221 + }
  222 + }
  223 +}
  224 +
  225 +@end
22 GridViewExample/Classes/GridViewExampleAppDelegate.h
... ... @@ -0,0 +1,22 @@
  1 +//
  2 +// GridViewExampleAppDelegate.h
  3 +// GridViewExample
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright AliSoftware 2010. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +@class GridViewExampleViewController;
  12 +
  13 +@interface GridViewExampleAppDelegate : NSObject <UIApplicationDelegate> {
  14 + UIWindow *window;
  15 + GridViewExampleViewController *viewController;
  16 +}
  17 +
  18 +@property (nonatomic, retain) IBOutlet UIWindow *window;
  19 +@property (nonatomic, retain) IBOutlet GridViewExampleViewController *viewController;
  20 +
  21 +@end
  22 +
40 GridViewExample/Classes/GridViewExampleAppDelegate.m
... ... @@ -0,0 +1,40 @@
  1 +//
  2 +// GridViewExampleAppDelegate.m
  3 +// GridViewExample
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright AliSoftware 2010. All rights reserved.
  7 +//
  8 +
  9 +#import "GridViewExampleAppDelegate.h"
  10 +#import "GridViewExampleViewController.h"
  11 +
  12 +@implementation GridViewExampleAppDelegate
  13 +
  14 +@synthesize window;
  15 +@synthesize viewController;
  16 +
  17 +
  18 +#pragma mark -
  19 +#pragma mark Application lifecycle
  20 +
  21 +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  22 +
  23 + // Override point for customization after application launch.
  24 +
  25 + // Add the view controller's view to the window and display.
  26 + [window addSubview:viewController.view];
  27 + [window makeKeyAndVisible];
  28 +
  29 + return YES;
  30 +}
  31 +
  32 +
  33 +- (void)dealloc {
  34 + [viewController release];
  35 + [window release];
  36 + [super dealloc];
  37 +}
  38 +
  39 +
  40 +@end
16 GridViewExample/Classes/GridViewExampleViewController.h
... ... @@ -0,0 +1,16 @@
  1 +//
  2 +// GridViewExampleViewController.h
  3 +// GridViewExample
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright AliSoftware 2010. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +#import "GridView.h"
  11 +
  12 +@interface GridViewExampleViewController : UIViewController <GridViewDelegate, GridViewDataSource> {
  13 + NSArray* items;
  14 +}
  15 +@end
  16 +
61 GridViewExample/Classes/GridViewExampleViewController.m
... ... @@ -0,0 +1,61 @@
  1 +//
  2 +// GridViewExampleViewController.m
  3 +// GridViewExample
  4 +//
  5 +// Created by Olivier on 02/09/10.
  6 +// Copyright AliSoftware 2010. All rights reserved.
  7 +//
  8 +
  9 +#import "GridViewExampleViewController.h"
  10 +
  11 +@implementation GridViewExampleViewController
  12 +
  13 +-(void)viewDidLoad {
  14 + // Images are courtesy of http://www.iconspedia.com/pack/iphone/
  15 + items = [[NSArray alloc] initWithObjects:
  16 + @"browser",@"calc",@"chat-blank",@"clock",@"graph",@"ipod",
  17 + @"mail",@"map",@"notes",@"photo",@"tools",@"wallpaper",@"weather",
  18 + nil];
  19 +
  20 + ((GridView*)self.view).rowHeight = 100;
  21 + ((GridView*)self.view).columnsCount = 2;
  22 +}
  23 +
  24 +-(NSUInteger)numberOfItemsInGridView:(GridView *)aGridView {
  25 + return [items count];
  26 +}
  27 +-(GridViewCell*)gridView:(GridView *)aGridView cellAtIndexPath:(NSIndexPath *)indexPath {
  28 + GridViewCell* cell = [aGridView dequeueReusableCell];
  29 + if (!cell) {
  30 + cell = [[[GridViewCell alloc] initWithFrame:CGRectZero] autorelease];
  31 + cell.backgroundColor = [UIColor grayColor];
  32 + }
  33 +
  34 + NSUInteger i = indexPath.section + aGridView.columnsCount*indexPath.row;
  35 + NSString* itemName = [items objectAtIndex:i];
  36 + cell.textLabel.text = itemName;
  37 + cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-64x64.png",itemName]];
  38 +
  39 + return cell;
  40 +}
  41 +-(void)gridView:(GridView *)aGridView didSelectCellAtIndexPath:(NSIndexPath *)indexPath {
  42 + NSUInteger idx = indexPath.section + aGridView.columnsCount*indexPath.row;
  43 + NSString* msg = [items objectAtIndex:idx];
  44 + UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Tap" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  45 + [alert show];
  46 + [alert release];
  47 +}
  48 +
  49 +-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
  50 + return YES;
  51 +}
  52 +- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
  53 + ((GridView*)self.view).columnsCount = UIInterfaceOrientationIsPortrait(interfaceOrientation) ? 2 : 4;
  54 +}
  55 +
  56 +-(void)viewDidUnload {
  57 + [items release];
  58 + items = nil;
  59 +}
  60 +
  61 +@end
30 GridViewExample/GridViewExample-Info.plist
... ... @@ -0,0 +1,30 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>English</string>
  7 + <key>CFBundleDisplayName</key>
  8 + <string>${PRODUCT_NAME}</string>
  9 + <key>CFBundleExecutable</key>
  10 + <string>${EXECUTABLE_NAME}</string>
  11 + <key>CFBundleIconFile</key>
  12 + <string></string>
  13 + <key>CFBundleIdentifier</key>
  14 + <string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
  15 + <key>CFBundleInfoDictionaryVersion</key>
  16 + <string>6.0</string>
  17 + <key>CFBundleName</key>
  18 + <string>${PRODUCT_NAME}</string>
  19 + <key>CFBundlePackageType</key>
  20 + <string>APPL</string>
  21 + <key>CFBundleSignature</key>
  22 + <string>????</string>
  23 + <key>CFBundleVersion</key>
  24 + <string>1.0</string>
  25 + <key>LSRequiresIPhoneOS</key>
  26 + <true/>
  27 + <key>NSMainNibFile</key>
  28 + <string>MainWindow</string>
  29 +</dict>
  30 +</plist>
317 GridViewExample/GridViewExample.xcodeproj/project.pbxproj
... ... @@ -0,0 +1,317 @@
  1 +// !$*UTF8*$!
  2 +{
  3 + archiveVersion = 1;
  4 + classes = {
  5 + };
  6 + objectVersion = 45;
  7 + objects = {
  8 +
  9 +/* Begin PBXBuildFile section */
  10 + 098D565B12301E6D0055E596 /* GridView.m in Sources */ = {isa = PBXBuildFile; fileRef = 098D565A12301E6D0055E596 /* GridView.m */; };
  11 + 098D566A123022DA0055E596 /* browser-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D565D123022DA0055E596 /* browser-64x64.png */; };
  12 + 098D566B123022DA0055E596 /* calc-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D565E123022DA0055E596 /* calc-64x64.png */; };
  13 + 098D566C123022DA0055E596 /* chat-blank-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D565F123022DA0055E596 /* chat-blank-64x64.png */; };
  14 + 098D566D123022DA0055E596 /* clock-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5660123022DA0055E596 /* clock-64x64.png */; };
  15 + 098D566E123022DA0055E596 /* graph-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5661123022DA0055E596 /* graph-64x64.png */; };
  16 + 098D566F123022DA0055E596 /* ipod-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5662123022DA0055E596 /* ipod-64x64.png */; };
  17 + 098D5670123022DA0055E596 /* mail-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5663123022DA0055E596 /* mail-64x64.png */; };
  18 + 098D5671123022DA0055E596 /* map-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5664123022DA0055E596 /* map-64x64.png */; };
  19 + 098D5672123022DA0055E596 /* notes-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5665123022DA0055E596 /* notes-64x64.png */; };
  20 + 098D5673123022DA0055E596 /* photo-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5666123022DA0055E596 /* photo-64x64.png */; };
  21 + 098D5674123022DA0055E596 /* tools-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5667123022DA0055E596 /* tools-64x64.png */; };
  22 + 098D5675123022DA0055E596 /* wallpaper-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5668123022DA0055E596 /* wallpaper-64x64.png */; };
  23 + 098D5676123022DA0055E596 /* weather-64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 098D5669123022DA0055E596 /* weather-64x64.png */; };
  24 + 1D3623260D0F684500981E51 /* GridViewExampleAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* GridViewExampleAppDelegate.m */; };
  25 + 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
  26 + 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
  27 + 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
  28 + 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
  29 + 2899E5220DE3E06400AC0155 /* GridViewExampleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* GridViewExampleViewController.xib */; };
  30 + 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
  31 + 28D7ACF80DDB3853001CB0EB /* GridViewExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* GridViewExampleViewController.m */; };
  32 +/* End PBXBuildFile section */
  33 +
  34 +/* Begin PBXFileReference section */
  35 + 098D565912301E6D0055E596 /* GridView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GridView.h; path = ../GridView.h; sourceTree = SOURCE_ROOT; };
  36 + 098D565A12301E6D0055E596 /* GridView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GridView.m; path = ../GridView.m; sourceTree = SOURCE_ROOT; };
  37 + 098D565D123022DA0055E596 /* browser-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "browser-64x64.png"; sourceTree = "<group>"; };
  38 + 098D565E123022DA0055E596 /* calc-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "calc-64x64.png"; sourceTree = "<group>"; };
  39 + 098D565F123022DA0055E596 /* chat-blank-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat-blank-64x64.png"; sourceTree = "<group>"; };
  40 + 098D5660123022DA0055E596 /* clock-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "clock-64x64.png"; sourceTree = "<group>"; };
  41 + 098D5661123022DA0055E596 /* graph-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "graph-64x64.png"; sourceTree = "<group>"; };
  42 + 098D5662123022DA0055E596 /* ipod-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ipod-64x64.png"; sourceTree = "<group>"; };
  43 + 098D5663123022DA0055E596 /* mail-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mail-64x64.png"; sourceTree = "<group>"; };
  44 + 098D5664123022DA0055E596 /* map-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map-64x64.png"; sourceTree = "<group>"; };
  45 + 098D5665123022DA0055E596 /* notes-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "notes-64x64.png"; sourceTree = "<group>"; };
  46 + 098D5666123022DA0055E596 /* photo-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "photo-64x64.png"; sourceTree = "<group>"; };
  47 + 098D5667123022DA0055E596 /* tools-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tools-64x64.png"; sourceTree = "<group>"; };
  48 + 098D5668123022DA0055E596 /* wallpaper-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wallpaper-64x64.png"; sourceTree = "<group>"; };
  49 + 098D5669123022DA0055E596 /* weather-64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "weather-64x64.png"; sourceTree = "<group>"; };
  50 + 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
  51 + 1D3623240D0F684500981E51 /* GridViewExampleAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridViewExampleAppDelegate.h; sourceTree = "<group>"; };
  52 + 1D3623250D0F684500981E51 /* GridViewExampleAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridViewExampleAppDelegate.m; sourceTree = "<group>"; };
  53 + 1D6058910D05DD3D006BFB54 /* GridViewExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GridViewExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
  54 + 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
  55 + 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
  56 + 2899E5210DE3E06400AC0155 /* GridViewExampleViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GridViewExampleViewController.xib; sourceTree = "<group>"; };
  57 + 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
  58 + 28D7ACF60DDB3853001CB0EB /* GridViewExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridViewExampleViewController.h; sourceTree = "<group>"; };
  59 + 28D7ACF70DDB3853001CB0EB /* GridViewExampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridViewExampleViewController.m; sourceTree = "<group>"; };
  60 + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
  61 + 32CA4F630368D1EE00C91783 /* GridViewExample_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridViewExample_Prefix.pch; sourceTree = "<group>"; };
  62 + 8D1107310486CEB800E47090 /* GridViewExample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GridViewExample-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
  63 +/* End PBXFileReference section */
  64 +
  65 +/* Begin PBXFrameworksBuildPhase section */
  66 + 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
  67 + isa = PBXFrameworksBuildPhase;
  68 + buildActionMask = 2147483647;
  69 + files = (
  70 + 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
  71 + 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
  72 + 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */,
  73 + );
  74 + runOnlyForDeploymentPostprocessing = 0;
  75 + };
  76 +/* End PBXFrameworksBuildPhase section */
  77 +
  78 +/* Begin PBXGroup section */
  79 + 080E96DDFE201D6D7F000001 /* Classes */ = {
  80 + isa = PBXGroup;
  81 + children = (
  82 + 1D3623240D0F684500981E51 /* GridViewExampleAppDelegate.h */,
  83 + 1D3623250D0F684500981E51 /* GridViewExampleAppDelegate.m */,
  84 + 28D7ACF60DDB3853001CB0EB /* GridViewExampleViewController.h */,
  85 + 28D7ACF70DDB3853001CB0EB /* GridViewExampleViewController.m */,
  86 + 098D565912301E6D0055E596 /* GridView.h */,
  87 + 098D565A12301E6D0055E596 /* GridView.m */,
  88 + );
  89 + path = Classes;
  90 + sourceTree = "<group>";
  91 + };
  92 + 098D565C123022DA0055E596 /* icons */ = {
  93 + isa = PBXGroup;
  94 + children = (
  95 + 098D565D123022DA0055E596 /* browser-64x64.png */,
  96 + 098D565E123022DA0055E596 /* calc-64x64.png */,
  97 + 098D565F123022DA0055E596 /* chat-blank-64x64.png */,
  98 + 098D5660123022DA0055E596 /* clock-64x64.png */,
  99 + 098D5661123022DA0055E596 /* graph-64x64.png */,
  100 + 098D5662123022DA0055E596 /* ipod-64x64.png */,
  101 + 098D5663123022DA0055E596 /* mail-64x64.png */,
  102 + 098D5664123022DA0055E596 /* map-64x64.png */,
  103 + 098D5665123022DA0055E596 /* notes-64x64.png */,
  104 + 098D5666123022DA0055E596 /* photo-64x64.png */,
  105 + 098D5667123022DA0055E596 /* tools-64x64.png */,
  106 + 098D5668123022DA0055E596 /* wallpaper-64x64.png */,
  107 + 098D5669123022DA0055E596 /* weather-64x64.png */,
  108 + );
  109 + path = icons;
  110 + sourceTree = "<group>";
  111 + };
  112 + 19C28FACFE9D520D11CA2CBB /* Products */ = {
  113 + isa = PBXGroup;
  114 + children = (
  115 + 1D6058910D05DD3D006BFB54 /* GridViewExample.app */,
  116 + );
  117 + name = Products;
  118 + sourceTree = "<group>";
  119 + };
  120 + 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
  121 + isa = PBXGroup;
  122 + children = (
  123 + 080E96DDFE201D6D7F000001 /* Classes */,
  124 + 29B97315FDCFA39411CA2CEA /* Other Sources */,
  125 + 29B97317FDCFA39411CA2CEA /* Resources */,
  126 + 29B97323FDCFA39411CA2CEA /* Frameworks */,
  127 + 19C28FACFE9D520D11CA2CBB /* Products */,
  128 + );
  129 + name = CustomTemplate;
  130 + sourceTree = "<group>";
  131 + };
  132 + 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
  133 + isa = PBXGroup;
  134 + children = (
  135 + 32CA4F630368D1EE00C91783 /* GridViewExample_Prefix.pch */,
  136 + 29B97316FDCFA39411CA2CEA /* main.m */,
  137 + );
  138 + name = "Other Sources";
  139 + sourceTree = "<group>";
  140 + };
  141 + 29B97317FDCFA39411CA2CEA /* Resources */ = {
  142 + isa = PBXGroup;
  143 + children = (
  144 + 2899E5210DE3E06400AC0155 /* GridViewExampleViewController.xib */,
  145 + 28AD733E0D9D9553002E5188 /* MainWindow.xib */,
  146 + 098D565C123022DA0055E596 /* icons */,
  147 + 8D1107310486CEB800E47090 /* GridViewExample-Info.plist */,
  148 + );
  149 + name = Resources;
  150 + sourceTree = "<group>";
  151 + };
  152 + 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
  153 + isa = PBXGroup;
  154 + children = (
  155 + 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
  156 + 1D30AB110D05D00D00671497 /* Foundation.framework */,
  157 + 288765A40DF7441C002DB57D /* CoreGraphics.framework */,
  158 + );
  159 + name = Frameworks;
  160 + sourceTree = "<group>";
  161 + };
  162 +/* End PBXGroup section */
  163 +
  164 +/* Begin PBXNativeTarget section */
  165 + 1D6058900D05DD3D006BFB54 /* GridViewExample */ = {
  166 + isa = PBXNativeTarget;
  167 + buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GridViewExample" */;
  168 + buildPhases = (
  169 + 1D60588D0D05DD3D006BFB54 /* Resources */,
  170 + 1D60588E0D05DD3D006BFB54 /* Sources */,
  171 + 1D60588F0D05DD3D006BFB54 /* Frameworks */,
  172 + );
  173 + buildRules = (
  174 + );
  175 + dependencies = (
  176 + );
  177 + name = GridViewExample;
  178 + productName = GridViewExample;
  179 + productReference = 1D6058910D05DD3D006BFB54 /* GridViewExample.app */;
  180 + productType = "com.apple.product-type.application";
  181 + };
  182 +/* End PBXNativeTarget section */
  183 +
  184 +/* Begin PBXProject section */
  185 + 29B97313FDCFA39411CA2CEA /* Project object */ = {
  186 + isa = PBXProject;
  187 + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GridViewExample" */;
  188 + compatibilityVersion = "Xcode 3.1";
  189 + hasScannedForEncodings = 1;
  190 + mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
  191 + projectDirPath = "";
  192 + projectRoot = "";
  193 + targets = (
  194 + 1D6058900D05DD3D006BFB54 /* GridViewExample */,
  195 + );
  196 + };
  197 +/* End PBXProject section */
  198 +
  199 +/* Begin PBXResourcesBuildPhase section */
  200 + 1D60588D0D05DD3D006BFB54 /* Resources */ = {
  201 + isa = PBXResourcesBuildPhase;
  202 + buildActionMask = 2147483647;
  203 + files = (
  204 + 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */,
  205 + 2899E5220DE3E06400AC0155 /* GridViewExampleViewController.xib in Resources */,
  206 + 098D566A123022DA0055E596 /* browser-64x64.png in Resources */,
  207 + 098D566B123022DA0055E596 /* calc-64x64.png in Resources */,
  208 + 098D566C123022DA0055E596 /* chat-blank-64x64.png in Resources */,
  209 + 098D566D123022DA0055E596 /* clock-64x64.png in Resources */,
  210 + 098D566E123022DA0055E596 /* graph-64x64.png in Resources */,
  211 + 098D566F123022DA0055E596 /* ipod-64x64.png in Resources */,
  212 + 098D5670123022DA0055E596 /* mail-64x64.png in Resources */,
  213 + 098D5671123022DA0055E596 /* map-64x64.png in Resources */,
  214 + 098D5672123022DA0055E596 /* notes-64x64.png in Resources */,
  215 + 098D5673123022DA0055E596 /* photo-64x64.png in Resources */,
  216 + 098D5674123022DA0055E596 /* tools-64x64.png in Resources */,
  217 + 098D5675123022DA0055E596 /* wallpaper-64x64.png in Resources */,
  218 + 098D5676123022DA0055E596 /* weather-64x64.png in Resources */,
  219 + );
  220 + runOnlyForDeploymentPostprocessing = 0;
  221 + };
  222 +/* End PBXResourcesBuildPhase section */
  223 +
  224 +/* Begin PBXSourcesBuildPhase section */
  225 + 1D60588E0D05DD3D006BFB54 /* Sources */ = {
  226 + isa = PBXSourcesBuildPhase;
  227 + buildActionMask = 2147483647;
  228 + files = (
  229 + 1D60589B0D05DD56006BFB54 /* main.m in Sources */,
  230 + 1D3623260D0F684500981E51 /* GridViewExampleAppDelegate.m in Sources */,
  231 + 28D7ACF80DDB3853001CB0EB /* GridViewExampleViewController.m in Sources */,
  232 + 098D565B12301E6D0055E596 /* GridView.m in Sources */,
  233 + );
  234 + runOnlyForDeploymentPostprocessing = 0;
  235 + };
  236 +/* End PBXSourcesBuildPhase section */
  237 +
  238 +/* Begin XCBuildConfiguration section */
  239 + 1D6058940D05DD3E006BFB54 /* Debug */ = {
  240 + isa = XCBuildConfiguration;
  241 + buildSettings = {
  242 + ALWAYS_SEARCH_USER_PATHS = NO;
  243 + COPY_PHASE_STRIP = NO;
  244 + GCC_DYNAMIC_NO_PIC = NO;
  245 + GCC_OPTIMIZATION_LEVEL = 0;
  246 + GCC_PRECOMPILE_PREFIX_HEADER = YES;
  247 + GCC_PREFIX_HEADER = GridViewExample_Prefix.pch;
  248 + INFOPLIST_FILE = "GridViewExample-Info.plist";
  249 + PRODUCT_NAME = GridViewExample;
  250 + };
  251 + name = Debug;
  252 + };
  253 + 1D6058950D05DD3E006BFB54 /* Release */ = {
  254 + isa = XCBuildConfiguration;
  255 + buildSettings = {
  256 + ALWAYS_SEARCH_USER_PATHS = NO;
  257 + COPY_PHASE_STRIP = YES;
  258 + GCC_PRECOMPILE_PREFIX_HEADER = YES;
  259 + GCC_PREFIX_HEADER = GridViewExample_Prefix.pch;
  260 + INFOPLIST_FILE = "GridViewExample-Info.plist";
  261 + PRODUCT_NAME = GridViewExample;
  262 + VALIDATE_PRODUCT = YES;
  263 + };
  264 + name = Release;
  265 + };
  266 + C01FCF4F08A954540054247B /* Debug */ = {
  267 + isa = XCBuildConfiguration;
  268 + buildSettings = {
  269 + ARCHS = "$(ARCHS_STANDARD_32_BIT)";
  270 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  271 + GCC_C_LANGUAGE_STANDARD = c99;
  272 + GCC_WARN_ABOUT_RETURN_TYPE = YES;
  273 + GCC_WARN_UNUSED_VARIABLE = YES;
  274 + PREBINDING = NO;
  275 + SDKROOT = iphoneos4.0;
  276 + };
  277 + name = Debug;
  278 + };
  279 + C01FCF5008A954540054247B /* Release */ = {
  280 + isa = XCBuildConfiguration;
  281 + buildSettings = {
  282 + ARCHS = "$(ARCHS_STANDARD_32_BIT)";
  283 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  284 + GCC_C_LANGUAGE_STANDARD = c99;
  285 + GCC_WARN_ABOUT_RETURN_TYPE = YES;
  286 + GCC_WARN_UNUSED_VARIABLE = YES;
  287 + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
  288 + PREBINDING = NO;
  289 + SDKROOT = iphoneos4.0;
  290 + };
  291 + name = Release;
  292 + };
  293 +/* End XCBuildConfiguration section */
  294 +
  295 +/* Begin XCConfigurationList section */
  296 + 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GridViewExample" */ = {
  297 + isa = XCConfigurationList;
  298 + buildConfigurations = (
  299 + 1D6058940D05DD3E006BFB54 /* Debug */,
  300 + 1D6058950D05DD3E006BFB54 /* Release */,
  301 + );
  302 + defaultConfigurationIsVisible = 0;
  303 + defaultConfigurationName = Release;
  304 + };
  305 + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GridViewExample" */ = {
  306 + isa = XCConfigurationList;
  307 + buildConfigurations = (
  308 + C01FCF4F08A954540054247B /* Debug */,
  309 + C01FCF5008A954540054247B /* Release */,
  310 + );
  311 + defaultConfigurationIsVisible = 0;
  312 + defaultConfigurationName = Release;
  313 + };
  314 +/* End XCConfigurationList section */
  315 + };
  316 + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
  317 +}
391 GridViewExample/GridViewExampleViewController.xib
... ... @@ -0,0 +1,391 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
  3 + <data>
  4 + <int key="IBDocument.SystemTarget">1024</int>
  5 + <string key="IBDocument.SystemVersion">10F569</string>
  6 + <string key="IBDocument.InterfaceBuilderVersion">788</string>
  7 + <string key="IBDocument.AppKitVersion">1038.29</string>
  8 + <string key="IBDocument.HIToolboxVersion">461.00</string>
  9 + <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
  10 + <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
  11 + <string key="NS.object.0">117</string>
  12 + </object>
  13 + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
  14 + <bool key="EncodedWithXMLCoder">YES</bool>
  15 + <integer value="6"/>
  16 + </object>
  17 + <object class="NSArray" key="IBDocument.PluginDependencies">
  18 + <bool key="EncodedWithXMLCoder">YES</bool>
  19 + <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
  20 + </object>
  21 + <object class="NSMutableDictionary" key="IBDocument.Metadata">
  22 + <bool key="EncodedWithXMLCoder">YES</bool>
  23 + <object class="NSArray" key="dict.sortedKeys" id="0">
  24 + <bool key="EncodedWithXMLCoder">YES</bool>
  25 + </object>
  26 + <object class="NSMutableArray" key="dict.values">
  27 + <bool key="EncodedWithXMLCoder">YES</bool>
  28 + </object>
  29 + </object>
  30 + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
  31 + <bool key="EncodedWithXMLCoder">YES</bool>
  32 + <object class="IBProxyObject" id="372490531">
  33 + <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
  34 + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
  35 + </object>
  36 + <object class="IBProxyObject" id="843779117">
  37 + <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
  38 + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
  39 + </object>
  40 + <object class="IBUIView" id="774585933">
  41 + <reference key="NSNextResponder"/>
  42 + <int key="NSvFlags">274</int>
  43 + <string key="NSFrameSize">{320, 460}</string>
  44 + <reference key="NSSuperview"/>
  45 + <object class="NSColor" key="IBUIBackgroundColor">
  46 + <int key="NSColorSpace">3</int>
  47 + <bytes key="NSWhite">MC43NQA</bytes>
  48 + <object class="NSColorSpace" key="NSCustomColorSpace">
  49 + <int key="NSID">2</int>
  50 + </object>
  51 + </object>
  52 + <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
  53 + <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
  54 + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
  55 + </object>
  56 + </object>
  57 + <object class="IBObjectContainer" key="IBDocument.Objects">
  58 + <object class="NSMutableArray" key="connectionRecords">
  59 + <bool key="EncodedWithXMLCoder">YES</bool>
  60 + <object class="IBConnectionRecord">
  61 + <object class="IBCocoaTouchOutletConnection" key="connection">
  62 + <string key="label">view</string>
  63 + <reference key="source" ref="372490531"/>
  64 + <reference key="destination" ref="774585933"/>
  65 + </object>
  66 + <int key="connectionID">7</int>
  67 + </object>
  68 + <object class="IBConnectionRecord">
  69 + <object class="IBCocoaTouchOutletConnection" key="connection">
  70 + <string key="label">dataSource</string>
  71 + <reference key="source" ref="774585933"/>
  72 + <reference key="destination" ref="372490531"/>
  73 + </object>
  74 + <int key="connectionID">8</int>
  75 + </object>
  76 + <object class="IBConnectionRecord">
  77 + <object class="IBCocoaTouchOutletConnection" key="connection">
  78 + <string key="label">delegate</string>
  79 + <reference key="source" ref="774585933"/>
  80 + <reference key="destination" ref="372490531"/>
  81 + </object>
  82 + <int key="connectionID">9</int>
  83 + </object>
  84 + </object>
  85 + <object class="IBMutableOrderedSet" key="objectRecords">
  86 + <object class="NSArray" key="orderedObjects">
  87 + <bool key="EncodedWithXMLCoder">YES</bool>
  88 + <object class="IBObjectRecord">
  89 + <int key="objectID">0</int>
  90 + <reference key="object" ref="0"/>
  91 + <reference key="children" ref="1000"/>
  92 + <nil key="parent"/>
  93 + </object>
  94 + <object class="IBObjectRecord">
  95 + <int key="objectID">-1</int>
  96 + <reference key="object" ref="372490531"/>
  97 + <reference key="parent" ref="0"/>
  98 + <string key="objectName">File's Owner</string>
  99 + </object>
  100 + <object class="IBObjectRecord">
  101 + <int key="objectID">-2</int>
  102 + <reference key="object" ref="843779117"/>
  103 + <reference key="parent" ref="0"/>
  104 + </object>
  105 + <object class="IBObjectRecord">
  106 + <int key="objectID">6</int>
  107 + <reference key="object" ref="774585933"/>
  108 + <reference key="parent" ref="0"/>
  109 + </object>
  110 + </object>
  111 + </object>
  112 + <object class="NSMutableDictionary" key="flattenedProperties">
  113 + <bool key="EncodedWithXMLCoder">YES</bool>
  114 + <object class="NSArray" key="dict.sortedKeys">
  115 + <bool key="EncodedWithXMLCoder">YES</bool>
  116 + <string>-1.CustomClassName</string>
  117 + <string>-2.CustomClassName</string>
  118 + <string>6.CustomClassName</string>
  119 + <string>6.IBEditorWindowLastContentRect</string>
  120 + <string>6.IBPluginDependency</string>
  121 + </object>
  122 + <object class="NSMutableArray" key="dict.values">
  123 + <bool key="EncodedWithXMLCoder">YES</bool>
  124 + <string>GridViewExampleViewController</string>
  125 + <string>UIResponder</string>
  126 + <string>GridView</string>
  127 + <string>{{239, 376}, {320, 480}}</string>
  128 + <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
  129 + </object>
  130 + </object>
  131 + <object class="NSMutableDictionary" key="unlocalizedProperties">
  132 + <bool key="EncodedWithXMLCoder">YES</bool>
  133 + <reference key="dict.sortedKeys" ref="0"/>
  134 + <object class="NSMutableArray" key="dict.values">
  135 + <bool key="EncodedWithXMLCoder">YES</bool>
  136 + </object>
  137 + </object>
  138 + <nil key="activeLocalization"/>
  139 + <object class="NSMutableDictionary" key="localizations">
  140 + <bool key="EncodedWithXMLCoder">YES</bool>
  141 + <reference key="dict.sortedKeys" ref="0"/>
  142 + <object class="NSMutableArray" key="dict.values">
  143 + <bool key="EncodedWithXMLCoder">YES</bool>
  144 + </object>
  145 + </object>
  146 + <nil key="sourceID"/>
  147 + <int key="maxID">9</int>
  148 + </object>
  149 + <object class="IBClassDescriber" key="IBDocument.Classes">
  150 + <object class="NSMutableArray" key="referencedPartialClassDescriptions">
  151 + <bool key="EncodedWithXMLCoder">YES</bool>
  152 + <object class="IBPartialClassDescription">
  153 + <string key="className">GridView</string>
  154 + <string key="superclassName">UIScrollView</string>
  155 + <object class="NSMutableDictionary" key="outlets">
  156 + <bool key="EncodedWithXMLCoder">YES</bool>
  157 + <object class="NSArray" key="dict.sortedKeys">
  158 + <bool key="EncodedWithXMLCoder">YES</bool>
  159 + <string>dataSource</string>
  160 + <string>delegate</string>
  161 + </object>
  162 + <object class="NSMutableArray" key="dict.values">
  163 + <bool key="EncodedWithXMLCoder">YES</bool>
  164 + <string>id</string>
  165 + <string>id</string>
  166 + </object>
  167 + </object>
  168 + <object class="NSMutableDictionary" key="toOneOutletInfosByName">
  169 + <bool key="EncodedWithXMLCoder">YES</bool>
  170 + <object class="NSArray" key="dict.sortedKeys">
  171 + <bool key="EncodedWithXMLCoder">YES</bool>
  172 + <string>dataSource</string>
  173 + <string>delegate</string>
  174 + </object>
  175 + <object class="NSMutableArray" key="dict.values">
  176 + <bool key="EncodedWithXMLCoder">YES</bool>
  177 + <object class="IBToOneOutletInfo">
  178 + <string key="name">dataSource</string>
  179 + <string key="candidateClassName">id</string>
  180 + </object>
  181 + <object class="IBToOneOutletInfo">
  182 + <string key="name">delegate</string>
  183 + <string key="candidateClassName">id</string>
  184 + </object>
  185 + </object>
  186 + </object>
  187 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  188 + <string key="majorKey">IBProjectSource</string>
  189 + <string key="minorKey">../GridView.h</string>
  190 + </object>
  191 + </object>
  192 + <object class="IBPartialClassDescription">
  193 + <string key="className">GridViewExampleViewController</string>
  194 + <string key="superclassName">UIViewController</string>
  195 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  196 + <string key="majorKey">IBProjectSource</string>
  197 + <string key="minorKey">Classes/GridViewExampleViewController.h</string>
  198 + </object>
  199 + </object>
  200 + </object>
  201 + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
  202 + <bool key="EncodedWithXMLCoder">YES</bool>
  203 + <object class="IBPartialClassDescription">
  204 + <string key="className">NSObject</string>
  205 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  206 + <string key="majorKey">IBFrameworkSource</string>
  207 + <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
  208 + </object>
  209 + </object>
  210 + <object class="IBPartialClassDescription">
  211 + <string key="className">NSObject</string>
  212 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  213 + <string key="majorKey">IBFrameworkSource</string>
  214 + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
  215 + </object>
  216 + </object>
  217 + <object class="IBPartialClassDescription">
  218 + <string key="className">NSObject</string>
  219 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  220 + <string key="majorKey">IBFrameworkSource</string>
  221 + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
  222 + </object>
  223 + </object>
  224 + <object class="IBPartialClassDescription">
  225 + <string key="className">NSObject</string>
  226 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  227 + <string key="majorKey">IBFrameworkSource</string>
  228 + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
  229 + </object>
  230 + </object>
  231 + <object class="IBPartialClassDescription">
  232 + <string key="className">NSObject</string>
  233 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  234 + <string key="majorKey">IBFrameworkSource</string>
  235 + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
  236 + </object>
  237 + </object>
  238 + <object class="IBPartialClassDescription">
  239 + <string key="className">NSObject</string>
  240 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  241 + <string key="majorKey">IBFrameworkSource</string>
  242 + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
  243 + </object>
  244 + </object>
  245 + <object class="IBPartialClassDescription">
  246 + <string key="className">NSObject</string>
  247 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  248 + <string key="majorKey">IBFrameworkSource</string>
  249 + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
  250 + </object>
  251 + </object>
  252 + <object class="IBPartialClassDescription">
  253 + <string key="className">NSObject</string>
  254 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  255 + <string key="majorKey">IBFrameworkSource</string>
  256 + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
  257 + </object>
  258 + </object>
  259 + <object class="IBPartialClassDescription">
  260 + <string key="className">NSObject</string>
  261 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  262 + <string key="majorKey">IBFrameworkSource</string>
  263 + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
  264 + </object>
  265 + </object>
  266 + <object class="IBPartialClassDescription">
  267 + <string key="className">NSObject</string>
  268 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  269 + <string key="majorKey">IBFrameworkSource</string>
  270 + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
  271 + </object>
  272 + </object>
  273 + <object class="IBPartialClassDescription">
  274 + <string key="className">NSObject</string>
  275 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  276 + <string key="majorKey">IBFrameworkSource</string>
  277 + <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
  278 + </object>
  279 + </object>
  280 + <object class="IBPartialClassDescription">
  281 + <string key="className">NSObject</string>
  282 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  283 + <string key="majorKey">IBFrameworkSource</string>
  284 + <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
  285 + </object>
  286 + </object>
  287 + <object class="IBPartialClassDescription">
  288 + <string key="className">NSObject</string>
  289 + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="959752681">
  290 + <string key="majorKey">IBFrameworkSource</string>
  291 + <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
  292 + </object>
  293 + </object>
  294 + <object class="IBPartialClassDescription">
  295 + <string key="className">UIResponder</string>
  296 + <string key="superclassName">NSObject</string>
  297 + <reference key="sourceIdentifier" ref="959752681"/>
  298 + </object>
  299 + <object class="IBPartialClassDescription">
  300 + <string key="className">UIScrollView</string>
  301 + <string key="superclassName">UIView</string>
  302 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  303 + <string key="majorKey">IBFrameworkSource</string>
  304 + <string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
  305 + </object>
  306 + </object>
  307 + <object class="IBPartialClassDescription">
  308 + <string key="className">UISearchBar</string>
  309 + <string key="superclassName">UIView</string>
  310 + <object class="IBClassDescriptionSource" key="sourceIdentifier">
  311 + <string key="majorKey">IBFrameworkSource</string>