├── .gitignore ├── CHGridLayout ├── CHGridLayout.h ├── CHGridLayout.m ├── CHGridLayoutSection.h ├── CHGridLayoutSection.m ├── CHGridLayoutTile.h └── CHGridLayoutTile.m ├── CHGridTestApp ├── CHGridTestApp-Info.plist ├── CHGridTestApp.xcodeproj │ └── project.pbxproj ├── CHGridTestApp_Prefix.pch ├── Classes │ ├── CHGridTestAppAppDelegate.h │ ├── CHGridTestAppAppDelegate.m │ ├── CHGridViewController.h │ └── CHGridViewController.m ├── MainWindow.xib ├── flickrimg │ ├── 1.jpg │ ├── 10.jpg │ ├── 100.jpg │ ├── 101.jpg │ ├── 102.jpg │ ├── 103.jpg │ ├── 104.jpg │ ├── 105.jpg │ ├── 106.jpg │ ├── 107.jpg │ ├── 108.jpg │ ├── 109.jpg │ ├── 11.jpg │ ├── 110.jpg │ ├── 111.jpg │ ├── 112.jpg │ ├── 113.jpg │ ├── 114.jpg │ ├── 115.jpg │ ├── 116.jpg │ ├── 117.jpg │ ├── 118.jpg │ ├── 119.jpg │ ├── 12.jpg │ ├── 120.jpg │ ├── 121.jpg │ ├── 122.jpg │ ├── 123.jpg │ ├── 124.jpg │ ├── 125.jpg │ ├── 126.jpg │ ├── 127.jpg │ ├── 128.jpg │ ├── 129.jpg │ ├── 13.jpg │ ├── 130.jpg │ ├── 131.jpg │ ├── 132.jpg │ ├── 133.jpg │ ├── 134.jpg │ ├── 135.jpg │ ├── 136.jpg │ ├── 137.jpg │ ├── 138.jpg │ ├── 139.jpg │ ├── 14.jpg │ ├── 140.jpg │ ├── 141.jpg │ ├── 142.jpg │ ├── 143.jpg │ ├── 144.jpg │ ├── 145.jpg │ ├── 146.jpg │ ├── 147.jpg │ ├── 148.jpg │ ├── 149.jpg │ ├── 15.jpg │ ├── 150.jpg │ ├── 151.jpg │ ├── 152.jpg │ ├── 153.jpg │ ├── 154.jpg │ ├── 155.jpg │ ├── 156.jpg │ ├── 157.jpg │ ├── 158.jpg │ ├── 159.jpg │ ├── 16.jpg │ ├── 160.jpg │ ├── 161.jpg │ ├── 162.jpg │ ├── 163.jpg │ ├── 164.jpg │ ├── 165.jpg │ ├── 166.jpg │ ├── 167.jpg │ ├── 168.jpg │ ├── 169.jpg │ ├── 17.jpg │ ├── 170.jpg │ ├── 171.jpg │ ├── 172.jpg │ ├── 173.jpg │ ├── 174.jpg │ ├── 175.jpg │ ├── 176.jpg │ ├── 177.jpg │ ├── 178.jpg │ ├── 179.jpg │ ├── 18.jpg │ ├── 180.jpg │ ├── 181.jpg │ ├── 182.jpg │ ├── 183.jpg │ ├── 184.jpg │ ├── 185.jpg │ ├── 186.jpg │ ├── 187.jpg │ ├── 188.jpg │ ├── 189.jpg │ ├── 19.jpg │ ├── 190.jpg │ ├── 191.jpg │ ├── 192.jpg │ ├── 193.jpg │ ├── 194.jpg │ ├── 195.jpg │ ├── 196.jpg │ ├── 197.jpg │ ├── 198.jpg │ ├── 199.jpg │ ├── 2.jpg │ ├── 20.jpg │ ├── 200.jpg │ ├── 201.jpg │ ├── 202.jpg │ ├── 203.jpg │ ├── 204.jpg │ ├── 205.jpg │ ├── 206.jpg │ ├── 207.jpg │ ├── 208.jpg │ ├── 209.jpg │ ├── 21.jpg │ ├── 210.jpg │ ├── 211.jpg │ ├── 212.jpg │ ├── 213.jpg │ ├── 214.jpg │ ├── 215.jpg │ ├── 216.jpg │ ├── 217.jpg │ ├── 218.jpg │ ├── 219.jpg │ ├── 22.jpg │ ├── 220.jpg │ ├── 221.jpg │ ├── 222.jpg │ ├── 223.jpg │ ├── 224.jpg │ ├── 225.jpg │ ├── 226.jpg │ ├── 227.jpg │ ├── 228.jpg │ ├── 229.jpg │ ├── 23.jpg │ ├── 230.jpg │ ├── 231.jpg │ ├── 232.jpg │ ├── 233.jpg │ ├── 234.jpg │ ├── 235.jpg │ ├── 236.jpg │ ├── 237.jpg │ ├── 238.jpg │ ├── 239.jpg │ ├── 24.jpg │ ├── 240.jpg │ ├── 241.jpg │ ├── 242.jpg │ ├── 243.jpg │ ├── 244.jpg │ ├── 245.jpg │ ├── 246.jpg │ ├── 247.jpg │ ├── 248.jpg │ ├── 249.jpg │ ├── 25.jpg │ ├── 250.jpg │ ├── 251.jpg │ ├── 252.jpg │ ├── 253.jpg │ ├── 254.jpg │ ├── 255.jpg │ ├── 256.jpg │ ├── 257.jpg │ ├── 258.jpg │ ├── 259.jpg │ ├── 26.jpg │ ├── 260.jpg │ ├── 261.jpg │ ├── 262.jpg │ ├── 263.jpg │ ├── 264.jpg │ ├── 265.jpg │ ├── 266.jpg │ ├── 267.jpg │ ├── 268.jpg │ ├── 269.jpg │ ├── 27.jpg │ ├── 270.jpg │ ├── 271.jpg │ ├── 272.jpg │ ├── 273.jpg │ ├── 274.jpg │ ├── 275.jpg │ ├── 276.jpg │ ├── 277.jpg │ ├── 278.jpg │ ├── 279.jpg │ ├── 28.jpg │ ├── 280.jpg │ ├── 281.jpg │ ├── 282.jpg │ ├── 283.jpg │ ├── 284.jpg │ ├── 285.jpg │ ├── 286.jpg │ ├── 287.jpg │ ├── 288.jpg │ ├── 289.jpg │ ├── 29.jpg │ ├── 290.jpg │ ├── 291.jpg │ ├── 292.jpg │ ├── 293.jpg │ ├── 294.jpg │ ├── 3.jpg │ ├── 30.jpg │ ├── 31.jpg │ ├── 32.jpg │ ├── 33.jpg │ ├── 34.jpg │ ├── 35.jpg │ ├── 36.jpg │ ├── 37.jpg │ ├── 38.jpg │ ├── 39.jpg │ ├── 4.jpg │ ├── 40.jpg │ ├── 41.jpg │ ├── 42.jpg │ ├── 43.jpg │ ├── 44.jpg │ ├── 45.jpg │ ├── 46.jpg │ ├── 47.jpg │ ├── 48.jpg │ ├── 49.jpg │ ├── 5.jpg │ ├── 50.jpg │ ├── 51.jpg │ ├── 52.jpg │ ├── 53.jpg │ ├── 54.jpg │ ├── 55.jpg │ ├── 56.jpg │ ├── 57.jpg │ ├── 58.jpg │ ├── 59.jpg │ ├── 6.jpg │ ├── 60.jpg │ ├── 61.jpg │ ├── 62.jpg │ ├── 63.jpg │ ├── 64.jpg │ ├── 65.jpg │ ├── 66.jpg │ ├── 67.jpg │ ├── 68.jpg │ ├── 69.jpg │ ├── 7.jpg │ ├── 70.jpg │ ├── 71.jpg │ ├── 72.jpg │ ├── 73.jpg │ ├── 74.jpg │ ├── 75.jpg │ ├── 76.jpg │ ├── 77.jpg │ ├── 78.jpg │ ├── 79.jpg │ ├── 8.jpg │ ├── 80.jpg │ ├── 81.jpg │ ├── 82.jpg │ ├── 83.jpg │ ├── 84.jpg │ ├── 85.jpg │ ├── 86.jpg │ ├── 87.jpg │ ├── 88.jpg │ ├── 89.jpg │ ├── 9.jpg │ ├── 90.jpg │ ├── 91.jpg │ ├── 92.jpg │ ├── 93.jpg │ ├── 94.jpg │ ├── 95.jpg │ ├── 96.jpg │ ├── 97.jpg │ ├── 98.jpg │ └── 99.jpg └── main.m ├── CHGridView.h ├── CHGridView.m ├── CHImageTileView.h ├── CHImageTileView.m ├── CHSectionHeaderView.h ├── CHSectionHeaderView.m ├── CHTileView.h ├── CHTileView.m ├── LICENSE.txt └── README.markdown /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | tests/ 3 | CHGridTestApp/build/ 4 | *.swp 5 | *~.nib 6 | *.mode1v3 7 | *.mode2v3 8 | *.pbxuser 9 | *.perspectivev3 -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayout.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | #import "CHTileView.h" 13 | 14 | struct CHGridIndexRange { 15 | CHGridIndexPath start; 16 | CHGridIndexPath end; 17 | }; 18 | typedef struct CHGridIndexRange CHGridIndexRange; 19 | 20 | struct CHSectionRange { 21 | int start; 22 | int end; 23 | }; 24 | typedef struct CHSectionRange CHSectionRange; 25 | 26 | static CHSectionRange CHSectionRangeMake(int start, int end){ 27 | CHSectionRange range; range.start = start; range.end = end; return range; 28 | } 29 | 30 | //----------- 31 | 32 | @interface CHGridLayout : NSObject { 33 | NSMutableArray *index; 34 | NSMutableArray *sectionTitles; 35 | NSMutableArray *justTiles; 36 | 37 | float gridWidth; 38 | float contentHeight; 39 | CGSize padding; 40 | int perLine; 41 | float preLoadMultiplier; 42 | float rowHeight; 43 | float pixelMargin; 44 | float sectionTitleHeight; 45 | } 46 | 47 | @property (nonatomic, readonly) NSMutableArray *index; 48 | @property (nonatomic, readonly) NSMutableArray *justTiles; 49 | 50 | @property (nonatomic) float gridWidth; 51 | @property (nonatomic, readonly) CGFloat contentHeight; 52 | @property (nonatomic) CGSize padding; 53 | @property (nonatomic) int perLine; 54 | @property (nonatomic) float preLoadMultiplier; 55 | @property (nonatomic) float rowHeight; 56 | @property (nonatomic) float sectionTitleHeight; 57 | 58 | - (void)setSections:(int)sections; 59 | - (void)setNumberOfTiles:(int)tiles ForSectionIndex:(int)section; 60 | - (void)updateLayout; 61 | - (void)clearData; 62 | 63 | - (CGFloat)yCoordinateForTitleOfSection:(int)section; 64 | - (CHSectionRange)sectionRangeForContentOffset:(CGFloat)offset andHeight:(CGFloat)height; 65 | 66 | - (CHGridIndexPath)closestIndexPathToContentOffsetY:(CGFloat)offset; 67 | - (CGRect)tileFrameForIndexPath:(CHGridIndexPath)indexPath; 68 | - (CHGridIndexRange)rangeOfVisibleIndexesForContentOffset:(CGFloat)offset andHeight:(CGFloat)height; 69 | 70 | - (CGRect)centerRect:(CGRect)smallerRect inLargerRect:(CGRect)largerRect roundUp:(BOOL)roundUp; 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayout.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridLayout.h" 12 | #import "CHGridLayoutTile.h" 13 | #import "CHGridLayoutSection.h" 14 | #include 15 | #include 16 | 17 | #define SLOW_DEVICE_PRELOAD 2.0f 18 | 19 | @implementation CHGridLayout 20 | @synthesize index, justTiles, gridWidth, contentHeight, padding, perLine, preLoadMultiplier, rowHeight, sectionTitleHeight; 21 | 22 | - (id)init{ 23 | if(self = [super init]){ 24 | if(index == nil) 25 | index = [[NSMutableArray alloc] init]; 26 | 27 | if(sectionTitles == nil) 28 | sectionTitles = [[NSMutableArray alloc] init]; 29 | 30 | if(justTiles == nil) 31 | justTiles = [[NSMutableArray alloc] init]; 32 | 33 | preLoadMultiplier = 6.0f; 34 | 35 | contentHeight = 0.0f; 36 | rowHeight = 0.0f; 37 | } 38 | return self; 39 | } 40 | 41 | - (void)dealloc{ 42 | [justTiles release]; 43 | [sectionTitles release]; 44 | [index release]; 45 | [super dealloc]; 46 | } 47 | 48 | #pragma mark setters 49 | 50 | - (void)setRowHeight:(CGFloat)f{ 51 | rowHeight = f; 52 | pixelMargin = f * preLoadMultiplier; 53 | } 54 | 55 | - (void)setPreLoadMultiplier:(float)f{ 56 | preLoadMultiplier = f; 57 | 58 | size_t size; 59 | sysctlbyname("hw.machine", NULL, &size, NULL, 0); 60 | char *machine = malloc(size); 61 | sysctlbyname("hw.machine", machine, &size, NULL, 0); 62 | NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; 63 | free(machine); 64 | 65 | if([platform isEqualToString:@"iPhone1,1"]) preLoadMultiplier = SLOW_DEVICE_PRELOAD; 66 | if([platform isEqualToString:@"iPhone1,2"]) preLoadMultiplier = SLOW_DEVICE_PRELOAD; 67 | if([platform isEqualToString:@"iPod1,1"]) preLoadMultiplier = SLOW_DEVICE_PRELOAD; 68 | } 69 | 70 | - (void)setSections:(int)sections{ 71 | [self clearData]; 72 | 73 | int i; 74 | for(i = 0; i < sections; i++){ 75 | NSMutableArray *section = [NSMutableArray array]; 76 | CHGridLayoutSection *section2 = [[CHGridLayoutSection alloc] initWithSection:i]; 77 | [index addObject:section]; 78 | [sectionTitles addObject:section2]; 79 | [section2 release]; 80 | } 81 | } 82 | 83 | - (void)setNumberOfTiles:(int)tiles ForSectionIndex:(int)section{ 84 | if(section < 0 || section >= index.count) return; 85 | 86 | int i; 87 | for(i = 0; i < tiles; i++){ 88 | CHGridLayoutTile *tile = [[CHGridLayoutTile alloc] initWithIndexPath:CHGridIndexPathMake(section, i)]; 89 | [[index objectAtIndex:section] addObject:tile]; 90 | [justTiles addObject:tile]; 91 | [tile release]; 92 | } 93 | } 94 | 95 | #pragma mark data & layout 96 | 97 | - (void)clearData{ 98 | [index removeAllObjects]; 99 | [justTiles removeAllObjects]; 100 | [sectionTitles removeAllObjects]; 101 | contentHeight = 0.0f; 102 | } 103 | 104 | - (void)updateLayout{ 105 | int sections = index.count; 106 | 107 | float perLineFloat = perLine; 108 | 109 | for(NSMutableArray *array in index){ 110 | int numberOfTilesInSection = [array count]; 111 | contentHeight += ceilf(numberOfTilesInSection / perLineFloat) * rowHeight; 112 | } 113 | 114 | if(sections > 1) contentHeight += (sectionTitleHeight * sections) + ((sections - 1) * padding.height); 115 | contentHeight += padding.height; 116 | 117 | int i; 118 | for(i = 0; i < index.count; i++){ 119 | CHGridLayoutSection *section = [sectionTitles objectAtIndex:i]; 120 | CHGridLayoutSection *previousSection = nil; 121 | if(i > 0) previousSection = [sectionTitles objectAtIndex:(i - 1)]; 122 | NSMutableArray *tilesForSection = [index objectAtIndex:i]; 123 | 124 | if(sections > 1){ 125 | float previousY = 0.0; 126 | if(previousSection != nil) previousY = previousSection.yCoordinate; 127 | int numberOfTilesInPreviousSection = 0; 128 | if(i > 0) numberOfTilesInPreviousSection = [[index objectAtIndex:(i - 1)] count]; 129 | float sectionYPadding = 0.0f; 130 | if(i > 0) sectionYPadding = padding.height + sectionTitleHeight; 131 | 132 | [section setYCoordinate:ceilf(numberOfTilesInPreviousSection / perLineFloat) * rowHeight + sectionYPadding + previousY]; 133 | }else{ 134 | section = nil; 135 | } 136 | 137 | for(CHGridLayoutTile *tile in tilesForSection){ 138 | float y = 0.0; 139 | if(section != nil) y = section.yCoordinate + sectionTitleHeight; 140 | 141 | float rowXPadding = (padding.width * perLineFloat) + padding.width; 142 | float row = floorf(tile.indexPath.tileIndex / perLine); 143 | int rowIndex = tile.indexPath.tileIndex - (row * perLine); 144 | 145 | float width = floorf((gridWidth - rowXPadding) / perLine); 146 | float height = rowHeight - padding.height; 147 | 148 | [tile setRect:CGRectMake(padding.width + (rowIndex * width) + (rowIndex * padding.width), row * rowHeight + y + padding.height, width, height)]; 149 | } 150 | } 151 | } 152 | 153 | #pragma mark layout accessors 154 | 155 | - (int)sectionIndexForContentOffset:(CGFloat)offset{ 156 | int sectionIndex = 0; 157 | 158 | for(CHGridLayoutSection *section in sectionTitles){ 159 | if(section.yCoordinate <= offset && offset > 0){ 160 | sectionIndex = section.section; 161 | } 162 | } 163 | 164 | return sectionIndex; 165 | } 166 | 167 | - (CGFloat)yCoordinateForTitleOfSection:(int)section{ 168 | return [[sectionTitles objectAtIndex:section] yCoordinate]; 169 | } 170 | 171 | - (CHSectionRange)sectionRangeForContentOffset:(CGFloat)offset andHeight:(CGFloat)height{ 172 | int start = 0; 173 | int end = 0; 174 | 175 | BOOL firstRun = YES; 176 | int currentSection = [self sectionIndexForContentOffset:offset]; 177 | 178 | float firstY = (offset - pixelMargin); 179 | float secondY = (offset + height + pixelMargin); 180 | 181 | for(CHGridLayoutSection *section in sectionTitles){ 182 | int s = section.section; 183 | float sy = section.yCoordinate; 184 | 185 | if(firstRun && s >= currentSection){ 186 | start = s; 187 | firstRun = NO; 188 | } 189 | 190 | if(sy > firstY && sy < secondY){ 191 | end = s; 192 | } 193 | 194 | if(start > end) end = start; 195 | } 196 | 197 | return CHSectionRangeMake(start, end); 198 | } 199 | 200 | - (CHGridIndexPath)closestIndexPathToContentOffsetY:(CGFloat)offset{ 201 | CHGridLayoutTile *closestTile = nil; 202 | 203 | for(NSMutableArray *section in index){ 204 | for(CHGridLayoutTile *tile in section){ 205 | if(tile.rect.origin.y > offset){ 206 | if(closestTile == nil){ 207 | closestTile = tile; 208 | }else if(tile.rect.origin.y < closestTile.rect.origin.y && closestTile.rect.origin.y < offset){ 209 | closestTile = tile; 210 | } 211 | } 212 | } 213 | } 214 | 215 | if(closestTile != nil){ 216 | return [closestTile indexPath]; 217 | } 218 | return CHGridIndexPathMake(0, 0); 219 | } 220 | 221 | - (CGRect)tileFrameForIndexPath:(CHGridIndexPath)indexPath{ 222 | NSMutableArray *sectionTiles = [index objectAtIndex:indexPath.section]; 223 | return [[sectionTiles objectAtIndex:indexPath.tileIndex] rect]; 224 | } 225 | 226 | - (CHGridIndexRange)rangeOfVisibleIndexesForContentOffset:(CGFloat)offset andHeight:(CGFloat)height{ 227 | BOOL first = NO; 228 | CHGridIndexRange indexRange = {CHGridIndexPathMake(0, 0),CHGridIndexPathMake(0, 0)}; 229 | 230 | float firstY = (height + offset + pixelMargin); 231 | float secondY = offset - pixelMargin; 232 | 233 | for(NSMutableArray *sectionArray in index){ 234 | for(CHGridLayoutTile *tile in sectionArray){ 235 | if(tile.rect.origin.y < firstY && tile.rect.origin.y + tile.rect.size.height >= secondY){ 236 | if(!first){ 237 | indexRange.start = [tile indexPath]; 238 | first = YES; 239 | } 240 | indexRange.end = [tile indexPath]; 241 | } 242 | } 243 | } 244 | 245 | return indexRange; 246 | } 247 | 248 | #pragma mark convenience layout methods 249 | 250 | - (CGRect)centerRect:(CGRect)smallerRect inLargerRect:(CGRect)largerRect roundUp:(BOOL)roundUp{ 251 | if (roundUp) 252 | return CGRectMake(ceilf((largerRect.size.width - smallerRect.size.width) / 2), ceilf((largerRect.size.height - smallerRect.size.height) / 2), smallerRect.size.width, smallerRect.size.height); 253 | 254 | return CGRectMake(floorf((largerRect.size.width - smallerRect.size.width) / 2), floorf((largerRect.size.height - smallerRect.size.height) / 2), smallerRect.size.width, smallerRect.size.height); 255 | } 256 | 257 | @end 258 | -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayoutSection.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayoutSection.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | 13 | 14 | @interface CHGridLayoutSection : NSObject { 15 | int section; 16 | CGFloat yCoordinate; 17 | } 18 | 19 | @property (nonatomic, readonly) int section; 20 | @property (nonatomic) CGFloat yCoordinate; 21 | 22 | - (id)initWithSection:(int)s; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayoutSection.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayoutSection.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridLayoutSection.h" 12 | 13 | @implementation CHGridLayoutSection 14 | @synthesize section, yCoordinate; 15 | 16 | - (id)initWithSection:(int)s{ 17 | if(self = [super init]){ 18 | section = s; 19 | yCoordinate = 0.0; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)dealloc{ 25 | [super dealloc]; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayoutTile.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayoutTile.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | #import "CHTileView.h" 13 | 14 | @interface CHGridLayoutTile : NSObject { 15 | CHGridIndexPath indexPath; 16 | CGRect rect; 17 | } 18 | 19 | - (id)initWithIndexPath:(CHGridIndexPath)index; 20 | 21 | @property (nonatomic, readonly) CHGridIndexPath indexPath; 22 | @property (nonatomic) CGRect rect; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /CHGridLayout/CHGridLayoutTile.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridLayoutTile.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridLayoutTile.h" 12 | 13 | @implementation CHGridLayoutTile 14 | @synthesize indexPath, rect; 15 | 16 | - (id)initWithIndexPath:(CHGridIndexPath)index{ 17 | if(self = [super init]){ 18 | indexPath = index; 19 | 20 | rect = CGRectZero; 21 | } 22 | return self; 23 | } 24 | 25 | - (NSString *)description{ 26 | return [NSString stringWithFormat:@"%@, indexPath section = %i tileIndex = %i, x = %f y = %f w = %f h = %f", [super description], indexPath.section, indexPath.tileIndex, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height]; 27 | } 28 | 29 | - (void)dealloc{ 30 | [super dealloc]; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /CHGridTestApp/CHGridTestApp-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.sandwichdynamics.${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 | 30 | 31 | -------------------------------------------------------------------------------- /CHGridTestApp/CHGridTestApp_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'CHGridTestApp' target in the 'CHGridTestApp' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /CHGridTestApp/Classes/CHGridTestAppAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridTestAppAppDelegate.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/22/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | 13 | @class CHGridViewController; 14 | 15 | @interface CHGridTestAppAppDelegate : NSObject { 16 | UIWindow *window; 17 | CHGridViewController *viewController; 18 | } 19 | 20 | @property (nonatomic, retain) IBOutlet UIWindow *window; 21 | 22 | @end 23 | 24 | -------------------------------------------------------------------------------- /CHGridTestApp/Classes/CHGridTestAppAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridTestAppAppDelegate.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/22/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridTestAppAppDelegate.h" 12 | #import "CHGridViewController.h" 13 | 14 | @implementation CHGridTestAppAppDelegate 15 | 16 | @synthesize window; 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | 20 | if(viewController == nil){ 21 | viewController = [[CHGridViewController alloc] initWithNibName:nil bundle:nil]; 22 | } 23 | 24 | // Override point for customization after app launch 25 | [window addSubview:viewController.view]; 26 | [window makeKeyAndVisible]; 27 | 28 | return YES; 29 | } 30 | 31 | - (void)dealloc { 32 | [viewController release]; 33 | [window release]; 34 | [super dealloc]; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /CHGridTestApp/Classes/CHGridViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridViewController.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/22/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | #import "CHGridView.h" 13 | 14 | @interface CHGridViewController : UIViewController { 15 | CHGridView *myGridView; 16 | NSMutableArray *images; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CHGridTestApp/Classes/CHGridViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridViewController.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/22/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridViewController.h" 12 | #import "CHImageTileView.h" 13 | 14 | @implementation CHGridViewController 15 | 16 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 17 | if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 18 | if(myGridView == nil){ 19 | myGridView = [[CHGridView alloc] initWithFrame:CGRectZero]; 20 | } 21 | 22 | if(images == nil){ 23 | images = [[NSMutableArray alloc] init]; 24 | } 25 | } 26 | return self; 27 | } 28 | 29 | - (void)dealloc { 30 | [images release]; 31 | [myGridView release]; 32 | [super dealloc]; 33 | } 34 | 35 | #pragma mark view controller methods 36 | 37 | - (void)viewDidLoad { 38 | [super viewDidLoad]; 39 | 40 | int i; 41 | for(i = 0; i < 294; i++){ 42 | [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg", i + 1]]]; 43 | } 44 | 45 | // set properties of myGridView 46 | 47 | [myGridView setDataSource:self]; 48 | [myGridView setDelegate:self]; 49 | 50 | [myGridView setPadding:CGSizeMake(4.0, 4.0)]; 51 | [myGridView setRowHeight:64.0]; 52 | [myGridView setPerLine:4]; 53 | [myGridView setCenterTilesInGrid:NO]; 54 | } 55 | 56 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 57 | return YES; 58 | } 59 | 60 | - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{ 61 | //change the perLine setting and reload while orientation changes 62 | 63 | if(interfaceOrientation == UIInterfaceOrientationPortrait|| 64 | interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ 65 | [myGridView setPerLine:4]; 66 | } 67 | if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 68 | interfaceOrientation ==UIInterfaceOrientationLandscapeRight){ 69 | [myGridView setPerLine:5]; 70 | } 71 | [myGridView reloadData]; 72 | } 73 | 74 | - (void)didReceiveMemoryWarning { 75 | [super didReceiveMemoryWarning]; 76 | } 77 | 78 | - (void)viewDidUnload { 79 | [super viewDidUnload]; 80 | } 81 | 82 | - (void)viewWillAppear:(BOOL)animated{ 83 | [super viewWillAppear:animated]; 84 | 85 | [myGridView setFrame:[[self view] bounds]]; 86 | [myGridView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth)]; 87 | [[self view] addSubview:myGridView]; 88 | 89 | [myGridView reloadData]; 90 | } 91 | 92 | #pragma mark grid view datasource 93 | 94 | - (int)numberOfSectionsInGridView:(CHGridView *)gridView{ 95 | return 7; 96 | } 97 | 98 | - (int)numberOfTilesInSection:(int)section GridView:(CHGridView *)gridView{ 99 | return 294; 100 | } 101 | 102 | - (CHTileView *)tileForIndexPath:(CHGridIndexPath)indexPath inGridView:(CHGridView *)gridView{ 103 | static NSString *TileIndentifier = @"Tile"; 104 | 105 | CHImageTileView *tile = (CHImageTileView *)[gridView dequeueReusableTileWithIdentifier:TileIndentifier]; 106 | 107 | if(tile == nil) 108 | tile = [[[CHImageTileView alloc] initWithFrame:CGRectZero reuseIdentifier:TileIndentifier] autorelease]; 109 | 110 | [tile setImage:[images objectAtIndex:indexPath.tileIndex]]; 111 | [tile setScalesImageToFit:YES]; 112 | 113 | return tile; 114 | } 115 | 116 | #pragma mark grid view delegate 117 | 118 | - (NSString *)titleForHeaderOfSection:(int)section inGridView:(CHGridView *)gridView{ 119 | return [NSString stringWithFormat:@"Section %i", section + 1]; 120 | } 121 | 122 | - (void)selectedTileAtIndexPath:(CHGridIndexPath)indexPath inGridView:(CHGridView *)gridView{ 123 | //deselect after 0.1s so if a user taps quickly, it'll still show it 124 | [myGridView performSelector:@selector(deselectSelectedTile) withObject:nil afterDelay:0.1]; 125 | } 126 | 127 | @end 128 | -------------------------------------------------------------------------------- /CHGridTestApp/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 784 5 | 10C540 6 | 761 7 | 1038.25 8 | 458.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 84 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 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | IBCocoaTouchFramework 42 | 43 | 44 | 45 | 292 46 | {320, 480} 47 | 48 | 49 | 1 50 | MSAxIDEAA 51 | 52 | NO 53 | NO 54 | 55 | IBCocoaTouchFramework 56 | YES 57 | 58 | 59 | 60 | 61 | YES 62 | 63 | 64 | delegate 65 | 66 | 67 | 68 | 4 69 | 70 | 71 | 72 | window 73 | 74 | 75 | 76 | 14 77 | 78 | 79 | 80 | 81 | YES 82 | 83 | 0 84 | 85 | 86 | 87 | 88 | 89 | -1 90 | 91 | 92 | File's Owner 93 | 94 | 95 | 3 96 | 97 | 98 | CHGridTestApp App Delegate 99 | 100 | 101 | -2 102 | 103 | 104 | 105 | 106 | 12 107 | 108 | 109 | 110 | 111 | 112 | 113 | YES 114 | 115 | YES 116 | -1.CustomClassName 117 | -2.CustomClassName 118 | 12.IBEditorWindowLastContentRect 119 | 12.IBPluginDependency 120 | 3.CustomClassName 121 | 3.IBPluginDependency 122 | 123 | 124 | YES 125 | UIApplication 126 | UIResponder 127 | {{525, 346}, {320, 480}} 128 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 129 | CHGridTestAppAppDelegate 130 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 131 | 132 | 133 | 134 | YES 135 | 136 | 137 | YES 138 | 139 | 140 | 141 | 142 | YES 143 | 144 | 145 | YES 146 | 147 | 148 | 149 | 14 150 | 151 | 152 | 153 | YES 154 | 155 | CHGridTestAppAppDelegate 156 | NSObject 157 | 158 | window 159 | UIWindow 160 | 161 | 162 | IBProjectSource 163 | Classes/CHGridTestAppAppDelegate.h 164 | 165 | 166 | 167 | CHGridTestAppAppDelegate 168 | NSObject 169 | 170 | IBUserSource 171 | 172 | 173 | 174 | 175 | 176 | YES 177 | 178 | NSObject 179 | 180 | IBFrameworkSource 181 | Foundation.framework/Headers/NSError.h 182 | 183 | 184 | 185 | NSObject 186 | 187 | IBFrameworkSource 188 | Foundation.framework/Headers/NSFileManager.h 189 | 190 | 191 | 192 | NSObject 193 | 194 | IBFrameworkSource 195 | Foundation.framework/Headers/NSKeyValueCoding.h 196 | 197 | 198 | 199 | NSObject 200 | 201 | IBFrameworkSource 202 | Foundation.framework/Headers/NSKeyValueObserving.h 203 | 204 | 205 | 206 | NSObject 207 | 208 | IBFrameworkSource 209 | Foundation.framework/Headers/NSKeyedArchiver.h 210 | 211 | 212 | 213 | NSObject 214 | 215 | IBFrameworkSource 216 | Foundation.framework/Headers/NSNetServices.h 217 | 218 | 219 | 220 | NSObject 221 | 222 | IBFrameworkSource 223 | Foundation.framework/Headers/NSObject.h 224 | 225 | 226 | 227 | NSObject 228 | 229 | IBFrameworkSource 230 | Foundation.framework/Headers/NSPort.h 231 | 232 | 233 | 234 | NSObject 235 | 236 | IBFrameworkSource 237 | Foundation.framework/Headers/NSRunLoop.h 238 | 239 | 240 | 241 | NSObject 242 | 243 | IBFrameworkSource 244 | Foundation.framework/Headers/NSStream.h 245 | 246 | 247 | 248 | NSObject 249 | 250 | IBFrameworkSource 251 | Foundation.framework/Headers/NSThread.h 252 | 253 | 254 | 255 | NSObject 256 | 257 | IBFrameworkSource 258 | Foundation.framework/Headers/NSURL.h 259 | 260 | 261 | 262 | NSObject 263 | 264 | IBFrameworkSource 265 | Foundation.framework/Headers/NSURLConnection.h 266 | 267 | 268 | 269 | NSObject 270 | 271 | IBFrameworkSource 272 | Foundation.framework/Headers/NSXMLParser.h 273 | 274 | 275 | 276 | NSObject 277 | 278 | IBFrameworkSource 279 | UIKit.framework/Headers/UIAccessibility.h 280 | 281 | 282 | 283 | NSObject 284 | 285 | IBFrameworkSource 286 | UIKit.framework/Headers/UINibLoading.h 287 | 288 | 289 | 290 | NSObject 291 | 292 | IBFrameworkSource 293 | UIKit.framework/Headers/UIResponder.h 294 | 295 | 296 | 297 | UIApplication 298 | UIResponder 299 | 300 | IBFrameworkSource 301 | UIKit.framework/Headers/UIApplication.h 302 | 303 | 304 | 305 | UIResponder 306 | NSObject 307 | 308 | 309 | 310 | UIView 311 | 312 | IBFrameworkSource 313 | UIKit.framework/Headers/UITextField.h 314 | 315 | 316 | 317 | UIView 318 | UIResponder 319 | 320 | IBFrameworkSource 321 | UIKit.framework/Headers/UIView.h 322 | 323 | 324 | 325 | UIWindow 326 | UIView 327 | 328 | IBFrameworkSource 329 | UIKit.framework/Headers/UIWindow.h 330 | 331 | 332 | 333 | 334 | 0 335 | IBCocoaTouchFramework 336 | 337 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 338 | 339 | 340 | 341 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 342 | 343 | 344 | YES 345 | CHGridTestApp.xcodeproj 346 | 3 347 | 84 348 | 349 | 350 | -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/1.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/10.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/100.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/101.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/102.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/103.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/104.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/105.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/106.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/107.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/108.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/109.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/11.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/110.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/111.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/112.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/113.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/114.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/115.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/116.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/117.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/118.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/119.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/12.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/120.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/121.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/122.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/123.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/124.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/125.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/125.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/126.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/126.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/127.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/128.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/129.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/129.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/13.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/130.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/131.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/131.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/132.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/132.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/133.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/134.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/134.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/135.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/135.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/136.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/136.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/137.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/137.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/138.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/138.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/139.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/14.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/140.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/140.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/141.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/141.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/142.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/142.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/143.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/144.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/144.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/145.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/146.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/147.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/148.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/149.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/15.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/150.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/151.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/152.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/153.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/153.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/154.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/154.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/155.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/156.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/156.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/157.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/157.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/158.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/159.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/16.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/160.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/161.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/162.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/163.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/164.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/164.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/165.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/165.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/166.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/166.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/167.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/167.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/168.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/168.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/169.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/169.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/17.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/170.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/170.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/171.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/171.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/172.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/173.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/173.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/174.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/175.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/176.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/176.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/177.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/178.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/179.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/18.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/180.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/181.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/182.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/183.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/183.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/184.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/185.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/186.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/187.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/188.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/189.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/19.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/190.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/191.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/191.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/192.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/192.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/193.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/193.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/194.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/195.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/195.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/196.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/196.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/197.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/197.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/198.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/198.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/199.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/199.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/2.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/20.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/200.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/201.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/202.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/203.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/203.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/204.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/204.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/205.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/206.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/207.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/208.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/209.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/21.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/210.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/211.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/212.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/213.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/214.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/215.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/215.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/216.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/217.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/217.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/218.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/218.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/219.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/219.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/22.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/220.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/220.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/221.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/221.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/222.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/222.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/223.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/223.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/224.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/225.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/225.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/226.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/226.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/227.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/227.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/228.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/228.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/229.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/23.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/230.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/230.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/231.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/231.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/232.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/232.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/233.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/233.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/234.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/234.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/235.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/235.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/236.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/236.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/237.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/237.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/238.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/238.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/239.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/239.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/24.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/240.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/240.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/241.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/241.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/242.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/242.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/243.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/243.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/244.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/244.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/245.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/245.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/246.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/246.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/247.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/247.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/248.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/249.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/25.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/250.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/251.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/252.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/253.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/254.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/255.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/255.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/256.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/257.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/258.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/259.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/26.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/260.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/261.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/262.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/263.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/264.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/265.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/266.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/267.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/267.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/268.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/268.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/269.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/27.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/270.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/270.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/271.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/271.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/272.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/272.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/273.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/273.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/274.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/274.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/275.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/275.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/276.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/276.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/277.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/277.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/278.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/278.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/279.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/279.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/28.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/280.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/280.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/281.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/281.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/282.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/282.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/283.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/283.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/284.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/284.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/285.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/286.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/286.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/287.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/287.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/288.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/289.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/289.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/29.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/290.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/290.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/291.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/291.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/292.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/292.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/293.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/293.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/294.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/294.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/3.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/30.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/31.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/32.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/33.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/34.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/35.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/36.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/37.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/38.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/39.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/4.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/40.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/41.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/42.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/43.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/44.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/45.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/46.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/47.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/48.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/49.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/5.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/50.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/51.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/52.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/53.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/54.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/55.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/56.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/57.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/58.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/59.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/6.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/60.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/61.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/62.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/63.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/64.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/65.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/66.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/67.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/68.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/69.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/7.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/70.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/71.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/72.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/73.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/74.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/75.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/76.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/77.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/78.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/79.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/8.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/80.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/81.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/81.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/82.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/82.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/83.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/84.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/84.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/85.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/85.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/86.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/87.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/88.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/89.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/9.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/90.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/91.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/91.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/92.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/92.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/93.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/94.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/95.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/96.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/96.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/97.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/98.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/98.jpg -------------------------------------------------------------------------------- /CHGridTestApp/flickrimg/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/camh/CHGridView/6bc42551abc49d41386bab5447d4568bbf111390/CHGridTestApp/flickrimg/99.jpg -------------------------------------------------------------------------------- /CHGridTestApp/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CHGridTestApp 4 | // 5 | // Created by Cameron Hunt on 3/1/10. 6 | // Copyright Apple Inc 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 | -------------------------------------------------------------------------------- /CHGridView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridView.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | #import "CHTileView.h" 13 | #import "CHSectionHeaderView.h" 14 | #import "CHGridLayout.h" 15 | 16 | @class CHGridView; 17 | @class CHTileView; 18 | 19 | // data source protocol 20 | 21 | @protocol CHGridViewDataSource 22 | - (int)numberOfTilesInSection:(int)section GridView:(CHGridView *)gridView; 23 | - (CHTileView *)tileForIndexPath:(CHGridIndexPath)indexPath inGridView:(CHGridView *)gridView; 24 | @optional 25 | - (int)numberOfSectionsInGridView:(CHGridView *)gridView; 26 | - (NSString *)titleForHeaderOfSection:(int)section inGridView:(CHGridView *)gridView; 27 | @end 28 | 29 | // delegate protocol 30 | 31 | @protocol CHGridViewDelegate 32 | @optional 33 | - (void)selectedTileAtIndexPath:(CHGridIndexPath)indexPath inGridView:(CHGridView *)gridView; 34 | - (void)visibleTilesChangedTo:(int)tiles; 35 | - (CGSize)sizeForTileAtIndex:(CHGridIndexPath)indexPath inGridView:(CHGridView *)gridView; 36 | - (CHSectionHeaderView *)headerViewForSection:(int)section inGridView:(CHGridView *)gridView; 37 | @end 38 | 39 | @interface CHGridView : UIScrollView { 40 | CHGridLayout *layout; 41 | 42 | NSMutableArray *visibleTiles; 43 | NSMutableArray *visibleSectionHeaders; 44 | NSMutableArray *reusableTiles; 45 | 46 | id dataSource; 47 | 48 | int sections; 49 | NSMutableArray *sectionCounts; 50 | int maxReusable; 51 | 52 | CHTileView *selectedTile; 53 | BOOL isSlowDevice; 54 | 55 | //settable properties 56 | BOOL centerTilesInGrid; 57 | BOOL allowsSelection; 58 | CGSize padding; 59 | float preLoadMultiplier; 60 | float rowHeight; 61 | int perLine; 62 | float sectionTitleHeight; 63 | } 64 | 65 | @property (nonatomic, assign) id dataSource; 66 | @property (nonatomic, assign) id delegate; 67 | 68 | @property (nonatomic) BOOL centerTilesInGrid; 69 | @property (nonatomic) BOOL allowsSelection; 70 | @property (nonatomic) CGSize padding; 71 | @property (nonatomic) float preLoadMultiplier; 72 | @property (nonatomic) float rowHeight; 73 | @property (nonatomic) int perLine; 74 | @property (nonatomic) float sectionTitleHeight; 75 | 76 | - (void)reloadData; 77 | - (void)reloadDataAndLayoutUpdateNeeded:(BOOL)layoutNeeded; 78 | 79 | - (CHTileView *)dequeueReusableTileWithIdentifier:(NSString *)identifier; 80 | 81 | - (CHTileView *)tileForIndexPath:(CHGridIndexPath)indexPath; 82 | - (CHGridIndexPath)indexPathForPoint:(CGPoint)point; 83 | 84 | - (void)scrollToTileAtIndexPath:(CHGridIndexPath)indexPath animated:(BOOL)animated; 85 | - (void)deselectTileAtIndexPath:(CHGridIndexPath)indexPath; 86 | - (void)deselectSelectedTile; 87 | 88 | @end 89 | -------------------------------------------------------------------------------- /CHGridView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHGridView.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHGridView.h" 12 | #import "CHGridLayoutTile.h" 13 | 14 | @interface CHGridView() 15 | - (void)loadVisibleSectionTitlesForSectionRange:(CHSectionRange)range; 16 | - (void)loadVisibleTileForIndexPath:(CHGridIndexPath)indexPath withRect:(CGRect)r; 17 | - (void)reuseHiddenTiles; 18 | - (void)removeSectionTitleNotInRange:(CHSectionRange)range; 19 | - (void)removeAllSubviews; 20 | - (NSMutableArray *)tilesForSection:(int)section; 21 | - (NSMutableArray *)tilesFromIndex:(int)startIndex toIndex:(int)endIndex inSection:(int)section; 22 | - (CHSectionHeaderView *)sectionHeaderViewForSection:(int)section; 23 | - (void)calculateSectionTitleOffset; 24 | @end 25 | 26 | @implementation CHGridView 27 | @synthesize dataSource, centerTilesInGrid, allowsSelection, padding, preLoadMultiplier, rowHeight, perLine, sectionTitleHeight; 28 | 29 | - (id)init{ 30 | return [self initWithFrame:CGRectZero]; 31 | } 32 | 33 | - (id)initWithFrame:(CGRect)frame{ 34 | if(self = [super initWithFrame:frame]){ 35 | if(visibleTiles == nil) 36 | visibleTiles = [[NSMutableArray alloc] init]; 37 | 38 | if(visibleSectionHeaders == nil) 39 | visibleSectionHeaders = [[NSMutableArray alloc] init]; 40 | 41 | if(reusableTiles == nil) 42 | reusableTiles = [[NSMutableArray alloc] init]; 43 | 44 | if(layout == nil) 45 | layout = [[CHGridLayout alloc] init]; 46 | 47 | if(sectionCounts == nil) 48 | sectionCounts = [[NSMutableArray alloc] init]; 49 | 50 | sections = 1; 51 | 52 | allowsSelection = YES; 53 | centerTilesInGrid = NO; 54 | padding = CGSizeMake(10.0f, 10.0f); 55 | rowHeight = 100.0f; 56 | perLine = 5; 57 | sectionTitleHeight = 25.0f; 58 | 59 | preLoadMultiplier = 6.0f; 60 | 61 | [self setBackgroundColor:[UIColor whiteColor]]; 62 | 63 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reuseHiddenTiles) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 64 | } 65 | return self; 66 | } 67 | 68 | - (void)dealloc { 69 | [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 70 | 71 | [sectionCounts release]; 72 | [layout release]; 73 | [reusableTiles release]; 74 | [visibleSectionHeaders release]; 75 | [visibleTiles release]; 76 | [super dealloc]; 77 | } 78 | 79 | #pragma mark loading methods 80 | 81 | - (void)loadVisibleSectionTitlesForSectionRange:(CHSectionRange)range{ 82 | CGRect b = self.bounds; 83 | if(sections <= 1) return; 84 | 85 | int i; 86 | for (i = range.start; i <= range.end; i++) { 87 | BOOL found = NO; 88 | 89 | for(CHSectionHeaderView *header in visibleSectionHeaders){ 90 | if(header.section == i) found = YES; 91 | } 92 | 93 | if(!found){ 94 | CGFloat yCoordinate = [layout yCoordinateForTitleOfSection:i]; 95 | 96 | CHSectionHeaderView *sectionHeader = nil; 97 | 98 | if([[self delegate] respondsToSelector:@selector(titleViewForHeaderOfSection:inGridView:)]){ 99 | sectionHeader = [[self delegate] headerViewForSection:i inGridView:self]; 100 | [sectionHeader setFrame:CGRectMake(b.origin.x, yCoordinate, b.size.width, sectionTitleHeight)]; 101 | }else{ 102 | sectionHeader = [[CHSectionHeaderView alloc] initWithFrame:CGRectMake(b.origin.x, yCoordinate, b.size.width, sectionTitleHeight)]; 103 | if([dataSource respondsToSelector:@selector(titleForHeaderOfSection:inGridView:)]) 104 | [sectionHeader setTitle:[dataSource titleForHeaderOfSection:i inGridView:self]]; 105 | } 106 | 107 | [sectionHeader setYCoordinate:yCoordinate]; 108 | [sectionHeader setSection:i]; 109 | [sectionHeader setAutoresizingMask:(UIViewAutoresizingFlexibleWidth)]; 110 | 111 | if(self.dragging || self.decelerating) 112 | [self insertSubview:sectionHeader atIndex:self.subviews.count - 1]; 113 | else 114 | [self insertSubview:sectionHeader atIndex:self.subviews.count]; 115 | 116 | [visibleSectionHeaders addObject:sectionHeader]; 117 | [sectionHeader release]; 118 | } 119 | } 120 | 121 | [self removeSectionTitleNotInRange:range]; 122 | } 123 | 124 | - (void)loadVisibleTileForIndexPath:(CHGridIndexPath)indexPath withRect:(CGRect)r{ 125 | for(CHTileView *tile in visibleTiles){ 126 | CHGridIndexPath tileIndex = tile.indexPath; 127 | if(tileIndex.section == indexPath.section && tileIndex.tileIndex == indexPath.tileIndex){ 128 | return; 129 | } 130 | } 131 | 132 | CHTileView *tile = [dataSource tileForIndexPath:indexPath inGridView:self]; 133 | 134 | [tile setIndexPath:indexPath]; 135 | [tile setSelected:NO]; 136 | 137 | if([[self delegate] respondsToSelector:@selector(sizeForTileAtIndex:inGridView:)] && centerTilesInGrid){ 138 | CGSize size = [[self delegate] sizeForTileAtIndex:indexPath inGridView:self]; 139 | CGRect centeredRect = [layout centerRect:CGRectMake(0.0f, 0.0f, size.width, size.height) inLargerRect:r roundUp:NO]; 140 | centeredRect.origin.y += r.origin.y; 141 | centeredRect.origin.x += r.origin.x; 142 | [tile setFrame:centeredRect]; 143 | [tile setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin)]; 144 | }else{ 145 | [tile setFrame:r]; 146 | [tile setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth)]; 147 | } 148 | 149 | [tile setBackgroundColor:self.backgroundColor]; 150 | 151 | [self insertSubview:tile atIndex:0]; 152 | [visibleTiles addObject:tile]; 153 | } 154 | 155 | - (void)reuseHiddenTiles{ 156 | NSMutableArray *toReuse = [[NSMutableArray alloc] init]; 157 | 158 | CGRect b = self.bounds; 159 | CGFloat contentOffsetY = self.contentOffset.y; 160 | float pixelMargin = rowHeight * ([layout preLoadMultiplier]); 161 | 162 | CGFloat firstY = (b.size.height + contentOffsetY + pixelMargin); 163 | CGFloat secondY = contentOffsetY - pixelMargin; 164 | 165 | for(CHTileView *tile in visibleTiles){ 166 | CGRect r = tile.frame; 167 | if(r.origin.y > firstY || r.origin.y + r.size.height < secondY){ 168 | [toReuse addObject:tile]; 169 | if(reusableTiles.count < maxReusable) [reusableTiles addObject:tile]; 170 | } 171 | } 172 | 173 | [visibleTiles removeObjectsInArray:toReuse]; 174 | [toReuse release]; 175 | } 176 | 177 | - (void)removeSectionTitleNotInRange:(CHSectionRange)range{ 178 | NSMutableArray *toDelete = [NSMutableArray array]; 179 | 180 | for (CHSectionHeaderView *header in visibleSectionHeaders) { 181 | int s = header.section; 182 | if(s < range.start || s > range.end){ 183 | [toDelete addObject:header]; 184 | } 185 | } 186 | 187 | [toDelete makeObjectsPerformSelector:@selector(removeFromSuperview)]; 188 | [visibleSectionHeaders removeObjectsInArray:toDelete]; 189 | } 190 | 191 | - (void)reloadData{ 192 | [self reloadDataAndLayoutUpdateNeeded:YES]; 193 | } 194 | 195 | - (void)reloadDataAndLayoutUpdateNeeded:(BOOL)layoutNeeded{ 196 | if(dataSource == nil) return; 197 | 198 | [self removeAllSubviews]; 199 | [visibleTiles removeAllObjects]; 200 | [visibleSectionHeaders removeAllObjects]; 201 | 202 | CGRect b = [self bounds]; 203 | 204 | if([dataSource respondsToSelector:@selector(numberOfSectionsInGridView:)]){ 205 | sections = [dataSource numberOfSectionsInGridView:self]; 206 | if(sections == 0) sections = 1; 207 | }else { 208 | sections = 1; 209 | } 210 | 211 | [sectionCounts removeAllObjects]; 212 | 213 | if(layoutNeeded){ 214 | [layout setGridWidth:b.size.width]; 215 | [layout setPadding:padding]; 216 | [layout setPerLine:perLine]; 217 | [layout setPreLoadMultiplier:preLoadMultiplier]; 218 | [layout setRowHeight:rowHeight]; 219 | [layout setSectionTitleHeight:sectionTitleHeight]; 220 | 221 | [layout setSections:sections]; 222 | int i; 223 | for(i = 0; i < sections; i++){ 224 | int numberInSection = [dataSource numberOfTilesInSection:i GridView:self]; 225 | [sectionCounts addObject:[NSNumber numberWithInt:numberInSection]]; 226 | [layout setNumberOfTiles:numberInSection ForSectionIndex:i]; 227 | } 228 | 229 | [layout updateLayout]; 230 | } 231 | 232 | [self setNeedsLayout]; 233 | 234 | maxReusable = ceilf((self.bounds.size.height / rowHeight) * perLine) * 2; 235 | 236 | if([layout contentHeight] > b.size.height) 237 | [self setContentSize:CGSizeMake(b.size.width, [layout contentHeight])]; 238 | else 239 | [self setContentSize:CGSizeMake(b.size.width, b.size.height + 1.0)]; 240 | } 241 | 242 | - (CHTileView *)dequeueReusableTileWithIdentifier:(NSString *)identifier{ 243 | CHTileView *foundTile = nil; 244 | BOOL found = NO; 245 | 246 | for(CHTileView *tile in reusableTiles){ 247 | if(!found && [[tile reuseIdentifier] isEqualToString:identifier]){ 248 | foundTile = tile; 249 | found = YES; 250 | } 251 | } 252 | 253 | if(foundTile){ 254 | [[foundTile retain] autorelease]; 255 | [reusableTiles removeObject:foundTile]; 256 | } 257 | 258 | return foundTile; 259 | } 260 | 261 | #pragma mark view and layout methods 262 | 263 | - (void)layoutSubviews{ 264 | if(dataSource == nil) return; 265 | 266 | CGRect b = [self bounds]; 267 | 268 | [self reuseHiddenTiles]; 269 | 270 | CGFloat contentOffsetY = self.contentOffset.y; 271 | CGFloat pixelMargin = rowHeight * [layout preLoadMultiplier]; 272 | CGFloat firstY = (b.size.height + contentOffsetY + pixelMargin); 273 | CGFloat secondY = contentOffsetY - pixelMargin; 274 | 275 | BOOL hasSections = (sections > 1); 276 | 277 | if(hasSections){ 278 | CHSectionRange sectionRange = [layout sectionRangeForContentOffset:contentOffsetY andHeight:b.size.height]; 279 | [self loadVisibleSectionTitlesForSectionRange:sectionRange]; 280 | [self calculateSectionTitleOffset]; 281 | 282 | } 283 | 284 | for(CHGridLayoutTile *tile in [layout justTiles]){ 285 | CGRect r = [tile rect]; 286 | if(r.origin.y < firstY && r.origin.y + r.size.height > secondY){ 287 | [self loadVisibleTileForIndexPath:tile.indexPath withRect:r]; 288 | } 289 | } 290 | 291 | //if([[self delegate] respondsToSelector:@selector(visibleTilesChangedTo:)]) [[self delegate] visibleTilesChangedTo:visibleTiles.count]; 292 | } 293 | 294 | - (void)removeAllSubviews{ 295 | [visibleTiles makeObjectsPerformSelector:@selector(removeFromSuperview)]; 296 | [visibleSectionHeaders makeObjectsPerformSelector:@selector(removeFromSuperview)]; 297 | [reusableTiles makeObjectsPerformSelector:@selector(removeFromSuperview)]; 298 | } 299 | 300 | #pragma mark tiles accessor methods 301 | 302 | - (CHTileView *)tileForIndexPath:(CHGridIndexPath)indexPath{ 303 | CHTileView *foundTile = nil; 304 | 305 | for(CHTileView *tile in visibleTiles){ 306 | if(tile.indexPath.section == indexPath.section && tile.indexPath.tileIndex == indexPath.tileIndex) 307 | foundTile = tile; 308 | } 309 | 310 | return foundTile; 311 | } 312 | 313 | - (NSMutableArray *)tilesForSection:(int)section{ 314 | NSMutableArray *array = [NSMutableArray array]; 315 | 316 | for(CHTileView *tile in visibleTiles){ 317 | if(tile.indexPath.section == section){ 318 | [array addObject:tile]; 319 | } 320 | } 321 | 322 | if(array.count > 0) return array; 323 | return nil; 324 | } 325 | 326 | - (NSMutableArray *)tilesFromIndex:(int)startIndex toIndex:(int)endIndex inSection:(int)section{ 327 | NSMutableArray *array = [NSMutableArray array]; 328 | 329 | for(CHTileView *tile in visibleTiles){ 330 | if(tile.indexPath.section == section && tile.indexPath.tileIndex >= startIndex && tile.indexPath.tileIndex <= endIndex){ 331 | [array addObject:tile]; 332 | } 333 | } 334 | 335 | if(array.count > 0) return array; 336 | return nil; 337 | } 338 | 339 | #pragma mark section title accessor methods 340 | 341 | - (CHSectionHeaderView *)sectionHeaderViewForSection:(int)section{ 342 | CHSectionHeaderView *headerView = nil; 343 | 344 | for(CHSectionHeaderView *header in visibleSectionHeaders){ 345 | if([header section] == section) headerView = header; 346 | } 347 | 348 | return headerView; 349 | } 350 | 351 | #pragma mark indexPath accessor methods 352 | 353 | - (CHGridIndexPath)indexPathForPoint:(CGPoint)point{ 354 | return CHGridIndexPathMake(0, 0); 355 | } 356 | 357 | #pragma mark tile scrolling methods 358 | 359 | - (void)scrollToTileAtIndexPath:(CHGridIndexPath)indexPath animated:(BOOL)animated{ 360 | CGRect r = [layout tileFrameForIndexPath:indexPath]; 361 | [self scrollRectToVisible:r animated:animated]; 362 | } 363 | 364 | #pragma mark selection methods 365 | 366 | - (void)deselectTileAtIndexPath:(CHGridIndexPath)indexPath{ 367 | for(CHTileView *tile in visibleTiles){ 368 | if(tile.indexPath.section == indexPath.section && tile.indexPath.tileIndex == indexPath.tileIndex){ 369 | [tile setSelected:NO]; 370 | selectedTile = nil; 371 | } 372 | } 373 | } 374 | 375 | - (void)deselectSelectedTile{ 376 | if(selectedTile){ 377 | [self deselectTileAtIndexPath:selectedTile.indexPath]; 378 | selectedTile = nil; 379 | } 380 | } 381 | 382 | #pragma mark property setters and getters 383 | 384 | - (id)delegate { 385 | return (id)[super delegate]; 386 | } 387 | 388 | - (void)setDelegate:(id)d{ 389 | [super setDelegate:d]; 390 | } 391 | 392 | - (void)setDataSource:(id)d{ 393 | dataSource = d; 394 | } 395 | 396 | - (void)setCenterTilesInGrid:(BOOL)b{ 397 | centerTilesInGrid = b; 398 | [self setNeedsLayout]; 399 | } 400 | 401 | - (void)setAllowsSelection:(BOOL)allows{ 402 | allowsSelection = allows; 403 | } 404 | 405 | #pragma mark touch methods 406 | 407 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 408 | [super touchesBegan:touches withEvent:event]; 409 | UITouch *touch = [[event allTouches] anyObject]; 410 | CGPoint location = [touch locationInView:self]; 411 | 412 | UIView *view = [self hitTest:location withEvent:event]; 413 | 414 | if([view isKindOfClass:[CHTileView class]] && allowsSelection){ 415 | if(selectedTile) 416 | [self deselectTileAtIndexPath:selectedTile.indexPath]; 417 | 418 | selectedTile = (CHTileView *)view; 419 | [selectedTile setSelected:YES]; 420 | } 421 | } 422 | 423 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 424 | [super touchesMoved:touches withEvent:event]; 425 | 426 | if(self.dragging || self.tracking || self.decelerating && allowsSelection){ 427 | if(selectedTile != nil){ 428 | [selectedTile setSelected:NO]; 429 | selectedTile = nil; 430 | } 431 | } 432 | } 433 | 434 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 435 | [super touchesEnded:touches withEvent:event]; 436 | UITouch *touch = [[event allTouches] anyObject]; 437 | CGPoint location = [touch locationInView:self]; 438 | 439 | UIView *view = [self hitTest:location withEvent:event]; 440 | 441 | if(selectedTile != nil && [selectedTile isEqual:view] && allowsSelection){ 442 | if([[self delegate] respondsToSelector:@selector(selectedTileAtIndexPath:inGridView:)]) 443 | [[self delegate] selectedTileAtIndexPath:[selectedTile indexPath] inGridView:self]; 444 | } 445 | } 446 | 447 | #pragma mark section title view offset 448 | 449 | - (void)calculateSectionTitleOffset{ 450 | float offset = self.contentOffset.y; 451 | 452 | for(CHSectionHeaderView *header in visibleSectionHeaders){ 453 | CGRect f = [header frame]; 454 | float sectionY = [header yCoordinate]; 455 | 456 | if(sectionY <= offset && offset > 0.0f){ 457 | f.origin.y = offset; 458 | if(offset <= 0.0f) f.origin.y = sectionY; 459 | 460 | CHSectionHeaderView *sectionTwo = [self sectionHeaderViewForSection:header.section + 1]; 461 | if(sectionTwo != nil){ 462 | CGFloat sectionTwoHeight = sectionTwo.frame.size.height; 463 | CGFloat sectionTwoY = sectionTwo.yCoordinate; 464 | if((offset + sectionTwoHeight) >= sectionTwoY){ 465 | f.origin.y = sectionTwoY - sectionTwoHeight; 466 | } 467 | } 468 | }else{ 469 | f.origin.y = sectionY; 470 | } 471 | 472 | if(f.origin.y <= offset) [header setOpaque:NO]; 473 | else [header setOpaque:YES]; 474 | 475 | [header setFrame:f]; 476 | } 477 | } 478 | 479 | @end 480 | -------------------------------------------------------------------------------- /CHImageTileView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHImageTileView.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | #import "CHTileView.h" 13 | 14 | @interface CHImageTileView : CHTileView { 15 | UIImage *image; 16 | BOOL scalesImageToFit; 17 | } 18 | 19 | @property (nonatomic, retain) UIImage *image; 20 | @property (nonatomic) BOOL scalesImageToFit; // don't use this EVER 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /CHImageTileView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHImageTileView.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #include . 12 | #import "CHImageTileView.h" 13 | 14 | @implementation CHImageTileView 15 | @synthesize image, scalesImageToFit; 16 | 17 | - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseId{ 18 | if(self = [super initWithFrame:frame reuseIdentifier:reuseId]){ 19 | if(image == nil) 20 | image = [[UIImage alloc] init]; 21 | 22 | scalesImageToFit = YES; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)setImage:(UIImage *)i{ 28 | [image release]; 29 | image = [i retain]; 30 | } 31 | 32 | - (void)drawContentRect:(CGRect)rect{ 33 | CGContextRef c = UIGraphicsGetCurrentContext(); 34 | CGSize imageSize = [image size]; 35 | 36 | float newWidth = 0.0f; 37 | float newHeight = 0.0f; 38 | float leftOffset = rect.origin.x; 39 | float topOffset = rect.origin.y; 40 | 41 | if(scalesImageToFit){ 42 | float size = fmax(rect.size.width, rect.size.height); 43 | 44 | float widthScale = imageSize.width / size; 45 | float heightScale = imageSize.height / size; 46 | 47 | float scale = fmin(widthScale, heightScale); 48 | 49 | newWidth = imageSize.width / scale; 50 | newHeight = imageSize.height / scale; 51 | }else{ 52 | newWidth = imageSize.width; 53 | newHeight = imageSize.height; 54 | } 55 | 56 | if(rect.size.height < newHeight) topOffset += ceil((rect.size.height - newHeight) / 2); 57 | if(rect.size.width < newWidth) leftOffset += ceil((rect.size.width - newWidth) / 2); 58 | 59 | CGRect imageRect = CGRectMake(leftOffset, topOffset, newWidth, newHeight); 60 | 61 | CGContextSaveGState(c); 62 | CGContextTranslateCTM(c, 0.0f, rect.size.height + rect.origin.y); 63 | CGContextScaleCTM(c, 1.0f, -1.0f); 64 | CGContextDrawImage(c, imageRect, [image CGImage]); 65 | CGContextRestoreGState(c); 66 | 67 | //draw border 68 | 69 | CGRect borderRect = CGRectIntersection(rect, imageRect); 70 | if(borderRect.size.height < rect.size.height) borderRect.size.height = rect.size.height; 71 | 72 | CGContextClipToRect(c, borderRect); 73 | 74 | //CGContextSetStrokeColorWithColor(c, [[UIColor colorWithWhite:1.0f alpha:0.15f] CGColor]); 75 | //CGContextStrokeRectWithWidth(c, rect, 4.0f); 76 | 77 | CGContextSetStrokeColorWithColor(c, [[UIColor colorWithWhite:0.0f alpha:0.4f] CGColor]); 78 | CGContextStrokeRectWithWidth(c, rect, 2.0f); 79 | 80 | /*NSString *title = [NSString stringWithFormat:@"%i",indexPath.tileIndex]; 81 | float textWidth = rect.size.width - (15.0 * 2); 82 | UIFont *f = [UIFont boldSystemFontOfSize:16.0]; 83 | 84 | [[UIColor whiteColor] set]; 85 | CGContextSetShadow(c, CGSizeMake(0, -1.0), 1.0); 86 | 87 | CGSize fontSize = [title sizeWithFont:f forWidth:textWidth lineBreakMode:UILineBreakModeTailTruncation]; 88 | [title drawInRect:CGRectMake(15.0, ceil((rect.size.height - fontSize.height) / 2), textWidth, fontSize.height) withFont:f lineBreakMode:UILineBreakModeTailTruncation alignment:UITextAlignmentCenter];*/ 89 | } 90 | 91 | @end 92 | -------------------------------------------------------------------------------- /CHSectionHeaderView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHSectionTitleView.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | 13 | @interface CHSectionHeaderView : UIView { 14 | UIView *topLine; 15 | 16 | int section; 17 | NSString *title; 18 | CGFloat yCoordinate; 19 | } 20 | 21 | @property (nonatomic) int section; 22 | @property (nonatomic, retain) NSString *title; 23 | @property (nonatomic) CGFloat yCoordinate; 24 | 25 | //subclasses should implement drawRect: but must draw title on their own 26 | 27 | @end -------------------------------------------------------------------------------- /CHSectionHeaderView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHSectionTitle.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHSectionHeaderView.h" 12 | 13 | @implementation CHSectionHeaderView 14 | @synthesize section, title, yCoordinate; 15 | 16 | - (id)initWithFrame:(CGRect)frame { 17 | if ((self = [super initWithFrame:frame])) { 18 | if(title == nil) 19 | title = [[NSString alloc] initWithString:@""]; 20 | 21 | if(topLine == nil) 22 | topLine = [[UIView alloc] init]; 23 | 24 | [topLine setBackgroundColor:[UIColor colorWithHue:0.56f saturation:0.15f brightness:0.52f alpha:1.0f]]; 25 | [topLine setOpaque:YES]; 26 | [self addSubview:topLine]; 27 | 28 | [self setOpaque:YES]; 29 | [self setBackgroundColor:[UIColor colorWithWhite:1.0f alpha:1.0f]]; 30 | [self setContentMode:UIViewContentModeRedraw]; 31 | } 32 | return self; 33 | } 34 | 35 | - (void)dealloc { 36 | [topLine release]; 37 | [title release]; 38 | [super dealloc]; 39 | } 40 | 41 | - (void)setSection:(int)s{ 42 | section = s; 43 | 44 | if([title isEqualToString:@""]){ 45 | [self setTitle:[NSString stringWithFormat:@"Section %i", section]]; 46 | } 47 | } 48 | 49 | - (void)setOpaque:(BOOL)b{ 50 | [super setOpaque:b]; 51 | if(b) [self setBackgroundColor:[UIColor whiteColor]]; 52 | else [self setBackgroundColor:[UIColor clearColor]]; 53 | } 54 | 55 | - (void)layoutSubviews{ 56 | CGRect b = self.bounds; 57 | [topLine setFrame:CGRectMake(b.origin.x, b.origin.y - 1.0f, b.size.width, 1.0f)]; 58 | } 59 | 60 | - (void)drawRect:(CGRect)rect { 61 | //subclasses should implement drawRect: but must draw title on their own 62 | CGContextRef c = UIGraphicsGetCurrentContext(); 63 | 64 | CGRect b = self.bounds; 65 | float padding = 10.0f; 66 | float fontHeight = floor(b.size.height * 0.60f); 67 | if(fontHeight > 20.0f) fontHeight = 20.0f; 68 | 69 | //graw gradient 70 | 71 | CGGradientRef tabGradient; 72 | CGColorSpaceRef rgbColorspace; 73 | size_t num_locations = 2; 74 | 75 | float gradientOpacity = 0.85f; 76 | 77 | CGFloat locations[2] = { 0.0, 1.0 }; 78 | 79 | // RGBA values for start and end colors 80 | CGFloat components[8] = { 0.572f, 0.627f, 0.670f, gradientOpacity, // Start color 81 | 0.721f, 0.756f, 0.784f, gradientOpacity }; // End color 82 | 83 | rgbColorspace = CGColorSpaceCreateDeviceRGB(); 84 | tabGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 85 | 86 | CGRect currentBounds = self.bounds; 87 | CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f); 88 | CGPoint bottomCenter = CGPointMake(CGRectGetMidX(currentBounds), currentBounds.size.height); 89 | CGContextDrawLinearGradient(c, tabGradient, topCenter, bottomCenter, 0); 90 | 91 | CGGradientRelease(tabGradient); 92 | CGColorSpaceRelease(rgbColorspace); 93 | 94 | //draw lines 95 | 96 | [[UIColor colorWithWhite:1.0f alpha:0.2f] set]; 97 | CGContextFillRect(c, CGRectMake(b.origin.x, b.origin.y, b.size.width, 1.0f)); 98 | 99 | [[UIColor colorWithHue:0.42f saturation:0.07f brightness:0.64f alpha:1.0f] set]; 100 | CGContextFillRect(c, CGRectMake(b.origin.x, b.size.height - 1.0f, b.size.width, 1.0f)); 101 | 102 | //draw title 103 | 104 | float textWidth = b.size.width - (padding * 2.0f); 105 | UIFont *f = [UIFont boldSystemFontOfSize:fontHeight]; 106 | 107 | [[UIColor whiteColor] set]; 108 | CGContextSetShadow(c, CGSizeMake(0, -1.0f), 1.0f); 109 | 110 | CGSize fontSize = [title sizeWithFont:f forWidth:textWidth lineBreakMode:UILineBreakModeTailTruncation]; 111 | [title drawInRect:CGRectMake(padding, ceil((b.size.height - fontSize.height) / 2), textWidth, fontSize.height) withFont:f lineBreakMode:UILineBreakModeTailTruncation alignment:UITextAlignmentLeft]; 112 | } 113 | 114 | - (NSString *)description{ 115 | return [NSString stringWithFormat:@"%@ section index = %i", [super description], section]; 116 | } 117 | 118 | @end -------------------------------------------------------------------------------- /CHTileView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CHTileView.h 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import 12 | 13 | struct CHGridIndexPath { 14 | int section; 15 | int tileIndex; 16 | }; 17 | typedef struct CHGridIndexPath CHGridIndexPath; 18 | 19 | static CHGridIndexPath CHGridIndexPathMake(int section, int tileIndex){ 20 | CHGridIndexPath index; index.section = section; index.tileIndex = tileIndex; return index; 21 | } 22 | 23 | @interface CHTileView : UIView { 24 | NSString *reuseIdentifier; 25 | CHGridIndexPath indexPath; 26 | CGSize padding; 27 | 28 | BOOL selected; 29 | BOOL highlighted; 30 | 31 | UIColor *contentBackgroundColor; 32 | 33 | CGSize shadowOffset; 34 | UIColor *shadowColor; 35 | CGFloat shadowBlur; 36 | } 37 | 38 | @property (nonatomic) CHGridIndexPath indexPath; 39 | @property (nonatomic, readonly, copy) NSString *reuseIdentifier; 40 | 41 | @property (nonatomic) BOOL selected; 42 | @property (nonatomic) BOOL highlighted; 43 | 44 | @property (nonatomic, retain) UIColor *contentBackgroundColor; 45 | 46 | @property (nonatomic) CGSize shadowOffset; 47 | @property (nonatomic, retain) UIColor *shadowColor; 48 | @property (nonatomic) CGFloat shadowBlur; 49 | 50 | - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseId; 51 | 52 | // sub classes must implement drawContentRect: 53 | - (void)drawContentRect:(CGRect)rect; 54 | - (void)unselect; 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /CHTileView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CHTileView.m 3 | // 4 | // RELEASED UNDER THE MIT LICENSE 5 | // 6 | // Created by Cameron Kenly Hunt on 2/18/10. 7 | // Copyright 2010 Cameron Kenley Hunt All rights reserved. 8 | // http://cameron.io/project/chgridview 9 | // 10 | 11 | #import "CHTileView.h" 12 | 13 | @implementation CHTileView 14 | @synthesize indexPath, selected, highlighted, contentBackgroundColor, reuseIdentifier, shadowOffset, shadowColor, shadowBlur; 15 | 16 | - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseId{ 17 | if(self = [super initWithFrame:frame]){ 18 | indexPath = CHGridIndexPathMake(0, 0); 19 | selected = NO; 20 | reuseIdentifier = [reuseId copy]; 21 | 22 | if(contentBackgroundColor == nil) 23 | contentBackgroundColor = [[UIColor whiteColor] retain]; 24 | 25 | shadowOffset = CGSizeMake(0.0f, 0.0f); 26 | shadowColor = [[UIColor colorWithWhite:0.0f alpha:0.5f] retain]; 27 | shadowBlur = 0.0f; 28 | 29 | [self setOpaque:YES]; 30 | [self setContentMode:UIViewContentModeRedraw]; 31 | } 32 | return self; 33 | } 34 | 35 | - (void)dealloc { 36 | [shadowColor release]; 37 | [reuseIdentifier release]; 38 | [super dealloc]; 39 | } 40 | 41 | - (void)setSelected:(BOOL)s{ 42 | selected = s; 43 | [self setNeedsDisplay]; 44 | } 45 | 46 | - (void)unselect{ 47 | [self setSelected:NO]; 48 | } 49 | 50 | - (void)setIndexPath:(CHGridIndexPath)index{ 51 | indexPath = index; 52 | } 53 | 54 | - (void)drawRect:(CGRect)rect{ 55 | CGContextRef c = UIGraphicsGetCurrentContext(); 56 | 57 | CGSize newShadowOffset; 58 | 59 | #ifdef __IPHONE_3_2 60 | newShadowOffset = CGSizeMake(shadowOffset.width, shadowOffset.height); 61 | #else 62 | newShadowOffset = CGSizeMake(shadowOffset.width, -shadowOffset.height); 63 | #endif 64 | 65 | CGRect contentRect = CGRectInset(rect, shadowBlur, shadowBlur); 66 | if(newShadowOffset.height < 0) contentRect.size.height -= fabsf(newShadowOffset.height); 67 | if(newShadowOffset.height > 0) contentRect.size.height -= fabsf(newShadowOffset.height); 68 | if(newShadowOffset.width < 0) contentRect.size.width -= fabsf(newShadowOffset.width); 69 | if(newShadowOffset.width > 0) contentRect.size.width -= fabsf(newShadowOffset.width); 70 | 71 | //draw shadow 72 | 73 | if((newShadowOffset.height > 0 || newShadowOffset.width > 0 || shadowBlur > 0) && !selected){ 74 | CGContextSaveGState(c); 75 | CGContextSetShadowWithColor(c, newShadowOffset, shadowBlur, [shadowColor CGColor]); 76 | [contentBackgroundColor set]; 77 | CGContextFillRect(c, contentRect); 78 | CGContextRestoreGState(c); 79 | }else{ 80 | [contentBackgroundColor set]; 81 | CGContextFillRect(c, contentRect); 82 | } 83 | 84 | CGContextClipToRect(c, contentRect); 85 | [self drawContentRect:contentRect]; 86 | 87 | if(selected){ 88 | [[UIColor colorWithWhite:0.0f alpha:0.3f] set]; 89 | CGContextFillRect(c, contentRect); 90 | } 91 | } 92 | 93 | - (void)drawContentRect:(CGRect)rect{ 94 | // subclass me and override this method 95 | } 96 | 97 | - (NSString *)description{ 98 | return [NSString stringWithFormat:@"CHTileView, section = %i tileIndex = %i x = %f y = %f w = %f h = %f", indexPath.section, indexPath.tileIndex, self.frame.origin.x, self.frame.origin.x, self.frame.size.width, self.frame.size.height]; 99 | } 100 | 101 | @end -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2010 Cameron Kenley Hunt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | #CHGridView 2 | 3 | ![A screenshot of CHGridView](http://cameron.io/files/CHGridView-sizedToGrid.png) ![A second screenshot of CHGridView](http://cameron.io/files/CHGridView-centered.png) 4 | 5 | (Above is two screenshots of CHGridView with CHImageTileView, one with Photos-style layout, and another with iPhoto-style layout.) 6 | 7 | ###About: 8 | 9 | I want this to be the last grid view I make. Right now, it's basically a UITableView clone with tiles instead of cells, but in the future I want it to be customizable and flexible enough to reproduce paged icon views, handle un-scrollable grids, display 2000 images, show iPad-like photo stacks with pinch-to-open, and anything else that can be represented with a grid. 10 | 11 | CHGridView is modeled after UITableView. You initialize CHGridView, set a delegate and data source, then give it tiles. It's designed to be as easy to use as UITableView. 12 | 13 | NOTICE: **CHGridView is not production-level software yet. Don't use it in shipping software.** 14 | 15 | ###Description of classes: 16 | 17 | - CHGridView: UIScrollView subclass that handles loading and display of tiles and section titles. 18 | - CHTileView: UIView subclass to draw content, intended to be subclassed for specific use. 19 | - CHImageTileView: CHTileView subclass to easily display images with a border, similar to Apple's Photos application. 20 | - CHSectionHeaderView: UIView subclass to display section headers, can be subclassed and used for custom section titles. 21 | - CHGridLayout: Computes layout and caches it in a big array, making it easy for CHGridView to only display visible tiles and section titles. 22 | - CHGridLayoutTile: Simple object that stores `indexPath` and `rect` for a tile. 23 | - CHGridLayoutSection: Simple object to store section index and its Y co-ordinate position. 24 | 25 | ###Usage: 26 | 27 | Exactly like UITableView. Just implement the two required data source methods: `numberOfTilesInSection` and `tileForIndexPath`. CHGridView assumes there is at least one section. The method `tileForIndexPath` works very much like UITableView; CHGridView reuses tiles like UITableView reuses cells. Call `dequeueReusableTileWithIdentifier` to get a reusable tile, if it's `nil`, `init` and `autorelease` a new tile and return it. 28 | 29 | There's two basic styles to use in GHGridView, one that resembles the Photos application, and one that mimics iPhoto and the iPad photo grid. The property that controls it is called `centerTilesInGrid`. Set it to `YES` for the iPhoto style. If you want the iPhoto style, you need to make sure `rowHeight` is higher than your tallest image. 30 | 31 | Row height, tiles per line, padding, section title height and shadow are all properties of CHGridView. These are not meant to change often like the data source and delegate methods. However, if you do change them, make sure to call `reloadData` to recalculate the layout. 32 | 33 | Shadows are drawn in Core Graphics and add to your padding. Adjust shadow properties and padding until a desirable result is achieved. 34 | 35 | Orientation changes and resizing are supported. Section titles and tiles are set to the correct autoresizing mask, but you should call `reloadData` after you resize CHGridView for optimal re-layout, same goes for re-orientation. 36 | 37 | If you disable scrolling with `setScrollingEnabled`, you can probably use this as a un-scrollable grid view, but I haven't tested it. 38 | 39 | ###Behind the scenes: 40 | 41 | CHGridView only loads visible tiles and section titles, plus four rows above and beneath (on the Original iPhone, iPhone 3G or first-generation iPod Touch, it only loads two rows). There's only about 30 or 50 tiles loaded at any single time. 42 | 43 | CHGridView, like most scalable computer interfaces, makes trade-offs. It's currently optimized to for low memory usage, but requires more processor cyles. Performance is roughly the same if you use 3000 tiles or 200 tiles. Optimally CHGridView should be smart enough to switch this trade-off at some point (if < 400 tiles, for instance). 44 | 45 | - CHTileView shadows are not transparent, they are rendered onto the same background color as CHGridView. It's possible to change it if you long for the scrolling performance of Android or Palm webOS. 46 | - Section headers are only transparent when they need to be, otherwise they are opaque. If you subclass CHSectionHeaderView, you'll need to check `[self isOpaque]` to compensate for transparency if needed. 47 | 48 | ###Roadmap (roughly in order): 49 | 50 | - Match or exceed speed and performance found in iPhone's Photos app grid view 51 | - More UITableView cloning, like scrolling to a tile at a specific indexPath 52 | - Footer labels (with dynamic height) and footer views 53 | - Tile labels 54 | - Flexible per-line setting (maybe a range?) 55 | - Horizontal scrolling and paging support 56 | - Add/remove tile animation 57 | - Multiple selection support 58 | - Nice re-ordering 59 | 60 | ###Performance: 61 | 62 | I've tested CHGridView informally with a test application on both my iPhones. For my data source, I used 31 images to populate 2,976 tiles separated into 96 sections. They were exported from iPhoto as PNGs with a maximum width of 160 pixels, then were drawn centered and cropped in CHImageTileView. Scrolling performance is not as good as Apple's Photos grid view, especially on my original iPhone. 63 | 64 | - Original iPhone: about 18 - 35 fps. 65 | - iPhone 3G3: about 30 - 50 fps. 66 | 67 | Admittedly, performance could be better. If you see something that could be improved, send an email to [me@cameron.io](mailto:me@cameron.io). 68 | --------------------------------------------------------------------------------