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

如何动态调整Cell高度 

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

   2.   
   3.     staticNSString*CellIdentifier=@"Cell"; 
   4.   
   5.     UITableViewCell*cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
   6.     if(cell ==nil){ 
   7.         cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
   8.         UILabel*label =[[UILabel alloc] initWithFrame:CGRectZero]; 
   9.         label.tag =1; 
  10.         label.lineBreakMode =UILineBreakModeWordWrap; 
  11.         label.highlightedTextColor =[UIColor whiteColor]; 
  12.         label.numberOfLines =0; 
  13.         label.opaque = NO;// 选中Opaque表示视图后面的任何内容都不应该绘制 
  14.         label.backgroundColor =[UIColor clearColor]; 
  15.         [cell.contentView addSubview:label]; 
  16.         [label release]; 
  17.     } 
  18.   
  19.     UILabel*label =(UILabel*)[cell viewWithTag:1]; 
  20.     NSString*text; 
  21.     text =[textArray objectAtIndex:indexPath.row]; 
  22.     CGRect cellFrame =[cell frame]; 
  23.     cellFrame.origin =CGPointMake(0,0); 
  24.   
  25.     label.text = text; 
  26.     CGRect rect =CGRectInset(cellFrame,2,2); 
  27.     label.frame = rect; 
  28.     [label sizeToFit]; 
  29.     if(label.frame.size.height >46){ 
  30.         cellFrame.size.height =50+ label.frame.size.height -46; 
  31.     } 
  32.     else{ 
  33.         cellFrame.size.height =50; 
  34.     } 
  35.     [cell setFrame:cellFrame]; 
  36.   
  37.     return cell; 
  38. } 
  39. 
  40. -(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
  41. { 
  42.     UITableViewCell*cell =[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
  43.     return cell.frame.size.height; 
  44. } 
  45.
  46.

如何用图片自定义Table Separeator分割线
一般地,利用类似[tableView setSeparatorColor:[UIColor redColor]];语句即可修改cell中间分割线的颜色。那又如何用一个图片作为分割线背景呢?可以尝试如下:
方法一:
先设置cell separatorColor为clear,然后把图片做的分割线添加到自定义的custom cell上。
方法二:
在cell里添加一个像素的imageView后将图片载入进,之后设置tableView.separatorStyle = UITableViewCellSeparatorStyleNone
自定义首行Cell与其上面导航栏间距
[cpp] view plaincopy
   1. tableView.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0,0,5,20)] autorelease]; 
自定义UITableViewCell的accessory样式
      默认的accessoryType属性有四种取值:UITableViewCellAccessoryNone、 UITableViewCellAccessoryDisclosureIndicator、 UITableViewCellAccessoryDetailDisclosureButton、 UITableViewCellAccessoryCheckmark。
如果想使用自定义附件按钮的其他样式,则需使用UITableView的accessoryView属性来指定。

   1. UIButton*button; 
   2. if(isEditableOrNot){ 
   3.     UIImage*image =[UIImage imageNamed:@"delete.png"]; 
   4.     button =[UIButton buttonWithType:UIButtonTypeCustom]; 
   5.     CGRect frame =CGRectMake(0.0,0.0,image.size.width,image.size.height); 
   6.     button.frame = frame; 
   7.     [button setBackgroundImage:image forState:UIControlStateNormal]; 
   8.     button.backgroundColor =[UIColor clearColor]; 
   9.     cell.accessoryView = button; 
  10. }else{ 
  11.     button =[UIButton buttonWithType:UIButtonTypeCustom]; 
  12.     button.backgroundColor =[UIColor clearColor]; 
  13.     cell.accessoryView = button; 
  14. } 

以上代码仅仅是定义了附件按钮两种状态下的样式,问题是现在这个自定义附件按钮的事件仍不可用。
即事件还无法传递到 UITableViewDelegate的accessoryButtonTappedForRowWithIndexPath方法上。
当我们在上述代码 中在加入以下语句:
       [button addTarget:self setfiletext:@selector(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];
后, 虽然可以捕捉到每个附件按钮的点击事件,但我们还无法进行区别到底是哪一行的附件按钮发生了点击动作!因为addTarget:方法最多允许传递两个参 数:target和event,这两个参数都有各自的用途了(target指向事件委托对象,event指向所发生的事件)。看来只依靠Cocoa框架已 经无法做到了。
      但我们还是可以利用event参数,在自定义的btnClicked方法中判断出事件发生在UITableView的哪一个cell上。因为UITableView有一个很关键的方法indexPathForRowAtPoint,可以根据触摸发生的位置,返回触摸发生在哪一个cell的indexPath。而且通过event对象,正好也可以获得每个触摸在视图中的位置。

   1. // 检查用户点击按钮时的位置,并转发事件到对应的accessory tapped事件 
   2. -(void)btnClicked:(id)sender event:(id)event 
   3. { 
   4.      NSSet*touches =[event allTouches]; 
   5.      UITouch*touch =[touches anyObject]; 
   6.      CGPoint currentTouchPosition =[touch locationInView:self.tableView]; 
   7.      NSIndexPath*indexPath =[self.tableView indexPathForRowAtPoint:currentTouchPosition]; 
   8.      if(indexPath !=nil) 
   9.      { 
  10.          [self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath]; 
  11.      } 
  12. } 

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

         1. -(void)tableView:(UITableView*)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath 
         2. { 
         3.     int  *idx = indexPath.row; 
         4.    //这里加入自己的逻辑 
         5. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值