UITableView is probably the most used view on the iPhone. It’s flexible and the UI is ideally suited to use on the iPhone. There are lots of examples on how to add multiple items to a UITableViewCell. However, I needed to present some data in a more traditional spreadsheet style grid. The results worked well and enabled me to pack a lot of information on the screen that was very hard to follow without the vertical grid. I’ll show a very simplified version here you can use to add vertical lines to your UITableView.
First we need to create a subclass of UITableViewCell. This is so we can override drawrect and draw our lines and to add an array to hold a list of positions where we’ll draw the lines.
@interface MyTableCell : UITableViewCell { NSMutableArray *columns; } - (void)addColumn:(CGFloat)position; @end |
- (void)addColumn:(CGFloat)position { [columns addObject:[NSNumber numberWithFloat:position]]; } |
Now lets override drawRect. In it we grab the current graphics context and set the line color and width. Then we iterate over our columns array drawing a line from the top of the cell row to the bottom at each position stored in the array.
- (void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); // Use the same color and width as the default cell separator for now CGContextSetRGBStrokeColor(ctx, 0.5, 0.5, 0.5, 1.0); CGContextSetLineWidth(ctx, 0.25); for (int i = 0; i < [columns count]; i++) { CGFloat f = [((NSNumber*) [columns objectAtIndex:i]) floatValue]; CGContextMoveToPoint(ctx, f, 0); CGContextAddLineToPoint(ctx, f, self.bounds.size.height); } CGContextStrokePath(ctx); [super drawRect:rect]; } |
[cell addColumn:50];when you’re building each cell.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row]; MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0, 30.0, tableView.rowHeight)] autorelease]; [cell addColumn:50]; label.tag = LABEL_TAG; label.font = [UIFont systemFontOfSize:12.0]; label.text = [NSString stringWithFormat:@"%d", indexPath.row]; label.textAlignment = UITextAlignmentRight; label.textColor = [UIColor blueColor]; label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; [cell.contentView addSubview:label]; label = [[[UILabel alloc] initWithFrame:CGRectMake(60.0, 0, 30.0, tableView.rowHeight)] autorelease]; [cell addColumn:120]; label.tag = VALUE_TAG; label.font = [UIFont systemFontOfSize:12.0]; // add some silly value label.text = [NSString stringWithFormat:@"%d", indexPath.row * 4]; label.textAlignment = UITextAlignmentRight; label.textColor = [UIColor blueColor]; label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; [cell.contentView addSubview:label]; } return cell; } |
Here’s the source code.
Great post. This does not work when tableview style is set to grouped.
ReplyDelete