UITableViewCell 是編輯狀態時 會出現多選按鈕,最近項目有需求這裡要改成自己的圖片和去掉一下點擊效果,總結一下: 內建的效果圖是這樣的:
我們需要的效果是換掉 藍色的選中圖片和點擊的背景顏色 效果大概是這樣:
我們一步步的來:
首先把藍色的選中圖片換成自己的:方法就是先遍曆cell的contentview得到這個圖片然後替換,在自訂的cell裡面找到- (void)setSelected:(BOOL)selected animated:(BOOL)animated方法 具體代碼: (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
if (!self.editing) return;
[super setSelected:selected animated:animated];
if (self.isEditing && self.isSelected) {
self.contentView.backgroundColor = [UIColor clearColor]; //這裡自訂了cell 就改變自訂控制項的顏色 self.textLabel.backgroundColor = [UIColor clearColor]; UIControl *control = [self.subviews lastObject]; UIImageView * imgView = [[control subviews] objectAtIndex:0]; imgView.image = [UIImage imageNamed:@"要替換的圖片"];
}
}
加了這代碼後效果是這樣的:
可以看到圖是已經換了,但是點擊的效果沒有去掉,下一步去掉點擊的效果,我們可以根據cell的selectedBackgroundView屬性來改變,具體代碼:
(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
self.contentView.backgroundColor = [UIColor clearColor]; UIView *backGroundView = [[UIView alloc]init]; backGroundView.backgroundColor = [UIColor clearColor]; self.selectedBackgroundView = backGroundView; //以下自訂控制項
}
return self;
}
效果如下:
這樣基本已經好了,但是有的時候狂點系統的藍色表徵圖有時也會出來,發現是高亮狀態的問題,所有在cell裡面還要實現這個方法:
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
// [super setHighlighted:highlighted animated:animated]; // if (self.isEditing && self.isHighlighted ) { // UIControl *control = [self.subviews lastObject]; // UIImageView * imgView = [[control subviews] objectAtIndex:0]; // imgView.image = [UIImage imageNamed:@"DC_agree_selected"]; // } return;
} 裡面把高亮狀態的圖片換成自己的就可以,我試了直接return也可以.
後續: 要實現編輯前UITableView要先進入編輯狀態:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == (UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert)) { [self.dataSoure removeObject:[self.dataSoure objectAtIndex:indexPath.row]]; //animation後面有好幾種刪除的方法 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } }
如何處理選中和未選中的資料呢。用系統內建的方法就可以,首先定義一個可變的數組@property (nonatomic,strong) NSMutableArray* selectArray;,然後在tableView協議方法裡面找到didSelectRowAtIndexPath和didDeselectRowAtIndexPath方法,具體實現:
#pragma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.selectArray addObject:[self.dataSoure objectAtIndex:indexPath.row]]; } - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { [self.selectArray removeObject:[self.dataSoure objectAtIndex:indexPath.row]]; }<br />
一起學習進步
文/棟飛