用系統(tǒng)方法自定義滑動(dòng)Cell 視圖(兼容iOS7)

實(shí)現(xiàn)效果

實(shí)現(xiàn)系統(tǒng)原生的刪除方法

  • 必須要實(shí)現(xiàn)系統(tǒng)原生的兩個(gè)方法
    1. 方法editingStyleForRowAtIndexPath:為設(shè)置表格的樣式為刪除樣式;
    2. 方法titleForDeleteConfirmationButtonForRowAtIndexPath:為編輯時(shí)顯示的文字,這里講的是自定義,所以這里的文字可以傳空字符串,避免自定義后文字重疊異常顯示, 系統(tǒng)默認(rèn)顯示的文字為 "刪除"枕稀;

注意: 這里的傳的空字符串的長度決定你自定義后顯示多少個(gè)按鈕的總寬度策精。

#pragma mark - <UITableViewDelegate>

/**
 *  實(shí)現(xiàn)表格系統(tǒng)方法的編輯模式為刪除模式
 */
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleDelete;
}

/**
 *  設(shè)置滑出cell后的文字為空字符串
 */
- (NSString*)tableView:(UITableView*)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath*)indexpath {
    return @"                         ";
}

數(shù)據(jù)源的代理方法實(shí)現(xiàn)不需要額外設(shè)置什么

#pragma mark - <UITableViewDataSource>

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifie = @"UITableViewCell";
    GJEmployeeCell *cell = [tableView dequeueReusableCellWithIdentifier:identifie];
    if (!cell) {
        cell = [[GJEmployeeCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifie];
    }    
    //選擇的cell
    WEAKSELF
    cell.slectedActionBlock = ^(SwipeCellActionType cellActionType, UITableViewCell *cell){
        //防止cell出現(xiàn)選中效果
        NSIndexPath *editIndex = [tableView indexPathForCell:cell];
        [tableView reloadRowsAtIndexPaths:@[editIndex] withRowAnimation:UITableViewRowAnimationNone];
        
        GJEmployeeModel *editEmployee = weakSelf.dataArr[editIndex.row];
        if (cellActionType == EditCellType) {
            //處理編輯按鈕事件...
        } else {
            //處理刪除按鈕事件...
        }
    };
    return cell;
}

自定義Cell(.m)文件的邏輯

  • 關(guān)鍵點(diǎn):重寫cell的 layoutSubviews方法
  • layoutSubviews方法中遍歷尋找到滑動(dòng)完Cell后底部顯示的視圖, 然后再添加需要自定義的按鈕的到底部的視圖上;

注意: 這里要根據(jù)當(dāng)前的手機(jī)系統(tǒng)版本來區(qū)分底部的視圖是屬于哪種類型的視圖:
1.在iOS8以下的系統(tǒng)經(jīng)過親自測試遍歷到底部的視圖屬于:UITableViewCellDeleteConfirmationView這種類型的視圖;
2.在iOS8以上的系統(tǒng)經(jīng)過親自測試遍歷到底部的視圖屬于:_UITableViewCellActionButton這種類型的視圖;

/**
 *  根據(jù)ios系統(tǒng)版本自定義滑動(dòng)刪除按鈕
 */
- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {

        for (UIView *subview2 in subview.subviews) {
            
            //根據(jù)ios系統(tǒng)版本判斷滑動(dòng)刪除視圖View, (關(guān)鍵部分)
            NSString *systemDeleteViewName = nil;
            if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
                systemDeleteViewName = @"UITableViewCellDeleteConfirmationView";
                
            } else {
                systemDeleteViewName = @"_UITableViewCellActionButton";
            }
            
            if ([NSStringFromClass([subview2 class]) isEqualToString:systemDeleteViewName]) {
                
                NSLog(@"subview2 屬于什么View====%@",subview2);
                
                //防止多次添加自定義按鈕
                [subview2.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
                
                //subview2的寬度由控制器里面的代理方法(tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:)返回的文字寬度決定
                
                [subview2 addSubview:self.editButton];
                self.editButton.width = subview2.width/2;
                
                [subview2 addSubview:self.deleteButton];
                self.deleteButton.x = CGRectGetMaxX(self.editButton.frame);
                self.deleteButton.width = self.editButton.width;
                NSLog(@"subview2====%zd",subview2.subviews.count);
            }
        }
    }
}

- (UIButton *)editButton
{
    if (!_editButton) {
        _editButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, self.height)];
        _editButton.backgroundColor = UIColorFromRGB(0xbbbbbb);
        [_editButton setImage:ImageNamed(@"editButton_icon") forState:0];
        _editButton.tag = EditCellType;
        [_editButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _editButton;
}

- (UIButton *)deleteButton
{
    if (!_deleteButton) {
        _deleteButton = [[UIButton alloc] initWithFrame:CGRectMake(80, 0, 80, self.height)];
        _deleteButton.backgroundColor = UIColorFromRGB(0xfe7270);
        [_deleteButton setImage:ImageNamed(@"deleteButton_icon") forState:0];
        _deleteButton.tag = DeleteCellType;
        [_deleteButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _deleteButton;
}

- (void)buttonAction:(UIButton *)button
{
    if (self.slectedActionBlock) {
        self.slectedActionBlock(button.tag, self);
    }
}

總結(jié)

以上實(shí)現(xiàn)自定義的方法的關(guān)鍵點(diǎn)在于遍歷到Cell底部的視圖, 這種遍歷的方法可能會(huì)隨著iOS手機(jī)系統(tǒng)的版本不同而Cell層次結(jié)構(gòu)也不同, 因此在最新的iOS10.2以后的版本中可能存在遍歷不到的情況, 經(jīng)過親自測試,目前最新的iOS10.2以下的版本可用上面的方法親測有效;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悲靴,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揪漩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吏口,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門奄容,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冰更,“玉大人,你說我怎么就攤上這事昂勒∈裣福” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵戈盈,是天一觀的道長审葬。 經(jīng)常有香客問我,道長奕谭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任痴荐,我火速辦了婚禮血柳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘生兆。我一直安慰自己难捌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布鸦难。 她就那樣靜靜地躺著根吁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪合蔽。 梳的紋絲不亂的頭發(fā)上击敌,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音拴事,去河邊找鬼沃斤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刃宵,可吹牛的內(nèi)容都是我干的衡瓶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牲证,長吁一口氣:“原來是場噩夢啊……” “哼哮针!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坦袍,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤十厢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捂齐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寿烟,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年辛燥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筛武。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝其。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徘六,靈堂內(nèi)的尸體忽然破棺而出内边,到底是詐尸還是另有隱情,我是刑警寧澤待锈,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布漠其,位于F島的核電站,受9級(jí)特大地震影響竿音,放射性物質(zhì)發(fā)生泄漏和屎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一春瞬、第九天 我趴在偏房一處隱蔽的房頂上張望柴信。 院中可真熱鬧,春花似錦宽气、人聲如沸随常。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绪氛。三九已至,卻和暖如春涝影,著一層夾襖步出監(jiān)牢的瞬間枣察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工燃逻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留询件,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓唆樊,卻偏偏與公主長得像宛琅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逗旁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容