├── .gitignore ├── PanelTableView ├── Classes │ ├── PanelIndexPath.h │ ├── PanelIndexPath.m │ ├── PanelTableViewAppDelegate.h │ ├── PanelTableViewAppDelegate.m │ ├── PanelView.h │ ├── PanelView.m │ ├── PanelsViewController.h │ └── PanelsViewController.m ├── MainWindow.xib ├── PanelTableView-Info.plist ├── PanelTableView.xcodeproj │ ├── honcheng.mode1v3 │ ├── honcheng.pbxuser │ └── project.pbxproj ├── PanelTableView_Prefix.pch └── main.m ├── README.md ├── blog-resources └── plan.png └── sample project └── SampleApp ├── Classes ├── SampleAppAppDelegate.h ├── SampleAppAppDelegate.m ├── SamplePanelView.h ├── SamplePanelView.m ├── SamplePanelsViewController.h ├── SamplePanelsViewController.m ├── SamplePanelsViewControllerForiPad.h └── SamplePanelsViewControllerForiPad.m ├── MainWindow.xib ├── Resources-iPad └── MainWindow-iPad.xib ├── SampleApp-Info.plist ├── SampleApp.xcodeproj ├── honcheng.mode1v3 ├── honcheng.pbxuser ├── honcheng.perspectivev3 └── project.pbxproj ├── SampleApp_Prefix.pch └── main.m /.gitignore: -------------------------------------------------------------------------------- 1 | resources/plan.psd 2 | blog-resources/plan.psd 3 | blog-resources/paneltableview-demo.mov 4 | PanelTableView/PanelTableView.xcodeproj/project.xcworkspace/xcuserdata/honcheng.xcuserdatad/UserInterfaceState.xcuserstate 5 | PanelTableView/PanelTableView.xcodeproj/xcuserdata/honcheng.xcuserdatad/xcschemes/PanelTableView.xcscheme 6 | PanelTableView/PanelTableView.xcodeproj/xcuserdata/honcheng.xcuserdatad/xcschemes/xcschememanagement.plist 7 | sample project/SampleApp/SampleApp.xcodeproj/project.xcworkspace/xcuserdata/honcheng.xcuserdatad/UserInterfaceState.xcuserstate 8 | sample project/SampleApp/SampleApp.xcodeproj/xcuserdata/honcheng.xcuserdatad/xcschemes/SampleApp.xcscheme 9 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelIndexPath.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import 35 | 36 | @interface PanelIndexPath : NSObject 37 | @property (nonatomic, assign) int page, section, row; 38 | - (id)initWithRow:(int)_row section:(int)_section page:(int)_page; 39 | + (id)panelIndexPathForRow:(int)_row section:(int)_section page:(int)_page; 40 | + (id)panelIndexPathForPage:(int)_page indexPath:(NSIndexPath*)indexPath; 41 | @end 42 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelIndexPath.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import "PanelIndexPath.h" 35 | 36 | 37 | @implementation PanelIndexPath 38 | 39 | - (id)initWithRow:(int)row section:(int)section page:(int)page 40 | { 41 | if (self = [super init]) 42 | { 43 | _row = row; 44 | _section = section; 45 | _page = page; 46 | } 47 | return self; 48 | } 49 | 50 | + (id)panelIndexPathForRow:(int)row section:(int)section page:(int)page 51 | { 52 | return [[self alloc] initWithRow:row section:section page:page]; 53 | } 54 | 55 | + (id)panelIndexPathForPage:(int)page indexPath:(NSIndexPath*)indexPath 56 | { 57 | return [[self alloc] initWithRow:indexPath.row section:indexPath.section page:page]; 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelTableViewAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // PanelTableViewAppDelegate.h 3 | // PanelTableView 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PanelTableViewAppDelegate : NSObject { 12 | UIWindow *window; 13 | } 14 | 15 | @property (nonatomic, retain) IBOutlet UIWindow *window; 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelTableViewAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // PanelTableViewAppDelegate.m 3 | // PanelTableView 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import "PanelTableViewAppDelegate.h" 10 | 11 | @implementation PanelTableViewAppDelegate 12 | 13 | @synthesize window; 14 | 15 | 16 | #pragma mark - 17 | #pragma mark Application lifecycle 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | 21 | // Override point for customization after application launch. 22 | 23 | [self.window makeKeyAndVisible]; 24 | 25 | return YES; 26 | } 27 | 28 | 29 | - (void)applicationWillResignActive:(UIApplication *)application { 30 | /* 31 | Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 32 | Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 33 | */ 34 | } 35 | 36 | 37 | - (void)applicationDidEnterBackground:(UIApplication *)application { 38 | /* 39 | Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 40 | If your application supports background execution, called instead of applicationWillTerminate: when the user quits. 41 | */ 42 | } 43 | 44 | 45 | - (void)applicationWillEnterForeground:(UIApplication *)application { 46 | /* 47 | Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. 48 | */ 49 | } 50 | 51 | 52 | - (void)applicationDidBecomeActive:(UIApplication *)application { 53 | /* 54 | Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 55 | */ 56 | } 57 | 58 | 59 | - (void)applicationWillTerminate:(UIApplication *)application { 60 | /* 61 | Called when the application is about to terminate. 62 | See also applicationDidEnterBackground:. 63 | */ 64 | } 65 | 66 | 67 | #pragma mark - 68 | #pragma mark Memory management 69 | 70 | - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 71 | /* 72 | Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. 73 | */ 74 | } 75 | 76 | 77 | - (void)dealloc { 78 | [window release]; 79 | [super dealloc]; 80 | } 81 | 82 | 83 | @end 84 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelView.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import 35 | #import "PanelIndexPath.h" 36 | #import 37 | 38 | @protocol PanelViewDelegate 39 | - (NSInteger)panelView:(id)panelView numberOfRowsInPage:(NSInteger)page section:(NSInteger)section; 40 | - (UITableViewCell *)panelView:(id)panelView cellForRowAtIndexPath:(PanelIndexPath *)indexPath; 41 | - (void)panelView:(id)panelView didSelectRowAtIndexPath:(PanelIndexPath *)indexPath; 42 | - (CGFloat)panelView:(id)panelView heightForRowAtIndexPath:(PanelIndexPath *)indexPath; 43 | - (NSInteger)panelView:(id)panelView numberOfSectionsInPage:(NSInteger)pageNumber; 44 | - (NSString*)panelView:(id)panelView titleForHeaderInPage:(NSInteger)pageNumber section:(NSInteger)section; 45 | @end 46 | 47 | @interface PanelView : UIView 48 | @property (nonatomic, assign) int pageNumber; 49 | @property (nonatomic, strong) UITableView *tableView; 50 | @property (nonatomic, unsafe_unretained) id delegate; 51 | @property (nonatomic, copy) NSString *identifier; 52 | 53 | - (id)initWithIdentifier:(NSString*)_identifier; 54 | - (void)reset; 55 | - (void)pageWillAppear; 56 | - (void)pageDidAppear; 57 | - (void)pageWillDisappear; 58 | - (CGAffineTransform)transformForOrientation; 59 | - (void)showPanel:(BOOL)show animated:(BOOL)animated; 60 | - (void)shouldWiggle:(BOOL)wiggle; 61 | 62 | #pragma mark offset save/restore 63 | - (void)saveTableviewOffset; 64 | - (void)restoreTableviewOffset; 65 | - (void)removeTableviewOffset; 66 | 67 | #pragma mark add and remove panels 68 | - (void)addPanelWithAnimation:(BOOL)animate; 69 | - (void)removePanelWithAnimation:(BOOL)animate; 70 | 71 | - (void)showNextPanel; 72 | - (void)showPreviousPanel; 73 | 74 | 75 | 76 | @end 77 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelView.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import "PanelView.h" 35 | 36 | @interface PanelView() 37 | - (void)show:(BOOL)show; 38 | @end 39 | 40 | @implementation PanelView 41 | 42 | - (id)initWithFrame:(CGRect)frame 43 | { 44 | if (self = [super initWithFrame:frame]) 45 | { 46 | [self setBackgroundColor:[UIColor whiteColor]]; 47 | 48 | _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,0,frame.size.width,frame.size.height)]; 49 | [self addSubview:_tableView]; 50 | [_tableView setDelegate:self]; 51 | [_tableView setDataSource:self]; 52 | [_tableView setScrollsToTop:NO]; 53 | } 54 | return self; 55 | } 56 | 57 | - (id)initWithIdentifier:(NSString*)identifier 58 | { 59 | if (self = [super init]) 60 | { 61 | _identifier = identifier; 62 | } 63 | return self; 64 | } 65 | 66 | - (void)setFrame:(CGRect)frame 67 | { 68 | [super setFrame:frame]; 69 | 70 | CGRect tableViewFrame = [self.tableView frame]; 71 | tableViewFrame.size.width = self.frame.size.width; 72 | tableViewFrame.size.height = self.frame.size.height; 73 | [self.tableView setFrame:tableViewFrame]; 74 | } 75 | 76 | - (void)reset 77 | { 78 | 79 | } 80 | 81 | - (void)pageWillAppear 82 | { 83 | [self.tableView reloadData]; 84 | [self restoreTableviewOffset]; 85 | } 86 | 87 | - (void)pageDidAppear 88 | { 89 | //NSLog(@"page did appear %i", pageNumber); 90 | //[self showPanel:YES animated:YES]; 91 | [self.tableView setScrollsToTop:YES]; 92 | 93 | } 94 | 95 | - (void)pageWillDisappear 96 | { 97 | [self.tableView setScrollsToTop:NO]; 98 | [self saveTableviewOffset]; 99 | } 100 | 101 | #pragma mark offset save/restore 102 | 103 | #define kTableOffset @"kTableOffset" 104 | 105 | - (void)saveTableviewOffset 106 | { 107 | CGPoint contentOffset = [self.tableView contentOffset]; 108 | float y = contentOffset.y; 109 | 110 | NSMutableArray *offsetArray = [[[NSUserDefaults standardUserDefaults] objectForKey:kTableOffset] mutableCopy]; 111 | if (!offsetArray) 112 | { 113 | offsetArray = [NSMutableArray array]; 114 | } 115 | 116 | if ([offsetArray count]self.pageNumber) 136 | { 137 | float y = [[offsetArray objectAtIndex:self.pageNumber] floatValue]; 138 | CGPoint contentOffset = CGPointMake(0, y); 139 | [self.tableView setContentOffset:contentOffset animated:NO]; 140 | } 141 | } 142 | } 143 | 144 | - (void)removeTableviewOffset 145 | { 146 | NSMutableArray *offsetArray = [[[NSUserDefaults standardUserDefaults] objectForKey:kTableOffset] mutableCopy]; 147 | if (offsetArray) 148 | { 149 | if ([offsetArray count]>self.pageNumber) 150 | { 151 | 152 | [offsetArray removeObjectAtIndex:self.pageNumber]; 153 | [[NSUserDefaults standardUserDefaults] setObject:offsetArray forKey:kTableOffset]; 154 | } 155 | } 156 | } 157 | 158 | #pragma mark add and remove panels 159 | 160 | - (void)addPanelWithAnimation:(BOOL)animate 161 | { 162 | if (animate) 163 | { 164 | [self showPanel:YES animated:YES]; 165 | } 166 | } 167 | 168 | - (void)removePanelWithAnimation:(BOOL)animate 169 | { 170 | if (animate) 171 | { 172 | [self showPanel:NO animated:YES]; 173 | [self performSelector:@selector(showNextPanel) withObject:nil afterDelay:0.9]; 174 | } 175 | } 176 | 177 | #pragma mark animation 178 | 179 | - (void)shouldWiggle:(BOOL)wiggle 180 | { 181 | if (wiggle) 182 | { 183 | [UIView beginAnimations:nil context:nil]; 184 | [UIView setAnimationDuration:0.1]; 185 | [UIView setAnimationRepeatAutoreverses:YES]; 186 | [UIView setAnimationRepeatCount:10000]; 187 | [self setTransform:CGAffineTransformMakeRotation(1*M_PI/180.0)]; 188 | [self setTransform:CGAffineTransformMakeRotation(-1*M_PI/180.0)]; 189 | [UIView commitAnimations]; 190 | } 191 | else 192 | { 193 | [self setTransform:CGAffineTransformMakeRotation(0)]; 194 | [self.layer removeAllAnimations]; 195 | } 196 | } 197 | 198 | #define kTransitionDuration 0.4 199 | 200 | - (void)showNextPanel 201 | { 202 | CGAffineTransform scaleTransform = CGAffineTransformScale([self transformForOrientation], 1, 1); 203 | [self setTransform:scaleTransform]; 204 | CGAffineTransform translateTransform = CGAffineTransformTranslate([self transformForOrientation], self.frame.size.width, 0); 205 | [self setTransform:translateTransform]; 206 | //[self setTransform:CGAffineTransformConcat(translateTransform, scaleTransform)]; 207 | 208 | [UIView beginAnimations:nil context:nil]; 209 | [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 210 | [UIView setAnimationDuration:0.2]; 211 | 212 | //scaleTransform = CGAffineTransformScale([self transformForOrientation], 1, 1); 213 | translateTransform = CGAffineTransformMakeTranslation(0, 0); 214 | //[self setTransform:CGAffineTransformConcat(scaleTransform, translateTransform)]; 215 | [self setTransform:translateTransform]; 216 | 217 | [UIView commitAnimations]; 218 | 219 | } 220 | 221 | - (void)showPreviousPanel 222 | { 223 | CGAffineTransform scaleTransform = CGAffineTransformScale([self transformForOrientation], 1, 1); 224 | [self setTransform:scaleTransform]; 225 | CGAffineTransform translateTransform = CGAffineTransformTranslate([self transformForOrientation], -1*self.frame.size.width, 0); 226 | [self setTransform:translateTransform]; 227 | 228 | [UIView beginAnimations:nil context:nil]; 229 | [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 230 | [UIView setAnimationDuration:0.2]; 231 | 232 | translateTransform = CGAffineTransformMakeTranslation(0, 0); 233 | [self setTransform:translateTransform]; 234 | 235 | [UIView commitAnimations]; 236 | 237 | } 238 | 239 | - (void)showPanel:(BOOL)show animated:(BOOL)animated 240 | { 241 | if (animated) 242 | { 243 | [self show:show]; 244 | } 245 | else 246 | { 247 | [self setHidden:!show]; 248 | if (show) 249 | { 250 | self.transform = CGAffineTransformScale([self transformForOrientation], 1, 1); 251 | } 252 | else 253 | { 254 | 255 | } 256 | } 257 | } 258 | 259 | - (void)show:(BOOL)show 260 | { 261 | if (show) 262 | { 263 | self.transform = CGAffineTransformScale([self transformForOrientation], 0.001, 0.001); 264 | } 265 | else 266 | { 267 | [self removeTableviewOffset]; 268 | self.transform = CGAffineTransformScale([self transformForOrientation], 1, 1); 269 | } 270 | [UIView beginAnimations:nil context:nil]; 271 | [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 272 | [UIView setAnimationDuration:0.2]; 273 | [UIView setAnimationDelegate:self]; 274 | if (show) 275 | { 276 | [UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)]; 277 | self.transform = CGAffineTransformScale([self transformForOrientation], 1.05, 1.05); 278 | } 279 | else 280 | { 281 | [UIView setAnimationDidStopSelector:@selector(bounce4AnimationStopped)]; 282 | self.transform = CGAffineTransformScale([self transformForOrientation], 1.05, 1.05); 283 | } 284 | [UIView commitAnimations]; 285 | } 286 | 287 | - (void)bounce1AnimationStopped { 288 | [UIView beginAnimations:nil context:nil]; 289 | [UIView setAnimationDuration:kTransitionDuration/3]; 290 | [UIView setAnimationDelegate:self]; 291 | [UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)]; 292 | self.transform = CGAffineTransformScale([self transformForOrientation], 0.9, 0.9); 293 | [UIView commitAnimations]; 294 | } 295 | 296 | - (void)bounce2AnimationStopped { 297 | [UIView beginAnimations:nil context:nil]; 298 | [UIView setAnimationDuration:kTransitionDuration/4]; 299 | self.transform = [self transformForOrientation]; 300 | [UIView commitAnimations]; 301 | } 302 | 303 | - (void)bounce3AnimationStopped { 304 | [UIView beginAnimations:nil context:nil]; 305 | [UIView setAnimationDuration:kTransitionDuration/4]; 306 | [UIView setAnimationDelegate:self]; 307 | [UIView setAnimationDidStopSelector:@selector(bounce4AnimationStopped)]; 308 | self.transform = CGAffineTransformScale([self transformForOrientation], 1.1, 1.1); 309 | [UIView commitAnimations]; 310 | } 311 | 312 | - (void)bounce4AnimationStopped { 313 | [UIView beginAnimations:nil context:nil]; 314 | [UIView setAnimationDuration:kTransitionDuration/1.5]; 315 | [UIView setAnimationDelegate:self]; 316 | [UIView setAnimationDidStopSelector:@selector(completedHidingAnimation)]; 317 | self.transform = CGAffineTransformScale([self transformForOrientation], 0.001, 0.001); 318 | [UIView commitAnimations]; 319 | } 320 | 321 | - (void)completedHidingAnimation 322 | { 323 | } 324 | 325 | - (CGAffineTransform)transformForOrientation 326 | { 327 | UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 328 | if (orientation == UIInterfaceOrientationLandscapeLeft) { 329 | return CGAffineTransformMakeRotation(M_PI*1.5); 330 | } else if (orientation == UIInterfaceOrientationLandscapeRight) { 331 | return CGAffineTransformMakeRotation(M_PI/2); 332 | } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 333 | return CGAffineTransformMakeRotation(-M_PI); 334 | } else { 335 | return CGAffineTransformIdentity; 336 | } 337 | } 338 | 339 | #pragma mark table 340 | 341 | - (CGFloat)tableView:(UITableView *)tableView_ heightForRowAtIndexPath:(NSIndexPath *)indexPath 342 | { 343 | if ([self.delegate respondsToSelector:@selector(panelView:heightForRowAtIndexPath:)]) 344 | { 345 | return [self.delegate panelView:self heightForRowAtIndexPath:[PanelIndexPath panelIndexPathForPage:self.pageNumber indexPath:indexPath]]; 346 | } 347 | else return 0; 348 | } 349 | 350 | - (void)tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath 351 | { 352 | if ([self.delegate respondsToSelector:@selector(panelView:didSelectRowAtIndexPath:)]) 353 | { 354 | return [self.delegate panelView:self didSelectRowAtIndexPath:[PanelIndexPath panelIndexPathForPage:self.pageNumber indexPath:indexPath]]; 355 | } 356 | } 357 | 358 | - (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath 359 | { 360 | if ([self.delegate respondsToSelector:@selector(panelView:cellForRowAtIndexPath:)]) 361 | { 362 | return [self.delegate panelView:self cellForRowAtIndexPath:[PanelIndexPath panelIndexPathForPage:self.pageNumber indexPath:indexPath]]; 363 | } 364 | return nil; 365 | } 366 | 367 | - (NSInteger)tableView:(UITableView *)tableView_ numberOfRowsInSection:(NSInteger)section 368 | { 369 | if ([self.delegate respondsToSelector:@selector(panelView:numberOfRowsInPage:section:)]) 370 | { 371 | return [self.delegate panelView:self numberOfRowsInPage:self.pageNumber section:section]; 372 | } 373 | return 0; 374 | } 375 | 376 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 377 | { 378 | if ([self.delegate respondsToSelector:@selector(panelView:numberOfSectionsInPage:)]) 379 | { 380 | return [self.delegate panelView:self numberOfSectionsInPage:self.pageNumber]; 381 | } 382 | return 1; 383 | } 384 | 385 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 386 | { 387 | if ([self.delegate respondsToSelector:@selector(panelView:titleForHeaderInPage:section:)]) 388 | { 389 | return [self.delegate panelView:self titleForHeaderInPage:self.pageNumber section:section]; 390 | } 391 | return nil; 392 | } 393 | 394 | @end 395 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelsViewController.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import 35 | #import "PanelIndexPath.h" 36 | #import "PanelView.h" 37 | 38 | @interface UIScrollViewExt : UIScrollView 39 | @property (nonatomic, assign) BOOL isEditing; 40 | @end 41 | 42 | 43 | @interface PanelsViewController : UIViewController 44 | @property (nonatomic, strong) UIScrollViewExt *scrollView; 45 | @property (nonatomic, strong) NSMutableSet *recycledPages, *visiblePages; 46 | @property (nonatomic, assign) int currentPage, lastDisplayedPage; 47 | @property (nonatomic, assign) BOOL isEditing; 48 | 49 | #define GAP 10 50 | #define TAG_PAGE 11000 51 | 52 | - (PanelView*)dequeueReusablePageWithIdentifier:(NSString*)identifier; 53 | - (PanelView *)panelViewAtPage:(NSInteger)page; 54 | 55 | #pragma mark editing 56 | - (void)setEditing:(BOOL)isEditing; 57 | - (void)shouldWiggle:(BOOL)wiggle; 58 | 59 | #pragma mark frame and sizes 60 | - (CGRect)scrollViewFrame; 61 | - (CGSize)panelViewSize; 62 | - (int)numberOfVisiblePanels; 63 | 64 | #pragma mark adding and removing page 65 | - (void)addPage; 66 | - (void)removeCurrentPage; 67 | - (void)removeContentOfPage:(int)page; 68 | - (void)pushNextPage; 69 | - (void)jumpToPreviousPage; 70 | 71 | 72 | - (NSInteger)numberOfPanels; 73 | 74 | @end 75 | -------------------------------------------------------------------------------- /PanelTableView/Classes/PanelsViewController.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2009 Muh Hon Cheng 3 | * Created by honcheng on 11/27/10. 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining 6 | * a copy of this software and associated documentation files (the 7 | * "Software"), to deal in the Software without restriction, including 8 | * without limitation the rights to use, copy, modify, merge, publish, 9 | * distribute, sublicense, and/or sell copies of the Software, and to 10 | * permit persons to whom the Software is furnished to do so, subject 11 | * to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be 14 | * included in all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT 17 | * WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR 20 | * PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR 25 | * IN CONNECTION WITH THE SOFTWARE OR 26 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | * 28 | * @author Muh Hon Cheng 29 | * @copyright 2010 Muh Hon Cheng 30 | * @version 31 | * 32 | */ 33 | 34 | #import "PanelsViewController.h" 35 | 36 | @implementation UIScrollViewExt 37 | 38 | - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 39 | { 40 | if (self.isEditing) return self; 41 | else return [super hitTest:point withEvent:event]; 42 | } 43 | @end 44 | 45 | 46 | @interface PanelsViewController() 47 | - (void)tilePages; 48 | - (void)configurePage:(PanelView*)page forIndex:(int)index; 49 | - (BOOL)isDisplayingPageForIndex:(int)index; 50 | - (PanelView *)panelForPage:(NSInteger)page; 51 | @end 52 | 53 | @implementation PanelsViewController 54 | 55 | - (void)loadView 56 | { 57 | [super loadView]; 58 | [self.view setBackgroundColor:[UIColor blackColor]]; 59 | 60 | CGRect frame = [self scrollViewFrame]; 61 | _scrollView = [[UIScrollViewExt alloc] initWithFrame:CGRectMake(-1*GAP,0,frame.size.width+2*GAP,frame.size.height)]; 62 | [_scrollView setScrollsToTop:NO]; 63 | [_scrollView setDelegate:self]; 64 | [_scrollView setShowsHorizontalScrollIndicator:NO]; 65 | [_scrollView setPagingEnabled:YES]; 66 | [_scrollView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; 67 | [self.view addSubview:self.scrollView]; 68 | [_scrollView setContentSize:CGSizeMake(([self panelViewSize].width+2*GAP)*[self numberOfPanels],_scrollView.frame.size.height)]; 69 | 70 | _recycledPages = [NSMutableSet set]; 71 | _visiblePages = [NSMutableSet set]; 72 | 73 | [self tilePages]; 74 | } 75 | 76 | 77 | - (void)didReceiveMemoryWarning { 78 | // Releases the view if it doesn't have a superview. 79 | [super didReceiveMemoryWarning]; 80 | 81 | // Release any cached data, images, etc that aren't in use. 82 | } 83 | 84 | - (void)viewDidUnload { 85 | [super viewDidUnload]; 86 | // Release any retained subviews of the main view. 87 | // e.g. self.myOutlet = nil; 88 | } 89 | 90 | - (void)viewDidAppear:(BOOL)animated 91 | { 92 | PanelView *panelView = [self panelViewAtPage:self.currentPage]; 93 | [panelView pageDidAppear]; 94 | } 95 | 96 | - (void)viewWillAppear:(BOOL)animated 97 | { 98 | PanelView *panelView = [self panelViewAtPage:self.currentPage]; 99 | [panelView pageWillAppear]; 100 | } 101 | 102 | - (void)viewWillDisappear:(BOOL)animated 103 | { 104 | PanelView *panelView = [self panelViewAtPage:self.currentPage]; 105 | [panelView pageWillDisappear]; 106 | } 107 | 108 | #pragma mark editing 109 | 110 | - (void)shouldWiggle:(BOOL)wiggle 111 | { 112 | for (int i=0; i<[self numberOfPanels]; i++) 113 | { 114 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+i]; 115 | [panelView shouldWiggle:wiggle]; 116 | 117 | } 118 | } 119 | 120 | - (void)setEditing:(BOOL)isEditing 121 | { 122 | self.isEditing = isEditing; 123 | 124 | [UIView beginAnimations:nil context:nil]; 125 | [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 126 | [UIView setAnimationDuration:0.2]; 127 | [self.scrollView setIsEditing:isEditing]; 128 | [self shouldWiggle:isEditing]; 129 | if (isEditing) 130 | { 131 | [self.scrollView setTransform:CGAffineTransformMakeScale(0.5, 0.5)]; 132 | [self.scrollView setClipsToBounds:NO]; 133 | } 134 | else 135 | { 136 | [UIView setAnimationDelegate:self]; 137 | [UIView setAnimationDidStopSelector:@selector(onEditingAnimationStopped)]; 138 | [self.scrollView setTransform:CGAffineTransformMakeScale(1, 1)]; 139 | 140 | } 141 | 142 | [UIView commitAnimations]; 143 | } 144 | 145 | - (void)onEditingAnimationStopped 146 | { 147 | [self.scrollView setClipsToBounds:YES]; 148 | } 149 | 150 | #pragma mark frame and sizes 151 | 152 | /* 153 | Overwrite this to change size of scroll view. 154 | Default implementation fills the screen 155 | */ 156 | - (CGRect)scrollViewFrame 157 | { 158 | return CGRectMake(0,0,[self.view bounds].size.width,[self.view bounds].size.height); 159 | } 160 | 161 | - (CGSize)panelViewSize 162 | { 163 | float width = [self scrollViewFrame].size.width; 164 | if ([self numberOfVisiblePanels]>1) 165 | { 166 | width = ([self scrollViewFrame].size.width-2*GAP*([self numberOfVisiblePanels]-1))/[self numberOfVisiblePanels]; 167 | } 168 | 169 | return CGSizeMake(width,[self scrollViewFrame].size.height); 170 | } 171 | 172 | /* 173 | Overwrite this to change number of visible panel views 174 | */ 175 | - (int)numberOfVisiblePanels 176 | { 177 | return 1; 178 | } 179 | 180 | #pragma mark adding and removing panels 181 | 182 | - (void)addPage 183 | { 184 | //numberOfPages += 1; 185 | [self.scrollView setContentSize:CGSizeMake(([self panelViewSize].width+2*GAP)*[self numberOfPanels],self.scrollView.frame.size.width)]; 186 | } 187 | 188 | - (void)removeCurrentPage 189 | { 190 | if (self.currentPage==[self numberOfPanels] && self.currentPage!=0) 191 | { 192 | // this is the last page 193 | //numberOfPages -= 1; 194 | 195 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+self.currentPage]; 196 | [panelView showPanel:NO animated:YES]; 197 | [self removeContentOfPage:self.currentPage]; 198 | 199 | [panelView performSelector:@selector(showPreviousPanel) withObject:nil afterDelay:0.4]; 200 | [self performSelector:@selector(jumpToPreviousPage) withObject:nil afterDelay:0.6]; 201 | } 202 | else if ([self numberOfPanels]==0) 203 | { 204 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+self.currentPage]; 205 | [panelView showPanel:NO animated:YES]; 206 | [self removeContentOfPage:self.currentPage]; 207 | } 208 | else 209 | { 210 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+self.currentPage]; 211 | [panelView showPanel:NO animated:YES]; 212 | [self removeContentOfPage:self.currentPage]; 213 | [self performSelector:@selector(pushNextPage) withObject:nil afterDelay:0.4]; 214 | } 215 | } 216 | 217 | - (void)jumpToPreviousPage 218 | { 219 | [self.scrollView setContentSize:CGSizeMake(([self panelViewSize].width+2*GAP)*[self numberOfPanels],self.scrollView.frame.size.width)]; 220 | } 221 | 222 | - (void)pushNextPage 223 | { 224 | [self.scrollView setContentSize:CGSizeMake(([self panelViewSize].width+2*GAP)*[self numberOfPanels],self.scrollView.frame.size.width)]; 225 | 226 | for (int i=self.currentPage; i<[self numberOfVisiblePanels]; i++) 227 | { 228 | if (self.currentPage < [self numberOfPanels]) 229 | { 230 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+i]; 231 | [panelView showNextPanel]; 232 | [panelView pageWillAppear]; 233 | } 234 | 235 | } 236 | } 237 | 238 | - (void)removeContentOfPage:(int)page 239 | { 240 | 241 | } 242 | 243 | #pragma mark scroll view delegate 244 | 245 | - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView_ 246 | { 247 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+self.currentPage]; 248 | [panelView pageWillDisappear]; 249 | } 250 | 251 | - (void)scrollViewDidScroll:(UIScrollView*)scrollView_ 252 | { 253 | //NSLog(@"%@", scrollView_); 254 | [self tilePages]; 255 | } 256 | 257 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView_ 258 | { 259 | 260 | if (self.currentPage!=self.lastDisplayedPage) 261 | { 262 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+self.currentPage]; 263 | [panelView pageDidAppear]; 264 | } 265 | 266 | self.lastDisplayedPage = self.currentPage; 267 | } 268 | 269 | #pragma mark reuse table views 270 | 271 | - (void)tilePages 272 | { 273 | CGRect visibleBounds = [self.scrollView bounds]; 274 | int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds)) * [self numberOfVisiblePanels]; 275 | int lastNeededPageIndex = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds)) * [self numberOfVisiblePanels]; 276 | 277 | firstNeededPageIndex = MAX(firstNeededPageIndex,0); 278 | lastNeededPageIndex = MIN(lastNeededPageIndex, [self numberOfPanels]-1) + [self numberOfVisiblePanels]; 279 | 280 | if (self.isEditing) firstNeededPageIndex -= 1; 281 | 282 | if (firstNeededPageIndex<0) firstNeededPageIndex = 0; 283 | if (lastNeededPageIndex>=[self numberOfPanels]) lastNeededPageIndex = [self numberOfPanels]-1; 284 | 285 | self.currentPage = firstNeededPageIndex; 286 | 287 | for (PanelView *panel in self.visiblePages) 288 | { 289 | if (panel.pageNumber < firstNeededPageIndex || panel.pageNumber > lastNeededPageIndex) 290 | { 291 | [self.recycledPages addObject:panel]; 292 | [panel removeFromSuperview]; 293 | [panel shouldWiggle:NO]; 294 | } 295 | } 296 | [self.visiblePages minusSet:self.recycledPages]; 297 | 298 | for (int index=firstNeededPageIndex; index<=lastNeededPageIndex; index++) 299 | { 300 | if (![self isDisplayingPageForIndex:index]) 301 | { 302 | PanelView *panel = [self panelForPage:index]; 303 | int x = ([self panelViewSize].width+2*GAP)*index + GAP; 304 | CGRect panelFrame = CGRectMake(x,0,[self panelViewSize].width,[self scrollViewFrame].size.height); 305 | 306 | [panel setFrame:panelFrame]; 307 | [panel setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; 308 | [panel setDelegate:self]; 309 | [panel setTag:TAG_PAGE+index]; 310 | [panel setPageNumber:index]; 311 | [panel pageWillAppear]; 312 | 313 | [self.scrollView addSubview:panel]; 314 | [self.visiblePages addObject:panel]; 315 | [panel shouldWiggle:self.isEditing]; 316 | } 317 | } 318 | } 319 | 320 | - (BOOL)isDisplayingPageForIndex:(int)index 321 | { 322 | for (PanelView *page in self.visiblePages) 323 | { 324 | if (page.pageNumber==index) return YES; 325 | } 326 | return NO; 327 | } 328 | 329 | - (void)configurePage:(PanelView*)page forIndex:(int)index 330 | { 331 | int x = ([self.view bounds].size.width+2*GAP)*index + GAP; 332 | CGRect pageFrame = CGRectMake(x,0,[self.view bounds].size.width,[self.view bounds].size.height); 333 | [page setFrame:pageFrame]; 334 | [page setPageNumber:index]; 335 | [page pageWillAppear]; 336 | } 337 | 338 | - (PanelView*)dequeueReusablePageWithIdentifier:(NSString*)identifier 339 | { 340 | NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.identifier == %@", identifier]; 341 | NSSet *filteredSet =[self.recycledPages filteredSetUsingPredicate:predicate]; 342 | PanelView *page = [filteredSet anyObject]; 343 | if (page) 344 | { 345 | //[[page retain] autorelease]; 346 | [self.recycledPages removeObject:page]; 347 | } 348 | return page; 349 | } 350 | 351 | #pragma mark panel views 352 | 353 | - (PanelView *)panelViewAtPage:(NSInteger)page 354 | { 355 | PanelView *panelView = (PanelView*)[self.scrollView viewWithTag:TAG_PAGE+page]; 356 | return panelView; 357 | } 358 | 359 | - (PanelView *)panelForPage:(NSInteger)page 360 | { 361 | static NSString *identifier = @"PanelTableView"; 362 | PanelView *panelView = (PanelView*)[self dequeueReusablePageWithIdentifier:identifier]; 363 | if (panelView == nil) 364 | { 365 | panelView = [[PanelView alloc] initWithIdentifier:identifier]; 366 | } 367 | return panelView; 368 | } 369 | 370 | - (NSInteger)numberOfPanels 371 | { 372 | return 0; 373 | } 374 | 375 | - (CGFloat)panelView:(PanelView *)panelView heightForRowAtIndexPath:(PanelIndexPath *)indexPath 376 | { 377 | return 50; 378 | } 379 | 380 | - (UITableViewCell *)panelView:(PanelView *)panelView cellForRowAtIndexPath:(PanelIndexPath *)indexPath 381 | { 382 | static NSString *identity = @"UITableViewCell"; 383 | UITableViewCell *cell = (UITableViewCell*)[panelView.tableView dequeueReusableCellWithIdentifier:identity]; 384 | if (cell == nil) 385 | { 386 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identity]; 387 | } 388 | return cell; 389 | } 390 | 391 | - (NSInteger)panelView:(PanelView *)panelView numberOfRowsInPage:(NSInteger)page section:(NSInteger)section 392 | { 393 | return 0; 394 | } 395 | 396 | - (void)panelView:(PanelView *)panelView didSelectRowAtIndexPath:(PanelIndexPath *)indexPath 397 | { 398 | 399 | } 400 | 401 | - (NSInteger)panelView:(id)panelView numberOfSectionsInPage:(NSInteger)pageNumber 402 | { 403 | return 2; 404 | } 405 | 406 | - (NSString*)panelView:(id)panelView titleForHeaderInPage:(NSInteger)pageNumber section:(NSInteger)section 407 | { 408 | return [NSString stringWithFormat:@"Page %i Section %i", pageNumber, section]; 409 | } 410 | 411 | 412 | @end 413 | -------------------------------------------------------------------------------- /PanelTableView/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 800 5 | 10D540 6 | 760 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 81 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 | 1316 46 | 47 | {320, 480} 48 | 49 | 50 | 1 51 | MSAxIDEAA 52 | 53 | NO 54 | NO 55 | 56 | IBCocoaTouchFramework 57 | YES 58 | 59 | 60 | 61 | 62 | YES 63 | 64 | 65 | delegate 66 | 67 | 68 | 69 | 4 70 | 71 | 72 | 73 | window 74 | 75 | 76 | 77 | 5 78 | 79 | 80 | 81 | 82 | YES 83 | 84 | 0 85 | 86 | 87 | 88 | 89 | 90 | 2 91 | 92 | 93 | YES 94 | 95 | 96 | 97 | 98 | -1 99 | 100 | 101 | File's Owner 102 | 103 | 104 | 3 105 | 106 | 107 | 108 | 109 | -2 110 | 111 | 112 | 113 | 114 | 115 | 116 | YES 117 | 118 | YES 119 | -1.CustomClassName 120 | -2.CustomClassName 121 | 2.IBAttributePlaceholdersKey 122 | 2.IBEditorWindowLastContentRect 123 | 2.IBPluginDependency 124 | 3.CustomClassName 125 | 3.IBPluginDependency 126 | 127 | 128 | YES 129 | UIApplication 130 | UIResponder 131 | 132 | YES 133 | 134 | 135 | YES 136 | 137 | 138 | {{198, 376}, {320, 480}} 139 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 140 | PanelTableViewAppDelegate 141 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 142 | 143 | 144 | 145 | YES 146 | 147 | 148 | YES 149 | 150 | 151 | 152 | 153 | YES 154 | 155 | 156 | YES 157 | 158 | 159 | 160 | 9 161 | 162 | 163 | 164 | YES 165 | 166 | PanelTableViewAppDelegate 167 | NSObject 168 | 169 | window 170 | UIWindow 171 | 172 | 173 | IBProjectSource 174 | Classes/PanelTableViewAppDelegate.h 175 | 176 | 177 | 178 | PanelTableViewAppDelegate 179 | NSObject 180 | 181 | IBUserSource 182 | 183 | 184 | 185 | 186 | 187 | 0 188 | IBCocoaTouchFramework 189 | 190 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 191 | 192 | 193 | YES 194 | PanelTableView.xcodeproj 195 | 3 196 | 81 197 | 198 | 199 | -------------------------------------------------------------------------------- /PanelTableView/PanelTableView-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.yourcompany.${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 | -------------------------------------------------------------------------------- /PanelTableView/PanelTableView.xcodeproj/honcheng.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | F8ABEFB612A0C72300D78DF9 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | -1 204 | -1 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | active-combo-popup 212 | action 213 | NSToolbarFlexibleSpaceItem 214 | debugger-enable-breakpoints 215 | go 216 | build 217 | build-and-go 218 | clean-target 219 | com.apple.ide.PBXToolbarStopButton 220 | get-info 221 | NSToolbarFlexibleSpaceItem 222 | com.apple.pbx.toolbar.searchfield 223 | 224 | ControllerClassBaseName 225 | 226 | IconName 227 | WindowOfProjectWithEditor 228 | Identifier 229 | perspective.project 230 | IsVertical 231 | 232 | Layout 233 | 234 | 235 | ContentConfiguration 236 | 237 | PBXBottomSmartGroupGIDs 238 | 239 | 1C37FBAC04509CD000000102 240 | 1C37FAAC04509CD000000102 241 | 1C37FABC05509CD000000102 242 | 1C37FABC05539CD112110102 243 | E2644B35053B69B200211256 244 | 1C37FABC04509CD000100104 245 | 1CC0EA4004350EF90044410B 246 | 1CC0EA4004350EF90041110B 247 | 248 | PBXProjectModuleGUID 249 | 1CE0B1FE06471DED0097A5F4 250 | PBXProjectModuleLabel 251 | Files 252 | PBXProjectStructureProvided 253 | yes 254 | PBXSmartGroupTreeModuleColumnData 255 | 256 | PBXSmartGroupTreeModuleColumnWidthsKey 257 | 258 | 262 259 | 260 | PBXSmartGroupTreeModuleColumnsKey_v4 261 | 262 | MainColumn 263 | 264 | 265 | PBXSmartGroupTreeModuleOutlineStateKey_v7 266 | 267 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 268 | 269 | 29B97314FDCFA39411CA2CEA 270 | 080E96DDFE201D6D7F000001 271 | F8ABEFEA12A0C9DD00D78DF9 272 | 29B97315FDCFA39411CA2CEA 273 | 19C28FACFE9D520D11CA2CBB 274 | 1C37FBAC04509CD000000102 275 | F8ABF0B912A0CEF800D78DF9 276 | F8ABF0BA12A0CEF800D78DF9 277 | 1C37FAAC04509CD000000102 278 | 1C37FABC05509CD000000102 279 | 280 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 281 | 282 | 283 | 2 284 | 1 285 | 0 286 | 287 | 288 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 289 | {{0, 0}, {262, 684}} 290 | 291 | PBXTopSmartGroupGIDs 292 | 293 | XCIncludePerspectivesSwitch 294 | 295 | XCSharingToken 296 | com.apple.Xcode.GFSharingToken 297 | 298 | GeometryConfiguration 299 | 300 | Frame 301 | {{0, 0}, {279, 702}} 302 | GroupTreeTableConfiguration 303 | 304 | MainColumn 305 | 262 306 | 307 | RubberWindowFrame 308 | -1358 262 1360 743 -1440 150 1440 900 309 | 310 | Module 311 | PBXSmartGroupTreeModule 312 | Proportion 313 | 279pt 314 | 315 | 316 | Dock 317 | 318 | 319 | BecomeActive 320 | 321 | ContentConfiguration 322 | 323 | PBXProjectModuleGUID 324 | 1CE0B20306471E060097A5F4 325 | PBXProjectModuleLabel 326 | PanelsViewController.m 327 | PBXSplitModuleInNavigatorKey 328 | 329 | Split0 330 | 331 | PBXProjectModuleGUID 332 | 1CE0B20406471E060097A5F4 333 | PBXProjectModuleLabel 334 | PanelsViewController.m 335 | _historyCapacity 336 | 0 337 | bookmark 338 | F8ABF21112A0DA3700D78DF9 339 | history 340 | 341 | F8ABF0BD12A0CEF800D78DF9 342 | F8ABF0BE12A0CEF800D78DF9 343 | F8ABF0C012A0CEF800D78DF9 344 | F8ABF20D12A0DA3700D78DF9 345 | F8ABF20E12A0DA3700D78DF9 346 | F8ABF20F12A0DA3700D78DF9 347 | F8ABF21012A0DA3700D78DF9 348 | 349 | 350 | SplitCount 351 | 1 352 | 353 | StatusBarVisibility 354 | 355 | 356 | GeometryConfiguration 357 | 358 | Frame 359 | {{0, 0}, {1076, 681}} 360 | RubberWindowFrame 361 | -1358 262 1360 743 -1440 150 1440 900 362 | 363 | Module 364 | PBXNavigatorGroup 365 | Proportion 366 | 681pt 367 | 368 | 369 | ContentConfiguration 370 | 371 | PBXProjectModuleGUID 372 | 1CE0B20506471E060097A5F4 373 | PBXProjectModuleLabel 374 | Detail 375 | 376 | GeometryConfiguration 377 | 378 | Frame 379 | {{0, 686}, {1076, 16}} 380 | RubberWindowFrame 381 | -1358 262 1360 743 -1440 150 1440 900 382 | 383 | Module 384 | XCDetailModule 385 | Proportion 386 | 16pt 387 | 388 | 389 | Proportion 390 | 1076pt 391 | 392 | 393 | Name 394 | Project 395 | ServiceClasses 396 | 397 | XCModuleDock 398 | PBXSmartGroupTreeModule 399 | XCModuleDock 400 | PBXNavigatorGroup 401 | XCDetailModule 402 | 403 | TableOfContents 404 | 405 | F8ABF0C312A0CEF800D78DF9 406 | 1CE0B1FE06471DED0097A5F4 407 | F8ABF0C412A0CEF800D78DF9 408 | 1CE0B20306471E060097A5F4 409 | 1CE0B20506471E060097A5F4 410 | 411 | ToolbarConfigUserDefaultsMinorVersion 412 | 2 413 | ToolbarConfiguration 414 | xcode.toolbar.config.defaultV3 415 | 416 | 417 | ControllerClassBaseName 418 | 419 | IconName 420 | WindowOfProject 421 | Identifier 422 | perspective.morph 423 | IsVertical 424 | 0 425 | Layout 426 | 427 | 428 | BecomeActive 429 | 1 430 | ContentConfiguration 431 | 432 | PBXBottomSmartGroupGIDs 433 | 434 | 1C37FBAC04509CD000000102 435 | 1C37FAAC04509CD000000102 436 | 1C08E77C0454961000C914BD 437 | 1C37FABC05509CD000000102 438 | 1C37FABC05539CD112110102 439 | E2644B35053B69B200211256 440 | 1C37FABC04509CD000100104 441 | 1CC0EA4004350EF90044410B 442 | 1CC0EA4004350EF90041110B 443 | 444 | PBXProjectModuleGUID 445 | 11E0B1FE06471DED0097A5F4 446 | PBXProjectModuleLabel 447 | Files 448 | PBXProjectStructureProvided 449 | yes 450 | PBXSmartGroupTreeModuleColumnData 451 | 452 | PBXSmartGroupTreeModuleColumnWidthsKey 453 | 454 | 186 455 | 456 | PBXSmartGroupTreeModuleColumnsKey_v4 457 | 458 | MainColumn 459 | 460 | 461 | PBXSmartGroupTreeModuleOutlineStateKey_v7 462 | 463 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 464 | 465 | 29B97314FDCFA39411CA2CEA 466 | 1C37FABC05509CD000000102 467 | 468 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 469 | 470 | 471 | 0 472 | 473 | 474 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 475 | {{0, 0}, {186, 337}} 476 | 477 | PBXTopSmartGroupGIDs 478 | 479 | XCIncludePerspectivesSwitch 480 | 1 481 | XCSharingToken 482 | com.apple.Xcode.GFSharingToken 483 | 484 | GeometryConfiguration 485 | 486 | Frame 487 | {{0, 0}, {203, 355}} 488 | GroupTreeTableConfiguration 489 | 490 | MainColumn 491 | 186 492 | 493 | RubberWindowFrame 494 | 373 269 690 397 0 0 1440 878 495 | 496 | Module 497 | PBXSmartGroupTreeModule 498 | Proportion 499 | 100% 500 | 501 | 502 | Name 503 | Morph 504 | PreferredWidth 505 | 300 506 | ServiceClasses 507 | 508 | XCModuleDock 509 | PBXSmartGroupTreeModule 510 | 511 | TableOfContents 512 | 513 | 11E0B1FE06471DED0097A5F4 514 | 515 | ToolbarConfiguration 516 | xcode.toolbar.config.default.shortV3 517 | 518 | 519 | PerspectivesBarVisible 520 | 521 | ShelfIsVisible 522 | 523 | SourceDescription 524 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 525 | StatusbarIsVisible 526 | 527 | TimeStamp 528 | 0.0 529 | ToolbarConfigUserDefaultsMinorVersion 530 | 2 531 | ToolbarDisplayMode 532 | 1 533 | ToolbarIsVisible 534 | 535 | ToolbarSizeMode 536 | 1 537 | Type 538 | Perspectives 539 | UpdateMessage 540 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 541 | WindowJustification 542 | 5 543 | WindowOrderList 544 | 545 | 1C78EAAD065D492600B07095 546 | 1CD10A99069EF8BA00B06720 547 | F8ABEFB712A0C72300D78DF9 548 | /Users/honcheng/Dropbox/Open Source Projects/PanelTableView/PanelTableView/PanelTableView.xcodeproj 549 | 550 | WindowString 551 | -1358 262 1360 743 -1440 150 1440 900 552 | WindowToolsV3 553 | 554 | 555 | FirstTimeWindowDisplayed 556 | 557 | Identifier 558 | windowTool.build 559 | IsVertical 560 | 561 | Layout 562 | 563 | 564 | Dock 565 | 566 | 567 | ContentConfiguration 568 | 569 | PBXProjectModuleGUID 570 | 1CD0528F0623707200166675 571 | PBXProjectModuleLabel 572 | <No Editor> 573 | StatusBarVisibility 574 | 575 | 576 | GeometryConfiguration 577 | 578 | Frame 579 | {{0, 0}, {990, 0}} 580 | RubberWindowFrame 581 | 467 308 990 593 0 0 1680 1028 582 | 583 | Module 584 | PBXNavigatorGroup 585 | Proportion 586 | 0pt 587 | 588 | 589 | BecomeActive 590 | 591 | ContentConfiguration 592 | 593 | PBXProjectModuleGUID 594 | XCMainBuildResultsModuleGUID 595 | PBXProjectModuleLabel 596 | Build Results 597 | XCBuildResultsTrigger_Collapse 598 | 1021 599 | XCBuildResultsTrigger_Open 600 | 1011 601 | 602 | GeometryConfiguration 603 | 604 | Frame 605 | {{0, 5}, {990, 547}} 606 | RubberWindowFrame 607 | 467 308 990 593 0 0 1680 1028 608 | 609 | Module 610 | PBXBuildResultsModule 611 | Proportion 612 | 547pt 613 | 614 | 615 | Proportion 616 | 552pt 617 | 618 | 619 | Name 620 | Build Results 621 | ServiceClasses 622 | 623 | PBXBuildResultsModule 624 | 625 | StatusbarIsVisible 626 | 627 | TableOfContents 628 | 629 | F8ABEFB712A0C72300D78DF9 630 | F8ABF0C512A0CEF800D78DF9 631 | 1CD0528F0623707200166675 632 | XCMainBuildResultsModuleGUID 633 | 634 | ToolbarConfiguration 635 | xcode.toolbar.config.buildV3 636 | WindowContentMinSize 637 | 486 300 638 | WindowString 639 | 467 308 990 593 0 0 1680 1028 640 | WindowToolGUID 641 | F8ABEFB712A0C72300D78DF9 642 | WindowToolIsVisible 643 | 644 | 645 | 646 | FirstTimeWindowDisplayed 647 | 648 | Identifier 649 | windowTool.debugger 650 | IsVertical 651 | 652 | Layout 653 | 654 | 655 | Dock 656 | 657 | 658 | ContentConfiguration 659 | 660 | Debugger 661 | 662 | HorizontalSplitView 663 | 664 | _collapsingFrameDimension 665 | 0.0 666 | _indexOfCollapsedView 667 | 0 668 | _percentageOfCollapsedView 669 | 0.0 670 | isCollapsed 671 | yes 672 | sizes 673 | 674 | {{0, 0}, {316, 185}} 675 | {{316, 0}, {378, 185}} 676 | 677 | 678 | VerticalSplitView 679 | 680 | _collapsingFrameDimension 681 | 0.0 682 | _indexOfCollapsedView 683 | 0 684 | _percentageOfCollapsedView 685 | 0.0 686 | isCollapsed 687 | yes 688 | sizes 689 | 690 | {{0, 0}, {694, 185}} 691 | {{0, 185}, {694, 196}} 692 | 693 | 694 | 695 | LauncherConfigVersion 696 | 8 697 | PBXProjectModuleGUID 698 | 1C162984064C10D400B95A72 699 | PBXProjectModuleLabel 700 | Debug - GLUTExamples (Underwater) 701 | 702 | GeometryConfiguration 703 | 704 | DebugConsoleVisible 705 | None 706 | DebugConsoleWindowFrame 707 | {{200, 200}, {500, 300}} 708 | DebugSTDIOWindowFrame 709 | {{200, 200}, {500, 300}} 710 | Frame 711 | {{0, 0}, {694, 381}} 712 | PBXDebugSessionStackFrameViewKey 713 | 714 | DebugVariablesTableConfiguration 715 | 716 | Name 717 | 120 718 | Value 719 | 85 720 | Summary 721 | 148 722 | 723 | Frame 724 | {{316, 0}, {378, 185}} 725 | RubberWindowFrame 726 | -770 532 694 422 -1440 150 1440 900 727 | 728 | RubberWindowFrame 729 | -770 532 694 422 -1440 150 1440 900 730 | 731 | Module 732 | PBXDebugSessionModule 733 | Proportion 734 | 381pt 735 | 736 | 737 | Proportion 738 | 381pt 739 | 740 | 741 | Name 742 | Debugger 743 | ServiceClasses 744 | 745 | PBXDebugSessionModule 746 | 747 | StatusbarIsVisible 748 | 749 | TableOfContents 750 | 751 | 1CD10A99069EF8BA00B06720 752 | F8ABF0C612A0CEF800D78DF9 753 | 1C162984064C10D400B95A72 754 | F8ABF0C712A0CEF800D78DF9 755 | F8ABF0C812A0CEF800D78DF9 756 | F8ABF0C912A0CEF800D78DF9 757 | F8ABF0CA12A0CEF800D78DF9 758 | F8ABF0CB12A0CEF800D78DF9 759 | 760 | ToolbarConfiguration 761 | xcode.toolbar.config.debugV3 762 | WindowString 763 | -770 532 694 422 -1440 150 1440 900 764 | WindowToolGUID 765 | 1CD10A99069EF8BA00B06720 766 | WindowToolIsVisible 767 | 768 | 769 | 770 | Identifier 771 | windowTool.find 772 | Layout 773 | 774 | 775 | Dock 776 | 777 | 778 | Dock 779 | 780 | 781 | ContentConfiguration 782 | 783 | PBXProjectModuleGUID 784 | 1CDD528C0622207200134675 785 | PBXProjectModuleLabel 786 | <No Editor> 787 | PBXSplitModuleInNavigatorKey 788 | 789 | Split0 790 | 791 | PBXProjectModuleGUID 792 | 1CD0528D0623707200166675 793 | 794 | SplitCount 795 | 1 796 | 797 | StatusBarVisibility 798 | 1 799 | 800 | GeometryConfiguration 801 | 802 | Frame 803 | {{0, 0}, {781, 167}} 804 | RubberWindowFrame 805 | 62 385 781 470 0 0 1440 878 806 | 807 | Module 808 | PBXNavigatorGroup 809 | Proportion 810 | 781pt 811 | 812 | 813 | Proportion 814 | 50% 815 | 816 | 817 | BecomeActive 818 | 1 819 | ContentConfiguration 820 | 821 | PBXProjectModuleGUID 822 | 1CD0528E0623707200166675 823 | PBXProjectModuleLabel 824 | Project Find 825 | 826 | GeometryConfiguration 827 | 828 | Frame 829 | {{8, 0}, {773, 254}} 830 | RubberWindowFrame 831 | 62 385 781 470 0 0 1440 878 832 | 833 | Module 834 | PBXProjectFindModule 835 | Proportion 836 | 50% 837 | 838 | 839 | Proportion 840 | 428pt 841 | 842 | 843 | Name 844 | Project Find 845 | ServiceClasses 846 | 847 | PBXProjectFindModule 848 | 849 | StatusbarIsVisible 850 | 1 851 | TableOfContents 852 | 853 | 1C530D57069F1CE1000CFCEE 854 | 1C530D58069F1CE1000CFCEE 855 | 1C530D59069F1CE1000CFCEE 856 | 1CDD528C0622207200134675 857 | 1C530D5A069F1CE1000CFCEE 858 | 1CE0B1FE06471DED0097A5F4 859 | 1CD0528E0623707200166675 860 | 861 | WindowString 862 | 62 385 781 470 0 0 1440 878 863 | WindowToolGUID 864 | 1C530D57069F1CE1000CFCEE 865 | WindowToolIsVisible 866 | 0 867 | 868 | 869 | Identifier 870 | MENUSEPARATOR 871 | 872 | 873 | FirstTimeWindowDisplayed 874 | 875 | Identifier 876 | windowTool.debuggerConsole 877 | IsVertical 878 | 879 | Layout 880 | 881 | 882 | Dock 883 | 884 | 885 | ContentConfiguration 886 | 887 | PBXProjectModuleGUID 888 | 1C78EAAC065D492600B07095 889 | PBXProjectModuleLabel 890 | Debugger Console 891 | 892 | GeometryConfiguration 893 | 894 | Frame 895 | {{0, 0}, {650, 209}} 896 | RubberWindowFrame 897 | 43 690 650 250 0 0 1680 1028 898 | 899 | Module 900 | PBXDebugCLIModule 901 | Proportion 902 | 209pt 903 | 904 | 905 | Proportion 906 | 209pt 907 | 908 | 909 | Name 910 | Debugger Console 911 | ServiceClasses 912 | 913 | PBXDebugCLIModule 914 | 915 | StatusbarIsVisible 916 | 917 | TableOfContents 918 | 919 | 1C78EAAD065D492600B07095 920 | F8ABF10C12A0D03700D78DF9 921 | 1C78EAAC065D492600B07095 922 | 923 | ToolbarConfiguration 924 | xcode.toolbar.config.consoleV3 925 | WindowString 926 | 43 690 650 250 0 0 1680 1028 927 | WindowToolGUID 928 | 1C78EAAD065D492600B07095 929 | WindowToolIsVisible 930 | 931 | 932 | 933 | Identifier 934 | windowTool.snapshots 935 | Layout 936 | 937 | 938 | Dock 939 | 940 | 941 | Module 942 | XCSnapshotModule 943 | Proportion 944 | 100% 945 | 946 | 947 | Proportion 948 | 100% 949 | 950 | 951 | Name 952 | Snapshots 953 | ServiceClasses 954 | 955 | XCSnapshotModule 956 | 957 | StatusbarIsVisible 958 | Yes 959 | ToolbarConfiguration 960 | xcode.toolbar.config.snapshots 961 | WindowString 962 | 315 824 300 550 0 0 1440 878 963 | WindowToolIsVisible 964 | Yes 965 | 966 | 967 | Identifier 968 | windowTool.scm 969 | Layout 970 | 971 | 972 | Dock 973 | 974 | 975 | ContentConfiguration 976 | 977 | PBXProjectModuleGUID 978 | 1C78EAB2065D492600B07095 979 | PBXProjectModuleLabel 980 | <No Editor> 981 | PBXSplitModuleInNavigatorKey 982 | 983 | Split0 984 | 985 | PBXProjectModuleGUID 986 | 1C78EAB3065D492600B07095 987 | 988 | SplitCount 989 | 1 990 | 991 | StatusBarVisibility 992 | 1 993 | 994 | GeometryConfiguration 995 | 996 | Frame 997 | {{0, 0}, {452, 0}} 998 | RubberWindowFrame 999 | 743 379 452 308 0 0 1280 1002 1000 | 1001 | Module 1002 | PBXNavigatorGroup 1003 | Proportion 1004 | 0pt 1005 | 1006 | 1007 | BecomeActive 1008 | 1 1009 | ContentConfiguration 1010 | 1011 | PBXProjectModuleGUID 1012 | 1CD052920623707200166675 1013 | PBXProjectModuleLabel 1014 | SCM 1015 | 1016 | GeometryConfiguration 1017 | 1018 | ConsoleFrame 1019 | {{0, 259}, {452, 0}} 1020 | Frame 1021 | {{0, 7}, {452, 259}} 1022 | RubberWindowFrame 1023 | 743 379 452 308 0 0 1280 1002 1024 | TableConfiguration 1025 | 1026 | Status 1027 | 30 1028 | FileName 1029 | 199 1030 | Path 1031 | 197.0950012207031 1032 | 1033 | TableFrame 1034 | {{0, 0}, {452, 250}} 1035 | 1036 | Module 1037 | PBXCVSModule 1038 | Proportion 1039 | 262pt 1040 | 1041 | 1042 | Proportion 1043 | 266pt 1044 | 1045 | 1046 | Name 1047 | SCM 1048 | ServiceClasses 1049 | 1050 | PBXCVSModule 1051 | 1052 | StatusbarIsVisible 1053 | 1 1054 | TableOfContents 1055 | 1056 | 1C78EAB4065D492600B07095 1057 | 1C78EAB5065D492600B07095 1058 | 1C78EAB2065D492600B07095 1059 | 1CD052920623707200166675 1060 | 1061 | ToolbarConfiguration 1062 | xcode.toolbar.config.scm 1063 | WindowString 1064 | 743 379 452 308 0 0 1280 1002 1065 | 1066 | 1067 | Identifier 1068 | windowTool.breakpoints 1069 | IsVertical 1070 | 0 1071 | Layout 1072 | 1073 | 1074 | Dock 1075 | 1076 | 1077 | BecomeActive 1078 | 1 1079 | ContentConfiguration 1080 | 1081 | PBXBottomSmartGroupGIDs 1082 | 1083 | 1C77FABC04509CD000000102 1084 | 1085 | PBXProjectModuleGUID 1086 | 1CE0B1FE06471DED0097A5F4 1087 | PBXProjectModuleLabel 1088 | Files 1089 | PBXProjectStructureProvided 1090 | no 1091 | PBXSmartGroupTreeModuleColumnData 1092 | 1093 | PBXSmartGroupTreeModuleColumnWidthsKey 1094 | 1095 | 168 1096 | 1097 | PBXSmartGroupTreeModuleColumnsKey_v4 1098 | 1099 | MainColumn 1100 | 1101 | 1102 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1103 | 1104 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1105 | 1106 | 1C77FABC04509CD000000102 1107 | 1108 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1109 | 1110 | 1111 | 0 1112 | 1113 | 1114 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1115 | {{0, 0}, {168, 350}} 1116 | 1117 | PBXTopSmartGroupGIDs 1118 | 1119 | XCIncludePerspectivesSwitch 1120 | 0 1121 | 1122 | GeometryConfiguration 1123 | 1124 | Frame 1125 | {{0, 0}, {185, 368}} 1126 | GroupTreeTableConfiguration 1127 | 1128 | MainColumn 1129 | 168 1130 | 1131 | RubberWindowFrame 1132 | 315 424 744 409 0 0 1440 878 1133 | 1134 | Module 1135 | PBXSmartGroupTreeModule 1136 | Proportion 1137 | 185pt 1138 | 1139 | 1140 | ContentConfiguration 1141 | 1142 | PBXProjectModuleGUID 1143 | 1CA1AED706398EBD00589147 1144 | PBXProjectModuleLabel 1145 | Detail 1146 | 1147 | GeometryConfiguration 1148 | 1149 | Frame 1150 | {{190, 0}, {554, 368}} 1151 | RubberWindowFrame 1152 | 315 424 744 409 0 0 1440 878 1153 | 1154 | Module 1155 | XCDetailModule 1156 | Proportion 1157 | 554pt 1158 | 1159 | 1160 | Proportion 1161 | 368pt 1162 | 1163 | 1164 | MajorVersion 1165 | 3 1166 | MinorVersion 1167 | 0 1168 | Name 1169 | Breakpoints 1170 | ServiceClasses 1171 | 1172 | PBXSmartGroupTreeModule 1173 | XCDetailModule 1174 | 1175 | StatusbarIsVisible 1176 | 1 1177 | TableOfContents 1178 | 1179 | 1CDDB66807F98D9800BB5817 1180 | 1CDDB66907F98D9800BB5817 1181 | 1CE0B1FE06471DED0097A5F4 1182 | 1CA1AED706398EBD00589147 1183 | 1184 | ToolbarConfiguration 1185 | xcode.toolbar.config.breakpointsV3 1186 | WindowString 1187 | 315 424 744 409 0 0 1440 878 1188 | WindowToolGUID 1189 | 1CDDB66807F98D9800BB5817 1190 | WindowToolIsVisible 1191 | 1 1192 | 1193 | 1194 | Identifier 1195 | windowTool.debugAnimator 1196 | Layout 1197 | 1198 | 1199 | Dock 1200 | 1201 | 1202 | Module 1203 | PBXNavigatorGroup 1204 | Proportion 1205 | 100% 1206 | 1207 | 1208 | Proportion 1209 | 100% 1210 | 1211 | 1212 | Name 1213 | Debug Visualizer 1214 | ServiceClasses 1215 | 1216 | PBXNavigatorGroup 1217 | 1218 | StatusbarIsVisible 1219 | 1 1220 | ToolbarConfiguration 1221 | xcode.toolbar.config.debugAnimatorV3 1222 | WindowString 1223 | 100 100 700 500 0 0 1280 1002 1224 | 1225 | 1226 | Identifier 1227 | windowTool.bookmarks 1228 | Layout 1229 | 1230 | 1231 | Dock 1232 | 1233 | 1234 | Module 1235 | PBXBookmarksModule 1236 | Proportion 1237 | 100% 1238 | 1239 | 1240 | Proportion 1241 | 100% 1242 | 1243 | 1244 | Name 1245 | Bookmarks 1246 | ServiceClasses 1247 | 1248 | PBXBookmarksModule 1249 | 1250 | StatusbarIsVisible 1251 | 0 1252 | WindowString 1253 | 538 42 401 187 0 0 1280 1002 1254 | 1255 | 1256 | Identifier 1257 | windowTool.projectFormatConflicts 1258 | Layout 1259 | 1260 | 1261 | Dock 1262 | 1263 | 1264 | Module 1265 | XCProjectFormatConflictsModule 1266 | Proportion 1267 | 100% 1268 | 1269 | 1270 | Proportion 1271 | 100% 1272 | 1273 | 1274 | Name 1275 | Project Format Conflicts 1276 | ServiceClasses 1277 | 1278 | XCProjectFormatConflictsModule 1279 | 1280 | StatusbarIsVisible 1281 | 0 1282 | WindowContentMinSize 1283 | 450 300 1284 | WindowString 1285 | 50 850 472 307 0 0 1440 877 1286 | 1287 | 1288 | Identifier 1289 | windowTool.classBrowser 1290 | Layout 1291 | 1292 | 1293 | Dock 1294 | 1295 | 1296 | BecomeActive 1297 | 1 1298 | ContentConfiguration 1299 | 1300 | OptionsSetName 1301 | Hierarchy, all classes 1302 | PBXProjectModuleGUID 1303 | 1CA6456E063B45B4001379D8 1304 | PBXProjectModuleLabel 1305 | Class Browser - NSObject 1306 | 1307 | GeometryConfiguration 1308 | 1309 | ClassesFrame 1310 | {{0, 0}, {374, 96}} 1311 | ClassesTreeTableConfiguration 1312 | 1313 | PBXClassNameColumnIdentifier 1314 | 208 1315 | PBXClassBookColumnIdentifier 1316 | 22 1317 | 1318 | Frame 1319 | {{0, 0}, {630, 331}} 1320 | MembersFrame 1321 | {{0, 105}, {374, 395}} 1322 | MembersTreeTableConfiguration 1323 | 1324 | PBXMemberTypeIconColumnIdentifier 1325 | 22 1326 | PBXMemberNameColumnIdentifier 1327 | 216 1328 | PBXMemberTypeColumnIdentifier 1329 | 97 1330 | PBXMemberBookColumnIdentifier 1331 | 22 1332 | 1333 | PBXModuleWindowStatusBarHidden2 1334 | 1 1335 | RubberWindowFrame 1336 | 385 179 630 352 0 0 1440 878 1337 | 1338 | Module 1339 | PBXClassBrowserModule 1340 | Proportion 1341 | 332pt 1342 | 1343 | 1344 | Proportion 1345 | 332pt 1346 | 1347 | 1348 | Name 1349 | Class Browser 1350 | ServiceClasses 1351 | 1352 | PBXClassBrowserModule 1353 | 1354 | StatusbarIsVisible 1355 | 0 1356 | TableOfContents 1357 | 1358 | 1C0AD2AF069F1E9B00FABCE6 1359 | 1C0AD2B0069F1E9B00FABCE6 1360 | 1CA6456E063B45B4001379D8 1361 | 1362 | ToolbarConfiguration 1363 | xcode.toolbar.config.classbrowser 1364 | WindowString 1365 | 385 179 630 352 0 0 1440 878 1366 | WindowToolGUID 1367 | 1C0AD2AF069F1E9B00FABCE6 1368 | WindowToolIsVisible 1369 | 0 1370 | 1371 | 1372 | Identifier 1373 | windowTool.refactoring 1374 | IncludeInToolsMenu 1375 | 0 1376 | Layout 1377 | 1378 | 1379 | Dock 1380 | 1381 | 1382 | BecomeActive 1383 | 1 1384 | GeometryConfiguration 1385 | 1386 | Frame 1387 | {0, 0}, {500, 335} 1388 | RubberWindowFrame 1389 | {0, 0}, {500, 335} 1390 | 1391 | Module 1392 | XCRefactoringModule 1393 | Proportion 1394 | 100% 1395 | 1396 | 1397 | Proportion 1398 | 100% 1399 | 1400 | 1401 | Name 1402 | Refactoring 1403 | ServiceClasses 1404 | 1405 | XCRefactoringModule 1406 | 1407 | WindowString 1408 | 200 200 500 356 0 0 1920 1200 1409 | 1410 | 1411 | 1412 | 1413 | -------------------------------------------------------------------------------- /PanelTableView/PanelTableView.xcodeproj/honcheng.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 1D3623240D0F684500981E51 /* PanelTableViewAppDelegate.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {523, 247}}"; 6 | sepNavSelRange = "{121, 0}"; 7 | sepNavVisRange = "{0, 336}"; 8 | }; 9 | }; 10 | 1D3623250D0F684500981E51 /* PanelTableViewAppDelegate.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {810, 1222}}"; 13 | sepNavSelRange = "{121, 0}"; 14 | sepNavVisRange = "{0, 418}"; 15 | }; 16 | }; 17 | 1D6058900D05DD3D006BFB54 /* PanelTableView */ = { 18 | activeExec = 0; 19 | executables = ( 20 | F8ABEFA412A0C71000D78DF9 /* PanelTableView */, 21 | ); 22 | }; 23 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 24 | activeBuildConfigurationName = Debug; 25 | activeExecutable = F8ABEFA412A0C71000D78DF9 /* PanelTableView */; 26 | activeTarget = 1D6058900D05DD3D006BFB54 /* PanelTableView */; 27 | addToTargets = ( 28 | 1D6058900D05DD3D006BFB54 /* PanelTableView */, 29 | ); 30 | codeSenseManager = F8ABEFBA12A0C72300D78DF9 /* Code sense */; 31 | executables = ( 32 | F8ABEFA412A0C71000D78DF9 /* PanelTableView */, 33 | ); 34 | perUserDictionary = { 35 | PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { 36 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 37 | PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; 38 | PBXFileTableDataSourceColumnWidthsKey = ( 39 | 22, 40 | 300, 41 | 725, 42 | ); 43 | PBXFileTableDataSourceColumnsKey = ( 44 | PBXExecutablesDataSource_ActiveFlagID, 45 | PBXExecutablesDataSource_NameID, 46 | PBXExecutablesDataSource_CommentsID, 47 | ); 48 | }; 49 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 50 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 51 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 52 | PBXFileTableDataSourceColumnWidthsKey = ( 53 | 20, 54 | 837, 55 | 20, 56 | 48, 57 | 43, 58 | 43, 59 | 20, 60 | ); 61 | PBXFileTableDataSourceColumnsKey = ( 62 | PBXFileDataSource_FiletypeID, 63 | PBXFileDataSource_Filename_ColumnID, 64 | PBXFileDataSource_Built_ColumnID, 65 | PBXFileDataSource_ObjectSize_ColumnID, 66 | PBXFileDataSource_Errors_ColumnID, 67 | PBXFileDataSource_Warnings_ColumnID, 68 | PBXFileDataSource_Target_ColumnID, 69 | ); 70 | }; 71 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 72 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 73 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 74 | PBXFileTableDataSourceColumnWidthsKey = ( 75 | 20, 76 | 797, 77 | 60, 78 | 20, 79 | 48, 80 | 43, 81 | 43, 82 | ); 83 | PBXFileTableDataSourceColumnsKey = ( 84 | PBXFileDataSource_FiletypeID, 85 | PBXFileDataSource_Filename_ColumnID, 86 | PBXTargetDataSource_PrimaryAttribute, 87 | PBXFileDataSource_Built_ColumnID, 88 | PBXFileDataSource_ObjectSize_ColumnID, 89 | PBXFileDataSource_Errors_ColumnID, 90 | PBXFileDataSource_Warnings_ColumnID, 91 | ); 92 | }; 93 | PBXPerProjectTemplateStateSaveDate = 312527314; 94 | PBXWorkspaceStateSaveDate = 312527314; 95 | }; 96 | perUserProjectItems = { 97 | F8ABF0BD12A0CEF800D78DF9 /* PBXTextBookmark */ = F8ABF0BD12A0CEF800D78DF9 /* PBXTextBookmark */; 98 | F8ABF0BE12A0CEF800D78DF9 /* PBXTextBookmark */ = F8ABF0BE12A0CEF800D78DF9 /* PBXTextBookmark */; 99 | F8ABF0C012A0CEF800D78DF9 /* PBXTextBookmark */ = F8ABF0C012A0CEF800D78DF9 /* PBXTextBookmark */; 100 | F8ABF20D12A0DA3700D78DF9 /* PBXTextBookmark */ = F8ABF20D12A0DA3700D78DF9 /* PBXTextBookmark */; 101 | F8ABF20E12A0DA3700D78DF9 /* PBXTextBookmark */ = F8ABF20E12A0DA3700D78DF9 /* PBXTextBookmark */; 102 | F8ABF20F12A0DA3700D78DF9 /* PBXTextBookmark */ = F8ABF20F12A0DA3700D78DF9 /* PBXTextBookmark */; 103 | F8ABF21012A0DA3700D78DF9 /* PBXTextBookmark */ = F8ABF21012A0DA3700D78DF9 /* PBXTextBookmark */; 104 | F8ABF21112A0DA3700D78DF9 /* PBXTextBookmark */ = F8ABF21112A0DA3700D78DF9 /* PBXTextBookmark */; 105 | }; 106 | sourceControlManager = F8ABEFB912A0C72300D78DF9 /* Source Control */; 107 | userBuildSettings = { 108 | }; 109 | }; 110 | 32CA4F630368D1EE00C91783 /* PanelTableView_Prefix.pch */ = { 111 | uiCtxt = { 112 | sepNavIntBoundsRect = "{{0, 0}, {712, 237}}"; 113 | sepNavSelRange = "{0, 0}"; 114 | sepNavVisRange = "{0, 197}"; 115 | }; 116 | }; 117 | F8ABEFA412A0C71000D78DF9 /* PanelTableView */ = { 118 | isa = PBXExecutable; 119 | activeArgIndices = ( 120 | ); 121 | argumentStrings = ( 122 | ); 123 | autoAttachOnCrash = 1; 124 | breakpointsEnabled = 0; 125 | configStateDict = { 126 | }; 127 | customDataFormattersEnabled = 1; 128 | dataTipCustomDataFormattersEnabled = 1; 129 | dataTipShowTypeColumn = 1; 130 | dataTipSortType = 0; 131 | debuggerPlugin = GDBDebugging; 132 | disassemblyDisplayState = 0; 133 | dylibVariantSuffix = ""; 134 | enableDebugStr = 1; 135 | environmentEntries = ( 136 | ); 137 | executableSystemSymbolLevel = 0; 138 | executableUserSymbolLevel = 0; 139 | libgmallocEnabled = 0; 140 | name = PanelTableView; 141 | showTypeColumn = 0; 142 | sourceDirectories = ( 143 | ); 144 | }; 145 | F8ABEFB912A0C72300D78DF9 /* Source Control */ = { 146 | isa = PBXSourceControlManager; 147 | fallbackIsa = XCSourceControlManager; 148 | isSCMEnabled = 0; 149 | scmConfiguration = { 150 | repositoryNamesForRoots = { 151 | "" = ""; 152 | }; 153 | }; 154 | }; 155 | F8ABEFBA12A0C72300D78DF9 /* Code sense */ = { 156 | isa = PBXCodeSenseManager; 157 | indexTemplatePath = ""; 158 | }; 159 | F8ABEFFA12A0CABA00D78DF9 /* PanelIndexPath.h */ = { 160 | uiCtxt = { 161 | sepNavIntBoundsRect = "{{0, 0}, {1015, 578}}"; 162 | sepNavSelRange = "{170, 0}"; 163 | sepNavVisRange = "{0, 517}"; 164 | }; 165 | }; 166 | F8ABEFFB12A0CABA00D78DF9 /* PanelIndexPath.m */ = { 167 | uiCtxt = { 168 | sepNavIntBoundsRect = "{{0, 0}, {929, 481}}"; 169 | sepNavSelRange = "{652, 0}"; 170 | sepNavVisRange = "{296, 465}"; 171 | sepNavWindowFrame = "{{191, 76}, {967, 903}}"; 172 | }; 173 | }; 174 | F8ABF0BD12A0CEF800D78DF9 /* PBXTextBookmark */ = { 175 | isa = PBXTextBookmark; 176 | fRef = 1D3623250D0F684500981E51 /* PanelTableViewAppDelegate.m */; 177 | name = "PanelTableViewAppDelegate.m: 6"; 178 | rLen = 0; 179 | rLoc = 121; 180 | rType = 0; 181 | vrLen = 418; 182 | vrLoc = 0; 183 | }; 184 | F8ABF0BE12A0CEF800D78DF9 /* PBXTextBookmark */ = { 185 | isa = PBXTextBookmark; 186 | fRef = 32CA4F630368D1EE00C91783 /* PanelTableView_Prefix.pch */; 187 | name = "PanelTableView_Prefix.pch: 1"; 188 | rLen = 0; 189 | rLoc = 0; 190 | rType = 0; 191 | vrLen = 197; 192 | vrLoc = 0; 193 | }; 194 | F8ABF0C012A0CEF800D78DF9 /* PBXTextBookmark */ = { 195 | isa = PBXTextBookmark; 196 | fRef = 1D3623240D0F684500981E51 /* PanelTableViewAppDelegate.h */; 197 | name = "PanelTableViewAppDelegate.h: 6"; 198 | rLen = 0; 199 | rLoc = 121; 200 | rType = 0; 201 | vrLen = 336; 202 | vrLoc = 0; 203 | }; 204 | F8ABF16A12A0D1C400D78DF9 /* PanelView.h */ = { 205 | uiCtxt = { 206 | sepNavIntBoundsRect = "{{0, 0}, {1015, 715}}"; 207 | sepNavSelRange = "{805, 1}"; 208 | sepNavVisRange = "{156, 1417}"; 209 | }; 210 | }; 211 | F8ABF16B12A0D1C400D78DF9 /* PanelView.m */ = { 212 | uiCtxt = { 213 | sepNavIntBoundsRect = "{{0, 0}, {1015, 4693}}"; 214 | sepNavSelRange = "{2715, 0}"; 215 | sepNavVisRange = "{2537, 1226}"; 216 | }; 217 | }; 218 | F8ABF16D12A0D21B00D78DF9 /* PanelsViewController.h */ = { 219 | uiCtxt = { 220 | sepNavIntBoundsRect = "{{0, 0}, {1015, 578}}"; 221 | sepNavSelRange = "{216, 0}"; 222 | sepNavVisRange = "{0, 938}"; 223 | }; 224 | }; 225 | F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */ = { 226 | uiCtxt = { 227 | sepNavIntBoundsRect = "{{0, 0}, {1015, 4186}}"; 228 | sepNavSelRange = "{7133, 0}"; 229 | sepNavVisRange = "{6106, 1241}"; 230 | }; 231 | }; 232 | F8ABF20D12A0DA3700D78DF9 /* PBXTextBookmark */ = { 233 | isa = PBXTextBookmark; 234 | fRef = F8ABF16B12A0D1C400D78DF9 /* PanelView.m */; 235 | name = "PanelView.m: 127"; 236 | rLen = 0; 237 | rLoc = 2992; 238 | rType = 0; 239 | vrLen = 1226; 240 | vrLoc = 2537; 241 | }; 242 | F8ABF20E12A0DA3700D78DF9 /* PBXTextBookmark */ = { 243 | isa = PBXTextBookmark; 244 | fRef = F8ABF16A12A0D1C400D78DF9 /* PanelView.h */; 245 | name = "PanelView.h: 26"; 246 | rLen = 1; 247 | rLoc = 805; 248 | rType = 0; 249 | vrLen = 1417; 250 | vrLoc = 156; 251 | }; 252 | F8ABF20F12A0DA3700D78DF9 /* PBXTextBookmark */ = { 253 | isa = PBXTextBookmark; 254 | fRef = F8ABF16D12A0D21B00D78DF9 /* PanelsViewController.h */; 255 | name = "PanelsViewController.h: 12"; 256 | rLen = 0; 257 | rLoc = 216; 258 | rType = 0; 259 | vrLen = 938; 260 | vrLoc = 0; 261 | }; 262 | F8ABF21012A0DA3700D78DF9 /* PBXTextBookmark */ = { 263 | isa = PBXTextBookmark; 264 | fRef = F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */; 265 | name = "PanelsViewController.m: 241"; 266 | rLen = 0; 267 | rLoc = 6792; 268 | rType = 0; 269 | vrLen = 1090; 270 | vrLoc = 6973; 271 | }; 272 | F8ABF21112A0DA3700D78DF9 /* PBXTextBookmark */ = { 273 | isa = PBXTextBookmark; 274 | fRef = F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */; 275 | name = "PanelsViewController.m: 255"; 276 | rLen = 0; 277 | rLoc = 7133; 278 | rType = 0; 279 | vrLen = 1241; 280 | vrLoc = 6106; 281 | }; 282 | } 283 | -------------------------------------------------------------------------------- /PanelTableView/PanelTableView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 45; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* PanelTableViewAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* PanelTableViewAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 15 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 16 | F8ABF15012A0D11600D78DF9 /* PanelIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABEFFB12A0CABA00D78DF9 /* PanelIndexPath.m */; }; 17 | F8ABF16C12A0D1C400D78DF9 /* PanelView.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF16B12A0D1C400D78DF9 /* PanelView.m */; }; 18 | F8ABF16F12A0D21B00D78DF9 /* PanelsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 23 | 1D3623240D0F684500981E51 /* PanelTableViewAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PanelTableViewAppDelegate.h; sourceTree = ""; }; 24 | 1D3623250D0F684500981E51 /* PanelTableViewAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PanelTableViewAppDelegate.m; sourceTree = ""; }; 25 | 1D6058910D05DD3D006BFB54 /* PanelTableView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PanelTableView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 27 | 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 28 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 29 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 30 | 32CA4F630368D1EE00C91783 /* PanelTableView_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PanelTableView_Prefix.pch; sourceTree = ""; }; 31 | 8D1107310486CEB800E47090 /* PanelTableView-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "PanelTableView-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 32 | F8ABEFFA12A0CABA00D78DF9 /* PanelIndexPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PanelIndexPath.h; sourceTree = ""; }; 33 | F8ABEFFB12A0CABA00D78DF9 /* PanelIndexPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PanelIndexPath.m; sourceTree = ""; }; 34 | F8ABF16A12A0D1C400D78DF9 /* PanelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PanelView.h; sourceTree = ""; }; 35 | F8ABF16B12A0D1C400D78DF9 /* PanelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PanelView.m; sourceTree = ""; }; 36 | F8ABF16D12A0D21B00D78DF9 /* PanelsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PanelsViewController.h; sourceTree = ""; }; 37 | F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PanelsViewController.m; sourceTree = ""; }; 38 | /* End PBXFileReference section */ 39 | 40 | /* Begin PBXFrameworksBuildPhase section */ 41 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 42 | isa = PBXFrameworksBuildPhase; 43 | buildActionMask = 2147483647; 44 | files = ( 45 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 46 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 47 | 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | 080E96DDFE201D6D7F000001 /* Classes */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | F8ABEFEA12A0C9DD00D78DF9 /* PanelTableView */, 58 | 1D3623240D0F684500981E51 /* PanelTableViewAppDelegate.h */, 59 | 1D3623250D0F684500981E51 /* PanelTableViewAppDelegate.m */, 60 | ); 61 | path = Classes; 62 | sourceTree = ""; 63 | }; 64 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 1D6058910D05DD3D006BFB54 /* PanelTableView.app */, 68 | ); 69 | name = Products; 70 | sourceTree = ""; 71 | }; 72 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 080E96DDFE201D6D7F000001 /* Classes */, 76 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 77 | 29B97317FDCFA39411CA2CEA /* Resources */, 78 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 79 | 19C28FACFE9D520D11CA2CBB /* Products */, 80 | ); 81 | name = CustomTemplate; 82 | sourceTree = ""; 83 | }; 84 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 32CA4F630368D1EE00C91783 /* PanelTableView_Prefix.pch */, 88 | 29B97316FDCFA39411CA2CEA /* main.m */, 89 | ); 90 | name = "Other Sources"; 91 | sourceTree = ""; 92 | }; 93 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 97 | 8D1107310486CEB800E47090 /* PanelTableView-Info.plist */, 98 | ); 99 | name = Resources; 100 | sourceTree = ""; 101 | }; 102 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 106 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 107 | 288765FC0DF74451002DB57D /* CoreGraphics.framework */, 108 | ); 109 | name = Frameworks; 110 | sourceTree = ""; 111 | }; 112 | F8ABEFEA12A0C9DD00D78DF9 /* PanelTableView */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | F8ABEFFA12A0CABA00D78DF9 /* PanelIndexPath.h */, 116 | F8ABEFFB12A0CABA00D78DF9 /* PanelIndexPath.m */, 117 | F8ABF16A12A0D1C400D78DF9 /* PanelView.h */, 118 | F8ABF16B12A0D1C400D78DF9 /* PanelView.m */, 119 | F8ABF16D12A0D21B00D78DF9 /* PanelsViewController.h */, 120 | F8ABF16E12A0D21B00D78DF9 /* PanelsViewController.m */, 121 | ); 122 | name = PanelTableView; 123 | sourceTree = ""; 124 | }; 125 | /* End PBXGroup section */ 126 | 127 | /* Begin PBXNativeTarget section */ 128 | 1D6058900D05DD3D006BFB54 /* PanelTableView */ = { 129 | isa = PBXNativeTarget; 130 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "PanelTableView" */; 131 | buildPhases = ( 132 | 1D60588D0D05DD3D006BFB54 /* Resources */, 133 | 1D60588E0D05DD3D006BFB54 /* Sources */, 134 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 135 | ); 136 | buildRules = ( 137 | ); 138 | dependencies = ( 139 | ); 140 | name = PanelTableView; 141 | productName = PanelTableView; 142 | productReference = 1D6058910D05DD3D006BFB54 /* PanelTableView.app */; 143 | productType = "com.apple.product-type.application"; 144 | }; 145 | /* End PBXNativeTarget section */ 146 | 147 | /* Begin PBXProject section */ 148 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 149 | isa = PBXProject; 150 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "PanelTableView" */; 151 | compatibilityVersion = "Xcode 3.1"; 152 | developmentRegion = English; 153 | hasScannedForEncodings = 1; 154 | knownRegions = ( 155 | English, 156 | Japanese, 157 | French, 158 | German, 159 | ); 160 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 161 | projectDirPath = ""; 162 | projectRoot = ""; 163 | targets = ( 164 | 1D6058900D05DD3D006BFB54 /* PanelTableView */, 165 | ); 166 | }; 167 | /* End PBXProject section */ 168 | 169 | /* Begin PBXResourcesBuildPhase section */ 170 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 171 | isa = PBXResourcesBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | /* End PBXResourcesBuildPhase section */ 179 | 180 | /* Begin PBXSourcesBuildPhase section */ 181 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 182 | isa = PBXSourcesBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 186 | 1D3623260D0F684500981E51 /* PanelTableViewAppDelegate.m in Sources */, 187 | F8ABF15012A0D11600D78DF9 /* PanelIndexPath.m in Sources */, 188 | F8ABF16C12A0D1C400D78DF9 /* PanelView.m in Sources */, 189 | F8ABF16F12A0D21B00D78DF9 /* PanelsViewController.m in Sources */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXSourcesBuildPhase section */ 194 | 195 | /* Begin XCBuildConfiguration section */ 196 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 197 | isa = XCBuildConfiguration; 198 | buildSettings = { 199 | ALWAYS_SEARCH_USER_PATHS = NO; 200 | COPY_PHASE_STRIP = NO; 201 | GCC_DYNAMIC_NO_PIC = NO; 202 | GCC_OPTIMIZATION_LEVEL = 0; 203 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 204 | GCC_PREFIX_HEADER = PanelTableView_Prefix.pch; 205 | INFOPLIST_FILE = "PanelTableView-Info.plist"; 206 | OTHER_LDFLAGS = ""; 207 | PRODUCT_NAME = PanelTableView; 208 | }; 209 | name = Debug; 210 | }; 211 | 1D6058950D05DD3E006BFB54 /* Release */ = { 212 | isa = XCBuildConfiguration; 213 | buildSettings = { 214 | ALWAYS_SEARCH_USER_PATHS = NO; 215 | COPY_PHASE_STRIP = YES; 216 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 217 | GCC_PREFIX_HEADER = PanelTableView_Prefix.pch; 218 | INFOPLIST_FILE = "PanelTableView-Info.plist"; 219 | OTHER_LDFLAGS = ""; 220 | PRODUCT_NAME = PanelTableView; 221 | VALIDATE_PRODUCT = YES; 222 | }; 223 | name = Release; 224 | }; 225 | C01FCF4F08A954540054247B /* Debug */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 229 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 230 | GCC_C_LANGUAGE_STANDARD = c99; 231 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 232 | GCC_WARN_UNUSED_VARIABLE = YES; 233 | OTHER_LDFLAGS = ""; 234 | PREBINDING = NO; 235 | SDKROOT = iphoneos; 236 | }; 237 | name = Debug; 238 | }; 239 | C01FCF5008A954540054247B /* Release */ = { 240 | isa = XCBuildConfiguration; 241 | buildSettings = { 242 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 243 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 244 | GCC_C_LANGUAGE_STANDARD = c99; 245 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 246 | GCC_WARN_UNUSED_VARIABLE = YES; 247 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 248 | OTHER_LDFLAGS = ""; 249 | PREBINDING = NO; 250 | SDKROOT = iphoneos; 251 | }; 252 | name = Release; 253 | }; 254 | /* End XCBuildConfiguration section */ 255 | 256 | /* Begin XCConfigurationList section */ 257 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "PanelTableView" */ = { 258 | isa = XCConfigurationList; 259 | buildConfigurations = ( 260 | 1D6058940D05DD3E006BFB54 /* Debug */, 261 | 1D6058950D05DD3E006BFB54 /* Release */, 262 | ); 263 | defaultConfigurationIsVisible = 0; 264 | defaultConfigurationName = Release; 265 | }; 266 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "PanelTableView" */ = { 267 | isa = XCConfigurationList; 268 | buildConfigurations = ( 269 | C01FCF4F08A954540054247B /* Debug */, 270 | C01FCF5008A954540054247B /* Release */, 271 | ); 272 | defaultConfigurationIsVisible = 0; 273 | defaultConfigurationName = Release; 274 | }; 275 | /* End XCConfigurationList section */ 276 | }; 277 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 278 | } 279 | -------------------------------------------------------------------------------- /PanelTableView/PanelTableView_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'PanelTableView' target in the 'PanelTableView' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /PanelTableView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PanelTableView 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 databinge. 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #PanelTableView for iOS 2 | Creates a UIViewController with multiple UITableView in a UIScrollView 3 | 4 | 5 | 6 | 7 | 8 | Features 9 | -------- 10 | * recycle views efficiently 11 | * save/restore table offsets for different panels 12 | * delegate and datasource similar to that of UITableView 13 | * PanelIndexPath behaves like IndexPath, but with an additional parameter, page 14 | 15 | Instructions 16 | ------------ 17 | 1) Drag required files to your XCode Project 18 | 19 | PanelIndexPath.h & PanelIndexPath.m 20 | PanelView.h & PanelView.m 21 | PanelsViewController.h & PanelsViewController.m 22 | 23 | 2) Create a UIViewController that subclasses PanelsViewController 24 | 25 | 3) PanelsViewController contains a set of delegate/datasource methods that should be overridden in the subclass 26 | 27 | Specifies the number of panels to create, similar to numberOfSectionsInTableView: 28 | 29 | - (NSInteger)numberOfPanels 30 | 31 | 32 | Specifies the number of rows in a particular page, at a particular section, similar to tableView:numberOfRowsInSection: 33 | 34 | - (NSInteger)panelView:(PanelView *)panelView numberOfRowsInPage:(NSInteger)page section:(NSInteger)section 35 | 36 | 37 | Similar to tableView:cellForRowAtIndexPath: 38 | 39 | - (UITableViewCell *)panelView:(PanelView *)panelView cellForRowAtIndexPath:(PanelIndexPath *)indexPath 40 | 41 | 42 | Create the panel. to create custom panels, subclass PanelView 43 | 44 | - (PanelView *)panelForPage:(NSInteger)page 45 | 46 | 47 | Similar to tableView:didSelectRowAtIndexPath: 48 | 49 | - (void)panelView:(PanelView *)panelView didSelectRowAtIndexPath:(PanelIndexPath *)indexPath 50 | 51 | 52 | Contact 53 | ------- 54 | [honcheng.com](http://honcheng.com) 55 | [@honcheng](http://twitter.com/honcheng) 56 | 57 | ![](http://www.cocoacontrols.com/analytics/honcheng/paneltableview.png) 58 | 59 | -------------------------------------------------------------------------------- /blog-resources/plan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/honcheng/PanelTableView/95ddddd98c97d13356547dd5df9d7ed79f21cf49/blog-resources/plan.png -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SampleAppAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SampleAppAppDelegate.h 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SampleAppAppDelegate : NSObject 12 | @property (nonatomic, strong) IBOutlet UIWindow *window; 13 | 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SampleAppAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SampleAppAppDelegate.m 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import "SampleAppAppDelegate.h" 10 | #import "SamplePanelsViewController.h" 11 | #import "SamplePanelsViewControllerForiPad.h" 12 | 13 | @implementation SampleAppAppDelegate 14 | 15 | 16 | #pragma mark - 17 | #pragma mark Application lifecycle 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | 21 | id panelsViewController = nil; 22 | if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone) 23 | { 24 | panelsViewController = [[SamplePanelsViewController alloc] init]; 25 | } 26 | else if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad) 27 | { 28 | panelsViewController = [[SamplePanelsViewControllerForiPad alloc] init]; 29 | } 30 | UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:panelsViewController]; 31 | [[navController navigationBar] setBarStyle:UIBarStyleBlackTranslucent]; 32 | [self.window setRootViewController:navController]; 33 | 34 | [self.window makeKeyAndVisible]; 35 | 36 | return YES; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SamplePanelView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePanelView.h 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PanelView.h" 11 | 12 | @interface SamplePanelView : PanelView 13 | @end 14 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SamplePanelView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePanelView.m 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import "SamplePanelView.h" 10 | 11 | 12 | @implementation SamplePanelView 13 | 14 | - (id)initWithFrame:(CGRect)frame { 15 | 16 | self = [super initWithFrame:frame]; 17 | if (self) { 18 | // Initialization code. 19 | [self.tableView setBackgroundColor:[UIColor colorWithWhite:0.95 alpha:1]]; 20 | } 21 | return self; 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SamplePanelsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePanelsViewController.h 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PanelsViewController.h" 11 | 12 | @interface SamplePanelsViewController : PanelsViewController 13 | @property (nonatomic, strong) NSMutableArray *panelsArray; 14 | @property (nonatomic, strong) UIBarButtonItem *editItem, *doneItem, *addRemoveItem; 15 | - (void)addTemporaryUI; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SamplePanelsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePanelsViewController.m 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import "SamplePanelsViewController.h" 10 | #import "SamplePanelView.h" 11 | 12 | @implementation SamplePanelsViewController 13 | 14 | - (id)init 15 | { 16 | if (self = [super init]) 17 | { 18 | _panelsArray = [NSMutableArray new]; 19 | int numberOfPanels = 10; 20 | for (int i=0; i 10 | #import "SamplePanelsViewController.h" 11 | 12 | @interface SamplePanelsViewControllerForiPad : SamplePanelsViewController 13 | @end 14 | -------------------------------------------------------------------------------- /sample project/SampleApp/Classes/SamplePanelsViewControllerForiPad.m: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePanelsViewControllerForiPad.m 3 | // SampleApp 4 | // 5 | // Created by honcheng on 3/12/11. 6 | // Copyright 2011 honcheng. All rights reserved. 7 | // 8 | 9 | #import "SamplePanelsViewControllerForiPad.h" 10 | 11 | 12 | @implementation SamplePanelsViewControllerForiPad 13 | 14 | #pragma mark sizes 15 | 16 | - (CGRect)scrollViewFrame 17 | { 18 | return CGRectMake(0,0,[self.view bounds].size.width,[self.view bounds].size.height); 19 | } 20 | 21 | - (int)numberOfVisiblePanels 22 | { 23 | return 2; 24 | } 25 | 26 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 27 | // Overriden to allow any orientation. 28 | return UIInterfaceOrientationIsPortrait(interfaceOrientation); 29 | } 30 | 31 | 32 | - (void)didReceiveMemoryWarning { 33 | // Releases the view if it doesn't have a superview. 34 | [super didReceiveMemoryWarning]; 35 | 36 | // Release any cached data, images, etc. that aren't in use. 37 | } 38 | 39 | 40 | - (void)viewDidUnload { 41 | [super viewDidUnload]; 42 | // Release any retained subviews of the main view. 43 | // e.g. self.myOutlet = nil; 44 | } 45 | 46 | 47 | 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /sample project/SampleApp/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 800 5 | 10D540 6 | 760 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 81 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 | 1316 46 | 47 | {320, 480} 48 | 49 | 50 | 1 51 | MSAxIDEAA 52 | 53 | NO 54 | NO 55 | 56 | IBCocoaTouchFramework 57 | YES 58 | 59 | 60 | 61 | 62 | YES 63 | 64 | 65 | delegate 66 | 67 | 68 | 69 | 4 70 | 71 | 72 | 73 | window 74 | 75 | 76 | 77 | 5 78 | 79 | 80 | 81 | 82 | YES 83 | 84 | 0 85 | 86 | 87 | 88 | 89 | 90 | 2 91 | 92 | 93 | YES 94 | 95 | 96 | 97 | 98 | -1 99 | 100 | 101 | File's Owner 102 | 103 | 104 | 3 105 | 106 | 107 | 108 | 109 | -2 110 | 111 | 112 | 113 | 114 | 115 | 116 | YES 117 | 118 | YES 119 | -1.CustomClassName 120 | -2.CustomClassName 121 | 2.IBAttributePlaceholdersKey 122 | 2.IBEditorWindowLastContentRect 123 | 2.IBPluginDependency 124 | 3.CustomClassName 125 | 3.IBPluginDependency 126 | 127 | 128 | YES 129 | UIApplication 130 | UIResponder 131 | 132 | YES 133 | 134 | 135 | YES 136 | 137 | 138 | {{198, 376}, {320, 480}} 139 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 140 | SampleAppAppDelegate 141 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 142 | 143 | 144 | 145 | YES 146 | 147 | 148 | YES 149 | 150 | 151 | 152 | 153 | YES 154 | 155 | 156 | YES 157 | 158 | 159 | 160 | 9 161 | 162 | 163 | 164 | YES 165 | 166 | SampleAppAppDelegate 167 | NSObject 168 | 169 | window 170 | UIWindow 171 | 172 | 173 | IBProjectSource 174 | Classes/SampleAppAppDelegate.h 175 | 176 | 177 | 178 | SampleAppAppDelegate 179 | NSObject 180 | 181 | IBUserSource 182 | 183 | 184 | 185 | 186 | 187 | 0 188 | IBCocoaTouchFramework 189 | 190 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 191 | 192 | 193 | YES 194 | SampleApp.xcodeproj 195 | 3 196 | 81 197 | 198 | 199 | -------------------------------------------------------------------------------- /sample project/SampleApp/Resources-iPad/MainWindow-iPad.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1056 5 | 10J567 6 | 823 7 | 1038.35 8 | 462.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 132 12 | 13 | 14 | YES 15 | 16 | 17 | YES 18 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 19 | 20 | 21 | YES 22 | 23 | YES 24 | 25 | 26 | YES 27 | 28 | 29 | 30 | YES 31 | 32 | IBFilesOwner 33 | IBIPadFramework 34 | 35 | 36 | IBFirstResponder 37 | IBIPadFramework 38 | 39 | 40 | IBIPadFramework 41 | 42 | 43 | 44 | 1316 45 | 46 | {768, 1004} 47 | 48 | 1 49 | MSAxIDEAA 50 | 51 | NO 52 | NO 53 | 54 | 2 55 | 56 | IBIPadFramework 57 | YES 58 | 59 | 60 | 61 | 62 | YES 63 | 64 | 65 | delegate 66 | 67 | 68 | 69 | 4 70 | 71 | 72 | 73 | window 74 | 75 | 76 | 77 | 5 78 | 79 | 80 | 81 | 82 | YES 83 | 84 | 0 85 | 86 | 87 | 88 | 89 | 90 | 2 91 | 92 | 93 | YES 94 | 95 | 96 | 97 | 98 | -1 99 | 100 | 101 | File's Owner 102 | 103 | 104 | 3 105 | 106 | 107 | 108 | 109 | -2 110 | 111 | 112 | 113 | 114 | 115 | 116 | YES 117 | 118 | YES 119 | -1.CustomClassName 120 | -2.CustomClassName 121 | 2.IBAttributePlaceholdersKey 122 | 2.IBEditorWindowLastContentRect 123 | 2.IBLastUsedUIStatusBarStylesToTargetRuntimesMap 124 | 2.IBPluginDependency 125 | 3.CustomClassName 126 | 3.IBPluginDependency 127 | 128 | 129 | YES 130 | UIApplication 131 | UIResponder 132 | 133 | YES 134 | 135 | 136 | YES 137 | 138 | 139 | {{198, 376}, {320, 480}} 140 | 141 | IBCocoaTouchFramework 142 | 143 | 144 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 145 | SampleAppAppDelegate 146 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 147 | 148 | 149 | 150 | YES 151 | 152 | 153 | YES 154 | 155 | 156 | 157 | 158 | YES 159 | 160 | 161 | YES 162 | 163 | 164 | 165 | 9 166 | 167 | 168 | 169 | YES 170 | 171 | SampleAppAppDelegate 172 | NSObject 173 | 174 | window 175 | UIWindow 176 | 177 | 178 | window 179 | 180 | window 181 | UIWindow 182 | 183 | 184 | 185 | IBProjectSource 186 | Classes/SampleAppAppDelegate.h 187 | 188 | 189 | 190 | SampleAppAppDelegate 191 | NSObject 192 | 193 | IBUserSource 194 | 195 | 196 | 197 | 198 | 199 | 0 200 | IBIPadFramework 201 | 202 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 203 | 204 | 205 | 206 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 207 | 208 | 209 | YES 210 | SampleApp.xcodeproj 211 | 3 212 | 132 213 | 214 | 215 | -------------------------------------------------------------------------------- /sample project/SampleApp/SampleApp-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.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | NSMainNibFile~ipad 30 | MainWindow-iPad 31 | 32 | 33 | -------------------------------------------------------------------------------- /sample project/SampleApp/SampleApp.xcodeproj/honcheng.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | F8ABF26412A0E16000D78DF9 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | -1 204 | -1 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | active-combo-popup 212 | action 213 | NSToolbarFlexibleSpaceItem 214 | debugger-enable-breakpoints 215 | go 216 | build 217 | build-and-go 218 | clean-target 219 | com.apple.ide.PBXToolbarStopButton 220 | get-info 221 | NSToolbarFlexibleSpaceItem 222 | com.apple.pbx.toolbar.searchfield 223 | 224 | ControllerClassBaseName 225 | 226 | IconName 227 | WindowOfProjectWithEditor 228 | Identifier 229 | perspective.project 230 | IsVertical 231 | 232 | Layout 233 | 234 | 235 | ContentConfiguration 236 | 237 | PBXBottomSmartGroupGIDs 238 | 239 | 1C37FBAC04509CD000000102 240 | 1C37FAAC04509CD000000102 241 | 1C37FABC05509CD000000102 242 | 1C37FABC05539CD112110102 243 | E2644B35053B69B200211256 244 | 1C37FABC04509CD000100104 245 | 1CC0EA4004350EF90044410B 246 | 1CC0EA4004350EF90041110B 247 | 248 | PBXProjectModuleGUID 249 | 1CE0B1FE06471DED0097A5F4 250 | PBXProjectModuleLabel 251 | Files 252 | PBXProjectStructureProvided 253 | yes 254 | PBXSmartGroupTreeModuleColumnData 255 | 256 | PBXSmartGroupTreeModuleColumnWidthsKey 257 | 258 | 246 259 | 260 | PBXSmartGroupTreeModuleColumnsKey_v4 261 | 262 | MainColumn 263 | 264 | 265 | PBXSmartGroupTreeModuleOutlineStateKey_v7 266 | 267 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 268 | 269 | 29B97314FDCFA39411CA2CEA 270 | F8ABF18912A0D4C000D78DF9 271 | 080E96DDFE201D6D7F000001 272 | 1C37FBAC04509CD000000102 273 | 1C37FABC05509CD000000102 274 | 275 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 276 | 277 | 278 | 7 279 | 1 280 | 0 281 | 282 | 283 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 284 | {{0, 0}, {246, 786}} 285 | 286 | PBXTopSmartGroupGIDs 287 | 288 | XCIncludePerspectivesSwitch 289 | 290 | XCSharingToken 291 | com.apple.Xcode.GFSharingToken 292 | 293 | GeometryConfiguration 294 | 295 | Frame 296 | {{0, 0}, {263, 804}} 297 | GroupTreeTableConfiguration 298 | 299 | MainColumn 300 | 246 301 | 302 | RubberWindowFrame 303 | -1274 205 1354 845 -1440 150 1440 900 304 | 305 | Module 306 | PBXSmartGroupTreeModule 307 | Proportion 308 | 263pt 309 | 310 | 311 | Dock 312 | 313 | 314 | BecomeActive 315 | 316 | ContentConfiguration 317 | 318 | PBXProjectModuleGUID 319 | 1CE0B20306471E060097A5F4 320 | PBXProjectModuleLabel 321 | PanelsViewController.m 322 | PBXSplitModuleInNavigatorKey 323 | 324 | Split0 325 | 326 | PBXProjectModuleGUID 327 | 1CE0B20406471E060097A5F4 328 | PBXProjectModuleLabel 329 | PanelsViewController.m 330 | _historyCapacity 331 | 0 332 | bookmark 333 | F84CBF951332E1E6001521CE 334 | history 335 | 336 | F84CBF8F1332E1E6001521CE 337 | F84CBF901332E1E6001521CE 338 | F84CBF911332E1E6001521CE 339 | F84CBF921332E1E6001521CE 340 | F84CBF931332E1E6001521CE 341 | F84CBF941332E1E6001521CE 342 | 343 | 344 | SplitCount 345 | 1 346 | 347 | StatusBarVisibility 348 | 349 | 350 | GeometryConfiguration 351 | 352 | Frame 353 | {{0, 0}, {1086, 552}} 354 | RubberWindowFrame 355 | -1274 205 1354 845 -1440 150 1440 900 356 | 357 | Module 358 | PBXNavigatorGroup 359 | Proportion 360 | 552pt 361 | 362 | 363 | ContentConfiguration 364 | 365 | PBXProjectModuleGUID 366 | 1CE0B20506471E060097A5F4 367 | PBXProjectModuleLabel 368 | Detail 369 | 370 | GeometryConfiguration 371 | 372 | Frame 373 | {{0, 557}, {1086, 247}} 374 | RubberWindowFrame 375 | -1274 205 1354 845 -1440 150 1440 900 376 | 377 | Module 378 | XCDetailModule 379 | Proportion 380 | 247pt 381 | 382 | 383 | Proportion 384 | 1086pt 385 | 386 | 387 | Name 388 | Project 389 | ServiceClasses 390 | 391 | XCModuleDock 392 | PBXSmartGroupTreeModule 393 | XCModuleDock 394 | PBXNavigatorGroup 395 | XCDetailModule 396 | 397 | TableOfContents 398 | 399 | F84CBF751332E0DC001521CE 400 | 1CE0B1FE06471DED0097A5F4 401 | F84CBF761332E0DC001521CE 402 | 1CE0B20306471E060097A5F4 403 | 1CE0B20506471E060097A5F4 404 | 405 | ToolbarConfigUserDefaultsMinorVersion 406 | 2 407 | ToolbarConfiguration 408 | xcode.toolbar.config.defaultV3 409 | 410 | 411 | ControllerClassBaseName 412 | 413 | IconName 414 | WindowOfProject 415 | Identifier 416 | perspective.morph 417 | IsVertical 418 | 0 419 | Layout 420 | 421 | 422 | BecomeActive 423 | 1 424 | ContentConfiguration 425 | 426 | PBXBottomSmartGroupGIDs 427 | 428 | 1C37FBAC04509CD000000102 429 | 1C37FAAC04509CD000000102 430 | 1C08E77C0454961000C914BD 431 | 1C37FABC05509CD000000102 432 | 1C37FABC05539CD112110102 433 | E2644B35053B69B200211256 434 | 1C37FABC04509CD000100104 435 | 1CC0EA4004350EF90044410B 436 | 1CC0EA4004350EF90041110B 437 | 438 | PBXProjectModuleGUID 439 | 11E0B1FE06471DED0097A5F4 440 | PBXProjectModuleLabel 441 | Files 442 | PBXProjectStructureProvided 443 | yes 444 | PBXSmartGroupTreeModuleColumnData 445 | 446 | PBXSmartGroupTreeModuleColumnWidthsKey 447 | 448 | 186 449 | 450 | PBXSmartGroupTreeModuleColumnsKey_v4 451 | 452 | MainColumn 453 | 454 | 455 | PBXSmartGroupTreeModuleOutlineStateKey_v7 456 | 457 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 458 | 459 | 29B97314FDCFA39411CA2CEA 460 | 1C37FABC05509CD000000102 461 | 462 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 463 | 464 | 465 | 0 466 | 467 | 468 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 469 | {{0, 0}, {186, 337}} 470 | 471 | PBXTopSmartGroupGIDs 472 | 473 | XCIncludePerspectivesSwitch 474 | 1 475 | XCSharingToken 476 | com.apple.Xcode.GFSharingToken 477 | 478 | GeometryConfiguration 479 | 480 | Frame 481 | {{0, 0}, {203, 355}} 482 | GroupTreeTableConfiguration 483 | 484 | MainColumn 485 | 186 486 | 487 | RubberWindowFrame 488 | 373 269 690 397 0 0 1440 878 489 | 490 | Module 491 | PBXSmartGroupTreeModule 492 | Proportion 493 | 100% 494 | 495 | 496 | Name 497 | Morph 498 | PreferredWidth 499 | 300 500 | ServiceClasses 501 | 502 | XCModuleDock 503 | PBXSmartGroupTreeModule 504 | 505 | TableOfContents 506 | 507 | 11E0B1FE06471DED0097A5F4 508 | 509 | ToolbarConfiguration 510 | xcode.toolbar.config.default.shortV3 511 | 512 | 513 | PerspectivesBarVisible 514 | 515 | ShelfIsVisible 516 | 517 | SourceDescription 518 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 519 | StatusbarIsVisible 520 | 521 | TimeStamp 522 | 0.0 523 | ToolbarConfigUserDefaultsMinorVersion 524 | 2 525 | ToolbarDisplayMode 526 | 1 527 | ToolbarIsVisible 528 | 529 | ToolbarSizeMode 530 | 1 531 | Type 532 | Perspectives 533 | UpdateMessage 534 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 535 | WindowJustification 536 | 5 537 | WindowOrderList 538 | 539 | F84CBF961332E1E6001521CE 540 | F84CBF801332E0DC001521CE 541 | 1C78EAAD065D492600B07095 542 | 1CD10A99069EF8BA00B06720 543 | F8ABF1A412A0D59F00D78DF9 544 | /Users/honcheng/Dropbox/Open Source Projects/PanelTableView/sample project/SampleApp/SampleApp.xcodeproj 545 | 546 | WindowString 547 | -1274 205 1354 845 -1440 150 1440 900 548 | WindowToolsV3 549 | 550 | 551 | FirstTimeWindowDisplayed 552 | 553 | Identifier 554 | windowTool.build 555 | IsVertical 556 | 557 | Layout 558 | 559 | 560 | Dock 561 | 562 | 563 | ContentConfiguration 564 | 565 | PBXProjectModuleGUID 566 | 1CD0528F0623707200166675 567 | PBXProjectModuleLabel 568 | 569 | StatusBarVisibility 570 | 571 | 572 | GeometryConfiguration 573 | 574 | Frame 575 | {{0, 0}, {931, 270}} 576 | RubberWindowFrame 577 | -1199 419 931 552 -1440 150 1440 900 578 | 579 | Module 580 | PBXNavigatorGroup 581 | Proportion 582 | 270pt 583 | 584 | 585 | ContentConfiguration 586 | 587 | PBXProjectModuleGUID 588 | XCMainBuildResultsModuleGUID 589 | PBXProjectModuleLabel 590 | Build Results 591 | XCBuildResultsTrigger_Collapse 592 | 1021 593 | XCBuildResultsTrigger_Open 594 | 1011 595 | 596 | GeometryConfiguration 597 | 598 | Frame 599 | {{0, 275}, {931, 236}} 600 | RubberWindowFrame 601 | -1199 419 931 552 -1440 150 1440 900 602 | 603 | Module 604 | PBXBuildResultsModule 605 | Proportion 606 | 236pt 607 | 608 | 609 | Proportion 610 | 511pt 611 | 612 | 613 | Name 614 | Build Results 615 | ServiceClasses 616 | 617 | PBXBuildResultsModule 618 | 619 | StatusbarIsVisible 620 | 621 | TableOfContents 622 | 623 | F8ABF1A412A0D59F00D78DF9 624 | F84CBF771332E0DC001521CE 625 | 1CD0528F0623707200166675 626 | XCMainBuildResultsModuleGUID 627 | 628 | ToolbarConfiguration 629 | xcode.toolbar.config.buildV3 630 | WindowContentMinSize 631 | 486 300 632 | WindowString 633 | -1199 419 931 552 -1440 150 1440 900 634 | WindowToolGUID 635 | F8ABF1A412A0D59F00D78DF9 636 | WindowToolIsVisible 637 | 638 | 639 | 640 | FirstTimeWindowDisplayed 641 | 642 | Identifier 643 | windowTool.debugger 644 | IsVertical 645 | 646 | Layout 647 | 648 | 649 | Dock 650 | 651 | 652 | ContentConfiguration 653 | 654 | Debugger 655 | 656 | HorizontalSplitView 657 | 658 | _collapsingFrameDimension 659 | 0.0 660 | _indexOfCollapsedView 661 | 0 662 | _percentageOfCollapsedView 663 | 0.0 664 | isCollapsed 665 | yes 666 | sizes 667 | 668 | {{0, 0}, {316, 202}} 669 | {{316, 0}, {378, 202}} 670 | 671 | 672 | VerticalSplitView 673 | 674 | _collapsingFrameDimension 675 | 0.0 676 | _indexOfCollapsedView 677 | 0 678 | _percentageOfCollapsedView 679 | 0.0 680 | isCollapsed 681 | yes 682 | sizes 683 | 684 | {{0, 0}, {694, 202}} 685 | {{0, 202}, {694, 179}} 686 | 687 | 688 | 689 | LauncherConfigVersion 690 | 8 691 | PBXProjectModuleGUID 692 | 1C162984064C10D400B95A72 693 | PBXProjectModuleLabel 694 | Debug - GLUTExamples (Underwater) 695 | 696 | GeometryConfiguration 697 | 698 | DebugConsoleVisible 699 | None 700 | DebugConsoleWindowFrame 701 | {{200, 200}, {500, 300}} 702 | DebugSTDIOWindowFrame 703 | {{200, 200}, {500, 300}} 704 | Frame 705 | {{0, 0}, {694, 381}} 706 | PBXDebugSessionStackFrameViewKey 707 | 708 | DebugVariablesTableConfiguration 709 | 710 | Name 711 | 120 712 | Value 713 | 85 714 | Summary 715 | 148 716 | 717 | Frame 718 | {{316, 0}, {378, 202}} 719 | RubberWindowFrame 720 | 263 523 694 422 0 0 1680 1028 721 | 722 | RubberWindowFrame 723 | 263 523 694 422 0 0 1680 1028 724 | 725 | Module 726 | PBXDebugSessionModule 727 | Proportion 728 | 381pt 729 | 730 | 731 | Proportion 732 | 381pt 733 | 734 | 735 | Name 736 | Debugger 737 | ServiceClasses 738 | 739 | PBXDebugSessionModule 740 | 741 | StatusbarIsVisible 742 | 743 | TableOfContents 744 | 745 | 1CD10A99069EF8BA00B06720 746 | F84CBF781332E0DC001521CE 747 | 1C162984064C10D400B95A72 748 | F84CBF791332E0DC001521CE 749 | F84CBF7A1332E0DC001521CE 750 | F84CBF7B1332E0DC001521CE 751 | F84CBF7C1332E0DC001521CE 752 | F84CBF7D1332E0DC001521CE 753 | 754 | ToolbarConfiguration 755 | xcode.toolbar.config.debugV3 756 | WindowString 757 | 263 523 694 422 0 0 1680 1028 758 | WindowToolGUID 759 | 1CD10A99069EF8BA00B06720 760 | WindowToolIsVisible 761 | 762 | 763 | 764 | Identifier 765 | windowTool.find 766 | Layout 767 | 768 | 769 | Dock 770 | 771 | 772 | Dock 773 | 774 | 775 | ContentConfiguration 776 | 777 | PBXProjectModuleGUID 778 | 1CDD528C0622207200134675 779 | PBXProjectModuleLabel 780 | <No Editor> 781 | PBXSplitModuleInNavigatorKey 782 | 783 | Split0 784 | 785 | PBXProjectModuleGUID 786 | 1CD0528D0623707200166675 787 | 788 | SplitCount 789 | 1 790 | 791 | StatusBarVisibility 792 | 1 793 | 794 | GeometryConfiguration 795 | 796 | Frame 797 | {{0, 0}, {781, 167}} 798 | RubberWindowFrame 799 | 62 385 781 470 0 0 1440 878 800 | 801 | Module 802 | PBXNavigatorGroup 803 | Proportion 804 | 781pt 805 | 806 | 807 | Proportion 808 | 50% 809 | 810 | 811 | BecomeActive 812 | 1 813 | ContentConfiguration 814 | 815 | PBXProjectModuleGUID 816 | 1CD0528E0623707200166675 817 | PBXProjectModuleLabel 818 | Project Find 819 | 820 | GeometryConfiguration 821 | 822 | Frame 823 | {{8, 0}, {773, 254}} 824 | RubberWindowFrame 825 | 62 385 781 470 0 0 1440 878 826 | 827 | Module 828 | PBXProjectFindModule 829 | Proportion 830 | 50% 831 | 832 | 833 | Proportion 834 | 428pt 835 | 836 | 837 | Name 838 | Project Find 839 | ServiceClasses 840 | 841 | PBXProjectFindModule 842 | 843 | StatusbarIsVisible 844 | 1 845 | TableOfContents 846 | 847 | 1C530D57069F1CE1000CFCEE 848 | 1C530D58069F1CE1000CFCEE 849 | 1C530D59069F1CE1000CFCEE 850 | 1CDD528C0622207200134675 851 | 1C530D5A069F1CE1000CFCEE 852 | 1CE0B1FE06471DED0097A5F4 853 | 1CD0528E0623707200166675 854 | 855 | WindowString 856 | 62 385 781 470 0 0 1440 878 857 | WindowToolGUID 858 | 1C530D57069F1CE1000CFCEE 859 | WindowToolIsVisible 860 | 0 861 | 862 | 863 | Identifier 864 | MENUSEPARATOR 865 | 866 | 867 | FirstTimeWindowDisplayed 868 | 869 | Identifier 870 | windowTool.debuggerConsole 871 | IsVertical 872 | 873 | Layout 874 | 875 | 876 | Dock 877 | 878 | 879 | ContentConfiguration 880 | 881 | PBXProjectModuleGUID 882 | 1C78EAAC065D492600B07095 883 | PBXProjectModuleLabel 884 | Debugger Console 885 | 886 | GeometryConfiguration 887 | 888 | Frame 889 | {{0, 0}, {794, 578}} 890 | RubberWindowFrame 891 | 27 394 794 619 0 0 1680 1028 892 | 893 | Module 894 | PBXDebugCLIModule 895 | Proportion 896 | 578pt 897 | 898 | 899 | Proportion 900 | 578pt 901 | 902 | 903 | Name 904 | Debugger Console 905 | ServiceClasses 906 | 907 | PBXDebugCLIModule 908 | 909 | StatusbarIsVisible 910 | 911 | TableOfContents 912 | 913 | 1C78EAAD065D492600B07095 914 | F84CBF7E1332E0DC001521CE 915 | 1C78EAAC065D492600B07095 916 | 917 | ToolbarConfiguration 918 | xcode.toolbar.config.consoleV3 919 | WindowString 920 | 27 394 794 619 0 0 1680 1028 921 | WindowToolGUID 922 | 1C78EAAD065D492600B07095 923 | WindowToolIsVisible 924 | 925 | 926 | 927 | Identifier 928 | windowTool.snapshots 929 | Layout 930 | 931 | 932 | Dock 933 | 934 | 935 | Module 936 | XCSnapshotModule 937 | Proportion 938 | 100% 939 | 940 | 941 | Proportion 942 | 100% 943 | 944 | 945 | Name 946 | Snapshots 947 | ServiceClasses 948 | 949 | XCSnapshotModule 950 | 951 | StatusbarIsVisible 952 | Yes 953 | ToolbarConfiguration 954 | xcode.toolbar.config.snapshots 955 | WindowString 956 | 315 824 300 550 0 0 1440 878 957 | WindowToolIsVisible 958 | Yes 959 | 960 | 961 | Identifier 962 | windowTool.scm 963 | Layout 964 | 965 | 966 | Dock 967 | 968 | 969 | ContentConfiguration 970 | 971 | PBXProjectModuleGUID 972 | 1C78EAB2065D492600B07095 973 | PBXProjectModuleLabel 974 | <No Editor> 975 | PBXSplitModuleInNavigatorKey 976 | 977 | Split0 978 | 979 | PBXProjectModuleGUID 980 | 1C78EAB3065D492600B07095 981 | 982 | SplitCount 983 | 1 984 | 985 | StatusBarVisibility 986 | 1 987 | 988 | GeometryConfiguration 989 | 990 | Frame 991 | {{0, 0}, {452, 0}} 992 | RubberWindowFrame 993 | 743 379 452 308 0 0 1280 1002 994 | 995 | Module 996 | PBXNavigatorGroup 997 | Proportion 998 | 0pt 999 | 1000 | 1001 | BecomeActive 1002 | 1 1003 | ContentConfiguration 1004 | 1005 | PBXProjectModuleGUID 1006 | 1CD052920623707200166675 1007 | PBXProjectModuleLabel 1008 | SCM 1009 | 1010 | GeometryConfiguration 1011 | 1012 | ConsoleFrame 1013 | {{0, 259}, {452, 0}} 1014 | Frame 1015 | {{0, 7}, {452, 259}} 1016 | RubberWindowFrame 1017 | 743 379 452 308 0 0 1280 1002 1018 | TableConfiguration 1019 | 1020 | Status 1021 | 30 1022 | FileName 1023 | 199 1024 | Path 1025 | 197.0950012207031 1026 | 1027 | TableFrame 1028 | {{0, 0}, {452, 250}} 1029 | 1030 | Module 1031 | PBXCVSModule 1032 | Proportion 1033 | 262pt 1034 | 1035 | 1036 | Proportion 1037 | 266pt 1038 | 1039 | 1040 | Name 1041 | SCM 1042 | ServiceClasses 1043 | 1044 | PBXCVSModule 1045 | 1046 | StatusbarIsVisible 1047 | 1 1048 | TableOfContents 1049 | 1050 | 1C78EAB4065D492600B07095 1051 | 1C78EAB5065D492600B07095 1052 | 1C78EAB2065D492600B07095 1053 | 1CD052920623707200166675 1054 | 1055 | ToolbarConfiguration 1056 | xcode.toolbar.config.scm 1057 | WindowString 1058 | 743 379 452 308 0 0 1280 1002 1059 | 1060 | 1061 | Identifier 1062 | windowTool.breakpoints 1063 | IsVertical 1064 | 0 1065 | Layout 1066 | 1067 | 1068 | Dock 1069 | 1070 | 1071 | BecomeActive 1072 | 1 1073 | ContentConfiguration 1074 | 1075 | PBXBottomSmartGroupGIDs 1076 | 1077 | 1C77FABC04509CD000000102 1078 | 1079 | PBXProjectModuleGUID 1080 | 1CE0B1FE06471DED0097A5F4 1081 | PBXProjectModuleLabel 1082 | Files 1083 | PBXProjectStructureProvided 1084 | no 1085 | PBXSmartGroupTreeModuleColumnData 1086 | 1087 | PBXSmartGroupTreeModuleColumnWidthsKey 1088 | 1089 | 168 1090 | 1091 | PBXSmartGroupTreeModuleColumnsKey_v4 1092 | 1093 | MainColumn 1094 | 1095 | 1096 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1097 | 1098 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1099 | 1100 | 1C77FABC04509CD000000102 1101 | 1102 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1103 | 1104 | 1105 | 0 1106 | 1107 | 1108 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1109 | {{0, 0}, {168, 350}} 1110 | 1111 | PBXTopSmartGroupGIDs 1112 | 1113 | XCIncludePerspectivesSwitch 1114 | 0 1115 | 1116 | GeometryConfiguration 1117 | 1118 | Frame 1119 | {{0, 0}, {185, 368}} 1120 | GroupTreeTableConfiguration 1121 | 1122 | MainColumn 1123 | 168 1124 | 1125 | RubberWindowFrame 1126 | 315 424 744 409 0 0 1440 878 1127 | 1128 | Module 1129 | PBXSmartGroupTreeModule 1130 | Proportion 1131 | 185pt 1132 | 1133 | 1134 | ContentConfiguration 1135 | 1136 | PBXProjectModuleGUID 1137 | 1CA1AED706398EBD00589147 1138 | PBXProjectModuleLabel 1139 | Detail 1140 | 1141 | GeometryConfiguration 1142 | 1143 | Frame 1144 | {{190, 0}, {554, 368}} 1145 | RubberWindowFrame 1146 | 315 424 744 409 0 0 1440 878 1147 | 1148 | Module 1149 | XCDetailModule 1150 | Proportion 1151 | 554pt 1152 | 1153 | 1154 | Proportion 1155 | 368pt 1156 | 1157 | 1158 | MajorVersion 1159 | 3 1160 | MinorVersion 1161 | 0 1162 | Name 1163 | Breakpoints 1164 | ServiceClasses 1165 | 1166 | PBXSmartGroupTreeModule 1167 | XCDetailModule 1168 | 1169 | StatusbarIsVisible 1170 | 1 1171 | TableOfContents 1172 | 1173 | 1CDDB66807F98D9800BB5817 1174 | 1CDDB66907F98D9800BB5817 1175 | 1CE0B1FE06471DED0097A5F4 1176 | 1CA1AED706398EBD00589147 1177 | 1178 | ToolbarConfiguration 1179 | xcode.toolbar.config.breakpointsV3 1180 | WindowString 1181 | 315 424 744 409 0 0 1440 878 1182 | WindowToolGUID 1183 | 1CDDB66807F98D9800BB5817 1184 | WindowToolIsVisible 1185 | 1 1186 | 1187 | 1188 | Identifier 1189 | windowTool.debugAnimator 1190 | Layout 1191 | 1192 | 1193 | Dock 1194 | 1195 | 1196 | Module 1197 | PBXNavigatorGroup 1198 | Proportion 1199 | 100% 1200 | 1201 | 1202 | Proportion 1203 | 100% 1204 | 1205 | 1206 | Name 1207 | Debug Visualizer 1208 | ServiceClasses 1209 | 1210 | PBXNavigatorGroup 1211 | 1212 | StatusbarIsVisible 1213 | 1 1214 | ToolbarConfiguration 1215 | xcode.toolbar.config.debugAnimatorV3 1216 | WindowString 1217 | 100 100 700 500 0 0 1280 1002 1218 | 1219 | 1220 | Identifier 1221 | windowTool.bookmarks 1222 | Layout 1223 | 1224 | 1225 | Dock 1226 | 1227 | 1228 | Module 1229 | PBXBookmarksModule 1230 | Proportion 1231 | 100% 1232 | 1233 | 1234 | Proportion 1235 | 100% 1236 | 1237 | 1238 | Name 1239 | Bookmarks 1240 | ServiceClasses 1241 | 1242 | PBXBookmarksModule 1243 | 1244 | StatusbarIsVisible 1245 | 0 1246 | WindowString 1247 | 538 42 401 187 0 0 1280 1002 1248 | 1249 | 1250 | Identifier 1251 | windowTool.projectFormatConflicts 1252 | Layout 1253 | 1254 | 1255 | Dock 1256 | 1257 | 1258 | Module 1259 | XCProjectFormatConflictsModule 1260 | Proportion 1261 | 100% 1262 | 1263 | 1264 | Proportion 1265 | 100% 1266 | 1267 | 1268 | Name 1269 | Project Format Conflicts 1270 | ServiceClasses 1271 | 1272 | XCProjectFormatConflictsModule 1273 | 1274 | StatusbarIsVisible 1275 | 0 1276 | WindowContentMinSize 1277 | 450 300 1278 | WindowString 1279 | 50 850 472 307 0 0 1440 877 1280 | 1281 | 1282 | Identifier 1283 | windowTool.classBrowser 1284 | Layout 1285 | 1286 | 1287 | Dock 1288 | 1289 | 1290 | BecomeActive 1291 | 1 1292 | ContentConfiguration 1293 | 1294 | OptionsSetName 1295 | Hierarchy, all classes 1296 | PBXProjectModuleGUID 1297 | 1CA6456E063B45B4001379D8 1298 | PBXProjectModuleLabel 1299 | Class Browser - NSObject 1300 | 1301 | GeometryConfiguration 1302 | 1303 | ClassesFrame 1304 | {{0, 0}, {374, 96}} 1305 | ClassesTreeTableConfiguration 1306 | 1307 | PBXClassNameColumnIdentifier 1308 | 208 1309 | PBXClassBookColumnIdentifier 1310 | 22 1311 | 1312 | Frame 1313 | {{0, 0}, {630, 331}} 1314 | MembersFrame 1315 | {{0, 105}, {374, 395}} 1316 | MembersTreeTableConfiguration 1317 | 1318 | PBXMemberTypeIconColumnIdentifier 1319 | 22 1320 | PBXMemberNameColumnIdentifier 1321 | 216 1322 | PBXMemberTypeColumnIdentifier 1323 | 97 1324 | PBXMemberBookColumnIdentifier 1325 | 22 1326 | 1327 | PBXModuleWindowStatusBarHidden2 1328 | 1 1329 | RubberWindowFrame 1330 | 385 179 630 352 0 0 1440 878 1331 | 1332 | Module 1333 | PBXClassBrowserModule 1334 | Proportion 1335 | 332pt 1336 | 1337 | 1338 | Proportion 1339 | 332pt 1340 | 1341 | 1342 | Name 1343 | Class Browser 1344 | ServiceClasses 1345 | 1346 | PBXClassBrowserModule 1347 | 1348 | StatusbarIsVisible 1349 | 0 1350 | TableOfContents 1351 | 1352 | 1C0AD2AF069F1E9B00FABCE6 1353 | 1C0AD2B0069F1E9B00FABCE6 1354 | 1CA6456E063B45B4001379D8 1355 | 1356 | ToolbarConfiguration 1357 | xcode.toolbar.config.classbrowser 1358 | WindowString 1359 | 385 179 630 352 0 0 1440 878 1360 | WindowToolGUID 1361 | 1C0AD2AF069F1E9B00FABCE6 1362 | WindowToolIsVisible 1363 | 0 1364 | 1365 | 1366 | Identifier 1367 | windowTool.refactoring 1368 | IncludeInToolsMenu 1369 | 0 1370 | Layout 1371 | 1372 | 1373 | Dock 1374 | 1375 | 1376 | BecomeActive 1377 | 1 1378 | GeometryConfiguration 1379 | 1380 | Frame 1381 | {0, 0}, {500, 335} 1382 | RubberWindowFrame 1383 | {0, 0}, {500, 335} 1384 | 1385 | Module 1386 | XCRefactoringModule 1387 | Proportion 1388 | 100% 1389 | 1390 | 1391 | Proportion 1392 | 100% 1393 | 1394 | 1395 | Name 1396 | Refactoring 1397 | ServiceClasses 1398 | 1399 | XCRefactoringModule 1400 | 1401 | WindowString 1402 | 200 200 500 356 0 0 1920 1200 1403 | 1404 | 1405 | 1406 | 1407 | -------------------------------------------------------------------------------- /sample project/SampleApp/SampleApp.xcodeproj/honcheng.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 1D3623240D0F684500981E51 /* SampleAppAppDelegate.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {1025, 494}}"; 6 | sepNavSelRange = "{315, 0}"; 7 | sepNavVisRange = "{0, 323}"; 8 | }; 9 | }; 10 | 1D3623250D0F684500981E51 /* SampleAppAppDelegate.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {1965, 1170}}"; 13 | sepNavSelRange = "{669, 0}"; 14 | sepNavVisRange = "{315, 1764}"; 15 | }; 16 | }; 17 | 1D6058900D05DD3D006BFB54 /* SampleApp */ = { 18 | activeExec = 0; 19 | executables = ( 20 | F8ABF15812A0D14D00D78DF9 /* SampleApp */, 21 | ); 22 | }; 23 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 24 | activeBuildConfigurationName = Debug; 25 | activeExecutable = F8ABF15812A0D14D00D78DF9 /* SampleApp */; 26 | activeTarget = 1D6058900D05DD3D006BFB54 /* SampleApp */; 27 | addToTargets = ( 28 | 1D6058900D05DD3D006BFB54 /* SampleApp */, 29 | ); 30 | codeSenseManager = F8ABF16312A0D16700D78DF9 /* Code sense */; 31 | executables = ( 32 | F8ABF15812A0D14D00D78DF9 /* SampleApp */, 33 | ); 34 | perUserDictionary = { 35 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 36 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 37 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 38 | PBXFileTableDataSourceColumnWidthsKey = ( 39 | 20, 40 | 847, 41 | 20, 42 | 48, 43 | 43, 44 | 43, 45 | 20, 46 | ); 47 | PBXFileTableDataSourceColumnsKey = ( 48 | PBXFileDataSource_FiletypeID, 49 | PBXFileDataSource_Filename_ColumnID, 50 | PBXFileDataSource_Built_ColumnID, 51 | PBXFileDataSource_ObjectSize_ColumnID, 52 | PBXFileDataSource_Errors_ColumnID, 53 | PBXFileDataSource_Warnings_ColumnID, 54 | PBXFileDataSource_Target_ColumnID, 55 | ); 56 | }; 57 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 58 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 59 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 60 | PBXFileTableDataSourceColumnWidthsKey = ( 61 | 20, 62 | 658, 63 | 60, 64 | 20, 65 | 48.16259765625, 66 | 43, 67 | 43, 68 | ); 69 | PBXFileTableDataSourceColumnsKey = ( 70 | PBXFileDataSource_FiletypeID, 71 | PBXFileDataSource_Filename_ColumnID, 72 | PBXTargetDataSource_PrimaryAttribute, 73 | PBXFileDataSource_Built_ColumnID, 74 | PBXFileDataSource_ObjectSize_ColumnID, 75 | PBXFileDataSource_Errors_ColumnID, 76 | PBXFileDataSource_Warnings_ColumnID, 77 | ); 78 | }; 79 | PBXPerProjectTemplateStateSaveDate = 322101462; 80 | PBXWorkspaceStateSaveDate = 322101462; 81 | }; 82 | perUserProjectItems = { 83 | F84CBF8F1332E1E6001521CE /* PBXTextBookmark */ = F84CBF8F1332E1E6001521CE /* PBXTextBookmark */; 84 | F84CBF901332E1E6001521CE /* PBXTextBookmark */ = F84CBF901332E1E6001521CE /* PBXTextBookmark */; 85 | F84CBF911332E1E6001521CE /* PBXTextBookmark */ = F84CBF911332E1E6001521CE /* PBXTextBookmark */; 86 | F84CBF921332E1E6001521CE /* PBXTextBookmark */ = F84CBF921332E1E6001521CE /* PBXTextBookmark */; 87 | F84CBF931332E1E6001521CE /* PBXTextBookmark */ = F84CBF931332E1E6001521CE /* PBXTextBookmark */; 88 | F84CBF941332E1E6001521CE /* PBXTextBookmark */ = F84CBF941332E1E6001521CE /* PBXTextBookmark */; 89 | F84CBF951332E1E6001521CE /* PBXTextBookmark */ = F84CBF951332E1E6001521CE /* PBXTextBookmark */; 90 | }; 91 | sourceControlManager = F8ABF16212A0D16700D78DF9 /* Source Control */; 92 | userBuildSettings = { 93 | }; 94 | }; 95 | F84CBF8F1332E1E6001521CE /* PBXTextBookmark */ = { 96 | isa = PBXTextBookmark; 97 | fRef = F8ABF23B12A0DFE400D78DF9 /* SamplePanelView.m */; 98 | name = "SamplePanelView.m: 8"; 99 | rLen = 0; 100 | rLoc = 132; 101 | rType = 0; 102 | vrLen = 477; 103 | vrLoc = 0; 104 | }; 105 | F84CBF901332E1E6001521CE /* PBXTextBookmark */ = { 106 | isa = PBXTextBookmark; 107 | fRef = F862306E132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m */; 108 | name = "SamplePanelsViewControllerForiPad.m: 20"; 109 | rLen = 0; 110 | rLoc = 389; 111 | rType = 0; 112 | vrLen = 779; 113 | vrLoc = 252; 114 | }; 115 | F84CBF911332E1E6001521CE /* PBXTextBookmark */ = { 116 | isa = PBXTextBookmark; 117 | fRef = F8ABF19812A0D4E200D78DF9 /* SamplePanelsViewController.m */; 118 | name = "SamplePanelsViewController.m: 13"; 119 | rLen = 0; 120 | rLoc = 283; 121 | rType = 0; 122 | vrLen = 789; 123 | vrLoc = 40; 124 | }; 125 | F84CBF921332E1E6001521CE /* PBXTextBookmark */ = { 126 | isa = PBXTextBookmark; 127 | fRef = F8ABF18D12A0D4C000D78DF9 /* PanelView.m */; 128 | name = "PanelView.m: 399"; 129 | rLen = 20; 130 | rLoc = 11288; 131 | rType = 0; 132 | vrLen = 1167; 133 | vrLoc = 10270; 134 | }; 135 | F84CBF931332E1E6001521CE /* PBXTextBookmark */ = { 136 | isa = PBXTextBookmark; 137 | fRef = F8ABF18C12A0D4C000D78DF9 /* PanelView.h */; 138 | name = "PanelView.h: 45"; 139 | rLen = 106; 140 | rLoc = 1900; 141 | rType = 0; 142 | vrLen = 1513; 143 | vrLoc = 1292; 144 | }; 145 | F84CBF941332E1E6001521CE /* PBXTextBookmark */ = { 146 | isa = PBXTextBookmark; 147 | fRef = F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */; 148 | name = "PanelsViewController.m: 411"; 149 | rLen = 0; 150 | rLoc = 11597; 151 | rType = 0; 152 | vrLen = 1092; 153 | vrLoc = 10757; 154 | }; 155 | F84CBF951332E1E6001521CE /* PBXTextBookmark */ = { 156 | isa = PBXTextBookmark; 157 | fRef = F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */; 158 | name = "PanelsViewController.m: 418"; 159 | rLen = 0; 160 | rLoc = 11792; 161 | rType = 0; 162 | vrLen = 1035; 163 | vrLoc = 10870; 164 | }; 165 | F862306D132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.h */ = { 166 | uiCtxt = { 167 | sepNavIntBoundsRect = "{{0, 0}, {1025, 488}}"; 168 | sepNavSelRange = "{287, 0}"; 169 | sepNavVisRange = "{0, 299}"; 170 | }; 171 | }; 172 | F862306E132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m */ = { 173 | uiCtxt = { 174 | sepNavIntBoundsRect = "{{0, 0}, {1025, 689}}"; 175 | sepNavSelRange = "{389, 0}"; 176 | sepNavVisRange = "{252, 779}"; 177 | }; 178 | }; 179 | F8ABF15812A0D14D00D78DF9 /* SampleApp */ = { 180 | isa = PBXExecutable; 181 | activeArgIndices = ( 182 | ); 183 | argumentStrings = ( 184 | ); 185 | autoAttachOnCrash = 1; 186 | breakpointsEnabled = 1; 187 | configStateDict = { 188 | }; 189 | customDataFormattersEnabled = 1; 190 | dataTipCustomDataFormattersEnabled = 1; 191 | dataTipShowTypeColumn = 1; 192 | dataTipSortType = 0; 193 | debuggerPlugin = GDBDebugging; 194 | disassemblyDisplayState = 0; 195 | dylibVariantSuffix = ""; 196 | enableDebugStr = 1; 197 | environmentEntries = ( 198 | ); 199 | executableSystemSymbolLevel = 0; 200 | executableUserSymbolLevel = 0; 201 | libgmallocEnabled = 0; 202 | name = SampleApp; 203 | savedGlobals = { 204 | }; 205 | showTypeColumn = 0; 206 | sourceDirectories = ( 207 | ); 208 | }; 209 | F8ABF16212A0D16700D78DF9 /* Source Control */ = { 210 | isa = PBXSourceControlManager; 211 | fallbackIsa = XCSourceControlManager; 212 | isSCMEnabled = 0; 213 | scmConfiguration = { 214 | repositoryNamesForRoots = { 215 | "" = ""; 216 | }; 217 | }; 218 | }; 219 | F8ABF16312A0D16700D78DF9 /* Code sense */ = { 220 | isa = PBXCodeSenseManager; 221 | indexTemplatePath = ""; 222 | }; 223 | F8ABF18A12A0D4C000D78DF9 /* PanelIndexPath.h */ = { 224 | uiCtxt = { 225 | sepNavIntBoundsRect = "{{0, 0}, {1025, 611}}"; 226 | sepNavSelRange = "{0, 1290}"; 227 | sepNavVisRange = "{0, 1393}"; 228 | }; 229 | }; 230 | F8ABF18B12A0D4C000D78DF9 /* PanelIndexPath.m */ = { 231 | uiCtxt = { 232 | sepNavIntBoundsRect = "{{0, 0}, {1025, 767}}"; 233 | sepNavSelRange = "{243, 0}"; 234 | sepNavVisRange = "{0, 1384}"; 235 | }; 236 | }; 237 | F8ABF18C12A0D4C000D78DF9 /* PanelView.h */ = { 238 | uiCtxt = { 239 | sepNavIntBoundsRect = "{{0, 0}, {1025, 1027}}"; 240 | sepNavSelRange = "{1900, 106}"; 241 | sepNavVisRange = "{1292, 1513}"; 242 | }; 243 | }; 244 | F8ABF18D12A0D4C000D78DF9 /* PanelView.m */ = { 245 | uiCtxt = { 246 | sepNavIntBoundsRect = "{{0, 0}, {1025, 4979}}"; 247 | sepNavSelRange = "{11288, 20}"; 248 | sepNavVisRange = "{10270, 1167}"; 249 | }; 250 | }; 251 | F8ABF18E12A0D4C000D78DF9 /* PanelsViewController.h */ = { 252 | uiCtxt = { 253 | sepNavIntBoundsRect = "{{0, 0}, {1025, 1092}}"; 254 | sepNavSelRange = "{2112, 0}"; 255 | sepNavVisRange = "{1482, 952}"; 256 | }; 257 | }; 258 | F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */ = { 259 | uiCtxt = { 260 | sepNavIntBoundsRect = "{{0, 0}, {1025, 5694}}"; 261 | sepNavSelRange = "{11792, 0}"; 262 | sepNavVisRange = "{10870, 1035}"; 263 | }; 264 | }; 265 | F8ABF19712A0D4E200D78DF9 /* SamplePanelsViewController.h */ = { 266 | uiCtxt = { 267 | sepNavIntBoundsRect = "{{0, 0}, {539, 525}}"; 268 | sepNavSelRange = "{335, 13}"; 269 | sepNavVisRange = "{0, 443}"; 270 | }; 271 | }; 272 | F8ABF19812A0D4E200D78DF9 /* SamplePanelsViewController.m */ = { 273 | uiCtxt = { 274 | sepNavIntBoundsRect = "{{0, 0}, {1025, 2548}}"; 275 | sepNavSelRange = "{283, 0}"; 276 | sepNavVisRange = "{40, 789}"; 277 | }; 278 | }; 279 | F8ABF23A12A0DFE400D78DF9 /* SamplePanelView.h */ = { 280 | uiCtxt = { 281 | sepNavIntBoundsRect = "{{0, 0}, {542, 221}}"; 282 | sepNavSelRange = "{218, 0}"; 283 | sepNavVisRange = "{129, 95}"; 284 | }; 285 | }; 286 | F8ABF23B12A0DFE400D78DF9 /* SamplePanelView.m */ = { 287 | uiCtxt = { 288 | sepNavIntBoundsRect = "{{0, 0}, {1025, 495}}"; 289 | sepNavSelRange = "{132, 0}"; 290 | sepNavVisRange = "{0, 477}"; 291 | }; 292 | }; 293 | } 294 | -------------------------------------------------------------------------------- /sample project/SampleApp/SampleApp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* SampleAppAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* SampleAppAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 15 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 16 | F8623068132AF7A6007AF95C /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F8623067132AF7A6007AF95C /* MainWindow-iPad.xib */; }; 17 | F862306F132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m in Sources */ = {isa = PBXBuildFile; fileRef = F862306E132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m */; }; 18 | F8ABF19012A0D4C000D78DF9 /* PanelIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF18B12A0D4C000D78DF9 /* PanelIndexPath.m */; }; 19 | F8ABF19112A0D4C000D78DF9 /* PanelView.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF18D12A0D4C000D78DF9 /* PanelView.m */; }; 20 | F8ABF19212A0D4C000D78DF9 /* PanelsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */; }; 21 | F8ABF19912A0D4E200D78DF9 /* SamplePanelsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF19812A0D4E200D78DF9 /* SamplePanelsViewController.m */; }; 22 | F8ABF23C12A0DFE500D78DF9 /* SamplePanelView.m in Sources */ = {isa = PBXBuildFile; fileRef = F8ABF23B12A0DFE400D78DF9 /* SamplePanelView.m */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 27 | 1D3623240D0F684500981E51 /* SampleAppAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleAppAppDelegate.h; sourceTree = ""; }; 28 | 1D3623250D0F684500981E51 /* SampleAppAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleAppAppDelegate.m; sourceTree = ""; }; 29 | 1D6058910D05DD3D006BFB54 /* SampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 31 | 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 32 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 33 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 34 | 32CA4F630368D1EE00C91783 /* SampleApp_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleApp_Prefix.pch; sourceTree = ""; }; 35 | 8D1107310486CEB800E47090 /* SampleApp-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "SampleApp-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 36 | F8623067132AF7A6007AF95C /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainWindow-iPad.xib"; path = "Resources-iPad/MainWindow-iPad.xib"; sourceTree = ""; }; 37 | F862306D132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SamplePanelsViewControllerForiPad.h; sourceTree = ""; }; 38 | F862306E132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SamplePanelsViewControllerForiPad.m; sourceTree = ""; }; 39 | F8ABF18A12A0D4C000D78DF9 /* PanelIndexPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PanelIndexPath.h; path = ../../PanelTableView/Classes/PanelIndexPath.h; sourceTree = SOURCE_ROOT; }; 40 | F8ABF18B12A0D4C000D78DF9 /* PanelIndexPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PanelIndexPath.m; path = ../../PanelTableView/Classes/PanelIndexPath.m; sourceTree = SOURCE_ROOT; }; 41 | F8ABF18C12A0D4C000D78DF9 /* PanelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PanelView.h; path = ../../PanelTableView/Classes/PanelView.h; sourceTree = SOURCE_ROOT; }; 42 | F8ABF18D12A0D4C000D78DF9 /* PanelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PanelView.m; path = ../../PanelTableView/Classes/PanelView.m; sourceTree = SOURCE_ROOT; }; 43 | F8ABF18E12A0D4C000D78DF9 /* PanelsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PanelsViewController.h; path = ../../PanelTableView/Classes/PanelsViewController.h; sourceTree = SOURCE_ROOT; }; 44 | F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PanelsViewController.m; path = ../../PanelTableView/Classes/PanelsViewController.m; sourceTree = SOURCE_ROOT; }; 45 | F8ABF19712A0D4E200D78DF9 /* SamplePanelsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SamplePanelsViewController.h; sourceTree = ""; }; 46 | F8ABF19812A0D4E200D78DF9 /* SamplePanelsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SamplePanelsViewController.m; sourceTree = ""; }; 47 | F8ABF23A12A0DFE400D78DF9 /* SamplePanelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SamplePanelView.h; sourceTree = ""; }; 48 | F8ABF23B12A0DFE400D78DF9 /* SamplePanelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SamplePanelView.m; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 57 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 58 | 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 080E96DDFE201D6D7F000001 /* Classes */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | 1D3623240D0F684500981E51 /* SampleAppAppDelegate.h */, 69 | 1D3623250D0F684500981E51 /* SampleAppAppDelegate.m */, 70 | F8ABF19712A0D4E200D78DF9 /* SamplePanelsViewController.h */, 71 | F8ABF19812A0D4E200D78DF9 /* SamplePanelsViewController.m */, 72 | F862306D132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.h */, 73 | F862306E132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m */, 74 | F8ABF23A12A0DFE400D78DF9 /* SamplePanelView.h */, 75 | F8ABF23B12A0DFE400D78DF9 /* SamplePanelView.m */, 76 | ); 77 | path = Classes; 78 | sourceTree = ""; 79 | }; 80 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 1D6058910D05DD3D006BFB54 /* SampleApp.app */, 84 | ); 85 | name = Products; 86 | sourceTree = ""; 87 | }; 88 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | F8ABF18912A0D4C000D78DF9 /* PanelTableView */, 92 | 080E96DDFE201D6D7F000001 /* Classes */, 93 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 94 | 29B97317FDCFA39411CA2CEA /* Resources */, 95 | F8623066132AF7A5007AF95C /* Resources-iPad */, 96 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 97 | 19C28FACFE9D520D11CA2CBB /* Products */, 98 | ); 99 | name = CustomTemplate; 100 | sourceTree = ""; 101 | }; 102 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 32CA4F630368D1EE00C91783 /* SampleApp_Prefix.pch */, 106 | 29B97316FDCFA39411CA2CEA /* main.m */, 107 | ); 108 | name = "Other Sources"; 109 | sourceTree = ""; 110 | }; 111 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 115 | 8D1107310486CEB800E47090 /* SampleApp-Info.plist */, 116 | ); 117 | name = Resources; 118 | sourceTree = ""; 119 | }; 120 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 124 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 125 | 288765FC0DF74451002DB57D /* CoreGraphics.framework */, 126 | ); 127 | name = Frameworks; 128 | sourceTree = ""; 129 | }; 130 | F8623066132AF7A5007AF95C /* Resources-iPad */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | F8623067132AF7A6007AF95C /* MainWindow-iPad.xib */, 134 | ); 135 | name = "Resources-iPad"; 136 | sourceTree = ""; 137 | }; 138 | F8ABF18912A0D4C000D78DF9 /* PanelTableView */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | F8ABF18A12A0D4C000D78DF9 /* PanelIndexPath.h */, 142 | F8ABF18B12A0D4C000D78DF9 /* PanelIndexPath.m */, 143 | F8ABF18C12A0D4C000D78DF9 /* PanelView.h */, 144 | F8ABF18D12A0D4C000D78DF9 /* PanelView.m */, 145 | F8ABF18E12A0D4C000D78DF9 /* PanelsViewController.h */, 146 | F8ABF18F12A0D4C000D78DF9 /* PanelsViewController.m */, 147 | ); 148 | name = PanelTableView; 149 | sourceTree = ""; 150 | }; 151 | /* End PBXGroup section */ 152 | 153 | /* Begin PBXNativeTarget section */ 154 | 1D6058900D05DD3D006BFB54 /* SampleApp */ = { 155 | isa = PBXNativeTarget; 156 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "SampleApp" */; 157 | buildPhases = ( 158 | 1D60588D0D05DD3D006BFB54 /* Resources */, 159 | 1D60588E0D05DD3D006BFB54 /* Sources */, 160 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 161 | ); 162 | buildRules = ( 163 | ); 164 | dependencies = ( 165 | ); 166 | name = SampleApp; 167 | productName = SampleApp; 168 | productReference = 1D6058910D05DD3D006BFB54 /* SampleApp.app */; 169 | productType = "com.apple.product-type.application"; 170 | }; 171 | /* End PBXNativeTarget section */ 172 | 173 | /* Begin PBXProject section */ 174 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 175 | isa = PBXProject; 176 | attributes = { 177 | LastUpgradeCheck = 0440; 178 | }; 179 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SampleApp" */; 180 | compatibilityVersion = "Xcode 3.2"; 181 | developmentRegion = English; 182 | hasScannedForEncodings = 1; 183 | knownRegions = ( 184 | English, 185 | Japanese, 186 | French, 187 | German, 188 | ); 189 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 190 | projectDirPath = ""; 191 | projectRoot = ""; 192 | targets = ( 193 | 1D6058900D05DD3D006BFB54 /* SampleApp */, 194 | ); 195 | }; 196 | /* End PBXProject section */ 197 | 198 | /* Begin PBXResourcesBuildPhase section */ 199 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 200 | isa = PBXResourcesBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 204 | F8623068132AF7A6007AF95C /* MainWindow-iPad.xib in Resources */, 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | /* End PBXResourcesBuildPhase section */ 209 | 210 | /* Begin PBXSourcesBuildPhase section */ 211 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 212 | isa = PBXSourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 216 | 1D3623260D0F684500981E51 /* SampleAppAppDelegate.m in Sources */, 217 | F8ABF19012A0D4C000D78DF9 /* PanelIndexPath.m in Sources */, 218 | F8ABF19112A0D4C000D78DF9 /* PanelView.m in Sources */, 219 | F8ABF19212A0D4C000D78DF9 /* PanelsViewController.m in Sources */, 220 | F8ABF19912A0D4E200D78DF9 /* SamplePanelsViewController.m in Sources */, 221 | F8ABF23C12A0DFE500D78DF9 /* SamplePanelView.m in Sources */, 222 | F862306F132AF7E6007AF95C /* SamplePanelsViewControllerForiPad.m in Sources */, 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | }; 226 | /* End PBXSourcesBuildPhase section */ 227 | 228 | /* Begin XCBuildConfiguration section */ 229 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 230 | isa = XCBuildConfiguration; 231 | buildSettings = { 232 | ALWAYS_SEARCH_USER_PATHS = NO; 233 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 234 | CLANG_ENABLE_OBJC_ARC = YES; 235 | COPY_PHASE_STRIP = NO; 236 | GCC_DYNAMIC_NO_PIC = NO; 237 | GCC_OPTIMIZATION_LEVEL = 0; 238 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 239 | GCC_PREFIX_HEADER = SampleApp_Prefix.pch; 240 | INFOPLIST_FILE = "SampleApp-Info.plist"; 241 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 242 | PRODUCT_NAME = SampleApp; 243 | SDKROOT = iphoneos; 244 | TARGETED_DEVICE_FAMILY = "1,2"; 245 | }; 246 | name = Debug; 247 | }; 248 | 1D6058950D05DD3E006BFB54 /* Release */ = { 249 | isa = XCBuildConfiguration; 250 | buildSettings = { 251 | ALWAYS_SEARCH_USER_PATHS = NO; 252 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 253 | CLANG_ENABLE_OBJC_ARC = YES; 254 | COPY_PHASE_STRIP = YES; 255 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 256 | GCC_PREFIX_HEADER = SampleApp_Prefix.pch; 257 | INFOPLIST_FILE = "SampleApp-Info.plist"; 258 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 259 | PRODUCT_NAME = SampleApp; 260 | SDKROOT = iphoneos; 261 | TARGETED_DEVICE_FAMILY = "1,2"; 262 | VALIDATE_PRODUCT = YES; 263 | }; 264 | name = Release; 265 | }; 266 | C01FCF4F08A954540054247B /* Debug */ = { 267 | isa = XCBuildConfiguration; 268 | buildSettings = { 269 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 270 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 271 | GCC_C_LANGUAGE_STANDARD = c99; 272 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 273 | GCC_WARN_UNUSED_VARIABLE = YES; 274 | SDKROOT = iphoneos; 275 | }; 276 | name = Debug; 277 | }; 278 | C01FCF5008A954540054247B /* Release */ = { 279 | isa = XCBuildConfiguration; 280 | buildSettings = { 281 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 282 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 283 | GCC_C_LANGUAGE_STANDARD = c99; 284 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 285 | GCC_WARN_UNUSED_VARIABLE = YES; 286 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 287 | SDKROOT = iphoneos; 288 | }; 289 | name = Release; 290 | }; 291 | /* End XCBuildConfiguration section */ 292 | 293 | /* Begin XCConfigurationList section */ 294 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "SampleApp" */ = { 295 | isa = XCConfigurationList; 296 | buildConfigurations = ( 297 | 1D6058940D05DD3E006BFB54 /* Debug */, 298 | 1D6058950D05DD3E006BFB54 /* Release */, 299 | ); 300 | defaultConfigurationIsVisible = 0; 301 | defaultConfigurationName = Release; 302 | }; 303 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SampleApp" */ = { 304 | isa = XCConfigurationList; 305 | buildConfigurations = ( 306 | C01FCF4F08A954540054247B /* Debug */, 307 | C01FCF5008A954540054247B /* Release */, 308 | ); 309 | defaultConfigurationIsVisible = 0; 310 | defaultConfigurationName = Release; 311 | }; 312 | /* End XCConfigurationList section */ 313 | }; 314 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 315 | } 316 | -------------------------------------------------------------------------------- /sample project/SampleApp/SampleApp_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'SampleApp' target in the 'SampleApp' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /sample project/SampleApp/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // SampleApp 4 | // 5 | // Created by honcheng on 11/27/10. 6 | // Copyright 2010 honcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | @autoreleasepool { 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | return retVal; 16 | } 17 | } 18 | --------------------------------------------------------------------------------