UITableView样式的自定义

原创 2015年11月18日 17:41:32
很多时候,我们需要自定义UITableView来满足我们的特殊要求。这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳。

1.添加自定义的Cell。

这个问题已经涉及过,但是,这里要说的主要是两种方法的比较!
因为,我经常发现有两种方式:
1.xib方式
这种方式,也就是说,为自定义的UITableViewCell类添加一个xib的文件。并且让两者关联。
这时候,写法为:

 

// 返回cell

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

    

    static NSString *CellIdentifier = @"MyCell";

   // 自定义cell

    MyCell *cell= (MyCell *)[tableVie dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil){

       // 这种方式,将会查找响应的xib文件,将不会调用initWithStyle方法

       NSArray *array= [[NSBundlemainBundle]loadNibNamed:@"MyCell"owner:nil options:nil];

       cell = [array objectAtIndex:0];

    }

这种方式,是读取了xib文件,所以,就直接按照响应的xib中的布局,布局好了,并不会调用相应的initWithStyle方法。


2.调用initWithStyle方法

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

   static NSString *CellIdentifier = @"MyCell";

   // 自定义cell

    MyCell *cell= (MyCell *)[tableVie dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil){

       // 这种方式,将会调用cell中的initWithStyle方法

       cell = [[[MyCell alloc] initWithStyle:UITableViewCellSelectionStyleGrayreuseIdentifier:CellIdentifier]autorelease];

    }

   return cell;

    

}


这种方式,会调用相应Cell类的initWithStyle方法。

那么,什么时候,用那种方式呢?
我的理解是:
当,cell比较简单时,可以添加相应的xib文件,进行关联;当cell比较复杂时,就直接用纯代码的方式(不创建相应的xib文件)。
我发现,我还是喜欢用纯代码的方式来写,因为,扩展性好,尤其当cell元素复杂甚至带有动画效果的时候,用xib反而很难控制,或者根本无法控制。
我建议用纯代码的方式!


2.设置cell的setAccessoryView属性

主要用在:在右边添加一个自定义的按钮,或者子视图。
setAccessoryView设置一个按钮。

cell.accessoryType = UITableViewCellAccessoryNone;

   UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    

    [button setFrame:CGRectMake(0.0, 0.0, 55, 57)];

   [button setImage:[UIImage imageNamed:@"tap_normal.png"] forState:UIControlStateNormal];

   [button setImage:[UIImage imageNamed:@"tap_highlight.png"] forState:UIControlStateHighlighted];

    [button setTag:indexPath.row];

   [button addTarget:selfaction:@selector(doClickPlaybillAction:event:) forControlEvents:UIControlEventTouchUpInside];


   [button setBackgroundColor:[UIColor clearColor]];

    [cell setAccessoryView:button];


    return cell;


通过观察属性定义:

@property(nonatomic)UITableViewCellAccessoryType  accessoryType;            

@property(nonatomic,retain) UIView             *accessoryView;            

@property(nonatomic)UITableViewCellAccessoryType  editingAccessoryType;      

@property(nonatomic,retain) UIView              *editingAccessoryView; 

可见,accessoryView属性需要的参数为UIView,所以,可以很方便的自定义。当然还有editingAccessoryView,可以进行自定义修改时的UIView。

根据用户点击的按钮,找到相应的Cell

-(void)performExpand:(id)paramSender{


    UITableViewCell *ownerCell = (UITableViewCell*)[paramSendersuperview];// 获得父视图,即TableViewCell

    if (ownerCell != nil){


      NSIndexPath*ownerCellIndexPath = [self.myTableViewindexPathForCell:ownerCell];

       NSLog(@"Accessory inindex path is tapped. Index path = %@", ownerCellIndexPath);

       

    }

}


3.自定义cell选择时的样式。


通过,上面一步,我们为Cell添加了一个自定义的按钮。

也许就会遇到这么一个纠结的情况,当点击UITableViewCell高亮时,其子视图中不该高亮的对象(比如说自定义的那个按钮)也高亮了。


比如:

正确方式:我们需要cell被选中时,按钮不应该也被高亮显示。如:


UITableView <wbr>应用(五)UITableView样式的自定义


错误方式:但是,cell被选中时,按钮却也高亮显示了。如:


UITableView <wbr>应用(五)UITableView样式的自定义


要解决该方法,可以这样:

 

 

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{

    [super setHighlighted:highlighted animated:animated];

    

    if(highlighted) {

       [(UIButton*)self.accessoryView setHighlighted:NO];

    }

}


 

-(void)setSelected:(BOOL)selected animated:(BOOL)animated{

    [super setSelected:selected animated:animated];

    if(selected) {

       [(UIButton*)self.accessoryView setHighlighted:NO];

    }

}


这样,问题时解决了,那如果我们再深一层次,发问一下:

为什么UITableViewCell被选中时,UITableViewCell中的其他元素也会被高亮显示呢?

因为UITableViewCell为选中状态时,UITableViewCellselectedBackgroundView当作一个子视图来添加;

selectedBackgroundView被添加在UITableViewCellbackgroundView之上,或者所有其它视图之下。

当调用setSelected:animated:这一方法时,会导致selectedBackgroundView以一个alpha消化的状态来出现和消失。

还应该注意:

UITableViewCellselectionStyleUITableViewCellSelectionStyleNone时,selectedBackgroundView将不起作用。





4.为UITableViewCell添加自定义背景

有时候,我们要为UITableViewCell自定义的类的每个cell添加自定义的背景图片。
有很多方法:
1.在自定义的UITableViewCell类的initWithStyle方法中,添加如下代码:

// 设置背景

       UIImageView *bgImage=[[[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320,57)] autorelease];

       [bgImage setImage: [UIImage imageNamed:@"table_live_bg.png"]];

       [selfsetBackgroundView:bgImage];


2.使用setBackgroundImageByName方法或者setBackgroundImage方法

[self setBackgroundImageByName:@"table_live_bg.png"];

[self setBackgroundImage:[UIImage imageNamed:@"table_live_bg.png"]];

这种方法,要注意的时,设置的图片大小应该与cell大小相同

3.设置cell的contentView,用insertSubview方法

[self.contentView insertSubview:messageBackgroundViewbelowSubview:self.textLabel];

       

 self.selectionStyle =UITableViewCellSelectionStyleNone;


这三种方式,都在initWithStyle方法中设置。

5.设置删除Cell时的自定义文本

//定制Delete字符串,添加函数返回要显示的字符串

-(NSString*)tableView:(UITableView*)tableViewtitleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{

    return @"删除";

}





希望对你有所帮助!

自定义UITableView的左滑动样式

当UITableView进入编辑模式,在进行左滑操作的cell的右边,默认会出现Delete按钮,如何自定义左滑出现的按钮呢? 只需要实现UITableView下面的这个代理方法。 - (NSAr...

UITableView-的cell 自定义 高度,样式

UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格。通常,UITableView中的Cell是动态的,在使用过程中,会创建一个Cell池,根据每个cell的...

Xcode9学习笔记47 - 单元格被选中获、取消选中的图标,自定义UITableView单元格Accessory样式

import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {//表...

UITableView 应用(五)UITableView样式的自定义

很多时候,我们需要自定义UITableView来满足我们的特殊要求。这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳。 1.添加自定义的Cell。 ...

自定义UITableView多行输入框

  • 2012年11月21日 22:31
  • 28KB
  • 下载

自定义UITableView,实现cell的三级分组展开收起

自定义UITableView,实现cell的三级分组展开收起

[IOS]用自定义的cell来创建UITableView

步骤: 1.创建自定义的CellView.xib,操作New File->User Interface->View->命名cellView 2.往上面拖放一个UITableViewCell,然后向...

UITableView自定义左滑删除按钮(带图片)

转载请注明本文出自surfaceeee的博客(http://blog.csdn.NET/u010519146/article/details/42882635),请尊重他人的辛勤劳动成果,谢谢!本人一...
  • KurryGo
  • KurryGo
  • 2016年12月12日 11:24
  • 2767
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UITableView样式的自定义
举报原因:
原因补充:

(最多只允许输入30个字)