UITableViewSectionHeader⾃定义section的头部
//⾃定义section的头部
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(10, 0, 300, 30)];//创建⼀个视图
UIImageView *headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 0, 300, 30)];
UIImage *image = [UIImage imageNamed:@"4-2.png"];
[headerImageView setImage:image];
[headerView addSubview:headerImageView];
[headerImageView release];
NSString  *createTime = [self.keysArray objectAtIndex:section];
createTime = [createTime stringByReplacingCharactersInRange:NSMakeRange(4, 1) withString:@"-"];
createTime = [createTime stringByReplacingCharactersInRange:NSMakeRange(7, 1) withString:@"-"];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(130, 5, 150, 20)];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.font = [UIFont boldSystemFontOfSize:15.0];
< = createTime;
[headerView addSubview:headerLabel];
[headerLabel release];
return headerView;
}
分类: 2012-05-30 11:24 746⼈阅读 (0)
section所显⽰的灰⾊背景和⽩⾊字体是默认的,调⽤以下⽅法即可实现
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [self.keys objectAtIndex:section];
}
如果想改变此处的背景与字体的话,官⽅没有开放接⼝去直接修改以上两个属性,所以,只有⾃⼰加Label,加View去实现,代码如下:
实现委托⽅法- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView* myView = [[[UIView alloc] init] autorelease];
myView.backgroundColor = [UIColor colorWithRed:0.10 green:0.68 blue:0.94 alpha:0.7];
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 90, 22)];
titleLabel.backgroundColor = [UIColor clearColor];
<=[self.keys objectAtIndex:section];
[myView addSubview:titleLabel];
[titleLabel release];
return myView;
}
Cocoa提供的按钮背景⾊为透明。因为ContentView被移开,下⾯是tableView的颜⾊,已经不是cell的⼀部分了。
所以,最好的⽅式应该是通过cell.backgroundView来改变cell的背景。按照⽂档说明,backgroundView始终处于 cell的最下层,所以,将cell⾥的其它subview 背景设为[UIColor clearColor],以cell.backgroundView作为统⼀的背景,应该是最好的⽅式。UIView *backgrdView =[[UIView alloc] initWithFrame:cell.frame]; backgrdView.backgroundColor=[UIColor blueColor];
cell.backgroundView= backgrdView;
[backgrdView release];
在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath ⽅法中,[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES]
ios 动态调整列表⾏⾼的经验教训
最初的列表界⾯(UITableView)⾏⾼是固定的。所以实现 UITableViewDelegate中的:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
返回⼀个固定的CGFloat类型的数既可。
不久以前,需要将UITableView⾥⾯的每个cell⾼度动态调整。(cell ⾥⾯有⼀个
UILable), 长度是可变的。
最后通过,在
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
中调⽤
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
得的UITableViewCell,最后通过返回UITableViewCell.frame.size.height 搞定
原因⼤概是这样:
reload 调⽤ cellForRowAtIndexPath,但在此之前会先执⾏heightForRowAtIndexPath
所有在 heightForRowAtIndexPath ⾥⾯调⽤ cellForRowAtIndexPath 不会有问题。
此处有⼀个明显的问题就是 cellForRowAtIndexPath 会被调⽤两次。
今天⼜有⼀个需求:需要在因UITableView 的datasource变化后,导致某⼀个确定的cell需要被
reload (reloadRowsAtIndexPaths). reload 后需要在该cell中添加⼀些竖型排列⼦视图(addsubview)并且让该subview在可视区域⾥⾯。
在reload部分。cellForRowAtIndexPath部分。(reload的时候会⾃动调⽤cellForRowAtIndexPath)增加了部分UIScrollView的scroll相关的代码。(UITableView继承⾃UIScrollView)。发现 cellForRowAtIndexPath被循环调⽤。
实在是太给⼒了。
ios的源代码看不见,但是感觉应该是下⾯这样的调⽤序列:
cellForRowAtIndexPath 会调⽤ UIScrollView的scroll相关的代码。⽽ UIScrollView的scroll相关的代码⼜调⽤ heightForRowAtIndexPath。heightForRowAtIndexPath则⼜会调⽤ cellForRowAtIndexPath.
view ui框架
⼀个完整的死循环出现了。
所有,在求tableview的⾏⾼的时候,万不能图⽅便在 heightForRowAtIndexPath 调⽤
cellForRowAtIndexPath 来得到cell相关的⾼度。不然后果太严重了。
最后的做法,依然是通过计算cell的实际⾼度在解决。可能会⽐较复杂。也⽐较⿇烦。但是却是⼀条⽐较稳妥的做法。对后⾯扩展新功能不会有影响。
需要注意的⼀点是:这个⽅法⾥返回视图的⼤⼩是固定不变的
The table view automatically adjusts the height of the section header to accommodate the returned view object. The table view does not call this method if it was created in a plain style (UITableViewStylePlain).

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。