自定义UITableViewCell:Cell高度、分割线、间距等

UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格。

通常,UITableView中的Cell是 动态的,在使用过程中,会创建一个Cell池,根据每个cell的高度(即tableView:heightForRowAtIndexPath:返回 值),以及屏幕高度计算屏幕中可显示几个cell。而进行自定义TableViewCell无非是采用代码实现或采用IB编辑nib文件来实现两种方式, 本文主要收集代码的方式实现各种cell自定义。

如何动态调整Cell高度

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

staticNSString*[email protected]"Cell";

UITableViewCell*cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell ==nil){

cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

UILabel*label =[[UILabel alloc] initWithFrame:CGRectZero];

label.tag =1;

label.lineBreakMode =UILineBreakModeWordWrap;

label.highlightedTextColor =[UIColor whiteColor];

label.numberOfLines =0;

label.opaque = NO;// 选中Opaque表示视图后面的任何内容都不应该绘制

label.backgroundColor =[UIColor clearColor];

[cell.contentView addSubview:label];

[label release];

}

UILabel*label =(UILabel*)[cell viewWithTag:1];

NSString*text;

text =[textArray objectAtIndex:indexPath.row];

CGRect cellFrame =[cell frame];

cellFrame.origin =CGPointMake(0,0);

label.text = text;

CGRect rect =CGRectInset(cellFrame,2,2);

label.frame = rect;

[label sizeToFit];

if(label.frame.size.height >46){

cellFrame.size.height =50+ label.frame.size.height -46;

}

else{

cellFrame.size.height =50;

}

[cell setFrame:cellFrame];

return cell;

}

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath

{

UITableViewCell*cell =[self tableView:tableView cellForRowAtIndexPath:indexPath];

return cell.frame.size.height;

}

如何用图片自定义Table Separeator分割线

一般地,利用类似[tableView setSeparatorColor:[UIColor redColor]];语句即可修改cell中间分割线的颜色。那又如何用一个图片作为分割线背景呢?可以尝试如下:

方法一:

先设置cell separatorColor为clear,然后把图片做的分割线添加到自定义的custom cell上。

方法二:

在cell里添加一个像素的imageView后将图片载入进,之后设置tableView.separatorStyle = UITableViewCellSeparatorStyleNone

自定义首行Cell与其上面导航栏间距

  1. tableView.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0,0,5,20)] autorelease];

自定义UITableViewCell的accessory样式

默认的accessoryType属性有四种取值:UITableViewCellAccessoryNone、 UITableViewCellAccessoryDisclosureIndicator、 UITableViewCellAccessoryDetailDisclosureButton、 UITableViewCellAccessoryCheckmark。

如果想使用自定义附件按钮的其他样式,则需使用UITableView的accessoryView属性来指定

UIButton*button;

if(isEditableOrNot){

UIImage*image =[UIImage imageNamed:@"delete.png"];

button =[UIButton buttonWithType:UIButtonTypeCustom];

CGRect frame =CGRectMake(0.0,0.0,image.size.width,image.size.height);

button.frame = frame;

[button setBackgroundImage:image forState:UIControlStateNormal];

button.backgroundColor =[UIColor clearColor];

cell.accessoryView = button;

}else{

button =[UIButton buttonWithType:UIButtonTypeCustom];

button.backgroundColor =[UIColor clearColor];

cell.accessoryView = button;

}

以上代码仅仅是定义了附件按钮两种状态下的样式,问题是现在这个自定义附件按钮的事件仍不可用。

即事件还无法传递到 UITableViewDelegate的accessoryButtonTappedForRowWithIndexPath方法上。

当我们在上述代码 中在加入以下语句:

[button addTarget:self action:@selector(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];

后, 虽然可以捕捉到每个附件按钮的点击事件,但我们还无法进行区别到底是哪一行的附件按钮发生了点击动作!因为addTarget:方法最多允许传递两个参 数:target和event,这两个参数都有各自的用途了(target指向事件委托对象,event指向所发生的事件)。看来只依靠Cocoa框架已 经无法做到了。

但我们还是可以利用event参数,在自定义的btnClicked方法中判断出事件发生在UITableView的哪一个cell上。因为UITableView有一个很关键的方法indexPathForRowAtPoint,可以根据触摸发生的位置,返回触摸发生在哪一个cell的indexPath。而且通过event对象,正好也可以获得每个触摸在视图中的位置。

// 检查用户点击按钮时的位置,并转发事件到对应的accessory tapped事件

-(void)btnClicked:(id)sender event:(id)event

{

  NSSet*touches =[event allTouches];

  UITouch*touch =[touches anyObject];

  CGPoint currentTouchPosition =[touch locationInView:self.tableView];

  NSIndexPath*indexPath =[self.tableView indexPathForRowAtPoint:currentTouchPosition];

  if(indexPath !=nil)

{

[self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];

}

}

这样,UITableView的accessoryButtonTappedForRowWithIndexPath方法会被触发,并且获得一个indexPath参数。通过这个indexPath参数,我们即可区分到底哪一行的附件按钮发生了触摸事件。

-(void)tableView:(UITableView*)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath

{

int*idx = indexPath.row;

//这里加入自己的逻辑

}

时间: 2024-10-04 03:01:54

自定义UITableViewCell:Cell高度、分割线、间距等的相关文章

转:自定义UITableViewCell:Cell高度、分割线、间距等

UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格. 通常,UITableView中的Cell是 动态的,在使用过程中,会创建一个Cell池,根据每个cell的高度(即tableView:heightForRowAtIndexPath:返回 值),以及屏幕高度计算屏幕中可显示几个cell.而进行自定义TableViewCell无非是采用代码实现或采用IB编辑nib文件来实现两种方式, 本文主要收集代码的方式实现各种cell自定义. 如何动态调整Cell

UI_11 自定义UITableViewCell、Cell的高度自适应

UITableViewCell很难满足我们的需求,因此,CustomCell(自定义单元格)至关重要.下面将通过一个例子演示自定义Cell.第二部分演示根据文本内容自适应Label.Cell高度. 第一部分 CustomCell的创建 1.创建DemoTableViewController,继承自UITableViewController,并设置其为window的根视图 AppDelegate.m - (BOOL)application:(UIApplication *)application

iOS tableViewCell 在自定义高度方法中遇到的问题,cell高度为0,cell显示不出来,cell直接显示第几个而不是...cell显示个数不对

遇到以上问题可以看看你的cell高度中是否有,自定的高度,有了继续看,没有了继续百度... 在文字排版中,少不了自适应文字高度,行间距什么的:显然cell的高度时不固定的,如果复用自定义的cell的话,又要及时把高度传给cell,进行赋值: 在-(UITableViewCell*)tableview... cellForRow...{在里边进行计算cell高度时可以的,需要将数值赋值给 cell.height=这个属性: 不可以设置全局CGFloat传值,因为赋值还没有进行完,在HeightRo

UI_UItableView_AutoCell(自定义cell 高度)

#pragma mark 赋值方法 -(void)setCellDataWithModel:(NewsModel *)sender { self.titleLabel.text = sender.title; self.summaryLabel.text = sender.summary; CGFloat height = [NewsCell getHeightWithModel:sender]; // 把计算出来的高度赋值给label CGRect labelFrame = self.summ

如何得到自定义UITableViewCell中的按钮所在的cell的indexPath.row

在自定义UITableViewCell中创建了一个按钮. 想在点击该按钮时知道该按钮所在的cell在TableView中的行数.就是cell的 indexPath.row 两种方法都很好.-(IBAction):(id)sender{    NSLog(@"MyRow:%d",[self.table indexPathForCell:((TableViewCell*)[[sender   superview]superview])].row); //这个方便一点点,不用设置tag.  

iOS中 UITableViewCell cell划线那些事 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 在开发中经常遇到cell分割线显示不全或者想自定义线的宽高等; 最近总结了一下,希望帮到大家: 1.不想划线怎么办? TableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; // 设置系统默认线的样式 -(void)viewDidLayoutSubviews { if ([TableView respondsToSelector:@selecto

AutoLayout UITableViewCell 动态高度

从这里http://www.cnblogs.com/liandwufan/p/4516956.html?utm_source=tuicool 转载过来的 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // static NSString * cellid = @"PayMentTableViewCell"; PayMentTab

自定义UITableViewCell新浪微博

自定义UITableViewCell新浪微博 自定义UITableViewCell的步骤: 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型: 存放文字数据\图片数据 frame模型: 存放数据模型\所有子控

iOS开发15:自定义UITableViewCell

上篇文章介绍了如何用UITableView显示表格,并讲了几种UITableViewCell的风格.不过有时候我们需要自己定义UITableViewCell的风格,其实就是向行中添加子视图.添加子视图的方法主要有两种:使用代码以及从.xib文件加载.当然后一种方法比较直观. 我们这次要自定义一个Cell,使得它像QQ好友列表的一行一样:左边是一张图片,图片的右边是三行标签: 当然,我们不会搞得这么复杂,只是有点意思就行. 1.运行Xcode 4.2,新建一个Single View Applica