爱悠闲 > 设置UITableView Section、cell背景颜色

设置UITableView Section、cell背景颜色

分类: iosUI  |  标签: uiview,table,header  |  作者: djl4104804 相关  |  发布日期 : 2012-03-11  |  热度 : 1439°

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.textColor=[UIColor whiteColor];
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.text=[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),UILable.text 长度是可变的。

最后通过,在

- (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.

一个完整的死循环出现了。

所有,在求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).


UITableView还有一个横扫表格行,显示删除按钮,用来删除行 只要实现tableView:commitEditingStyle:forRowAtIndexPath方法,其实XCode帮我们生成了一个模板代码,我们只要把注释去掉就行了

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    } 
}