Swift UITableView左滑删除按钮图文上下排列

一、需求:

需要左滑删除按钮需要图文上下显示(UIBtutton的图文显示,可根据自己需求显示)

左滑删除按钮.jpeg
二、先两种情况

1、iOS11.0之前的系统版本
2、iOS11.0之后的系统版本(注意iOS13.0之后也有变化)

三、iOS11.0之前的系统版本代码如下

3.1UITableView 实现editActionsForRowAt代理方法
// 适配 iOS11.0之前
    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        if #available(iOS 11.0, *) {
            
        } else {
            let deleteAction = UITableViewRowAction(style: .destructive, title: "取消收藏") { (action, indexPath) in
                // TODO
            }
            
            let shareAction = UITableViewRowAction(style: .normal, title: "分享") { (action, indexPath) in
                // TODO
            }
            shareAction.backgroundColor =  MSFColor.RGBA(red: 255, green: 153, blue: 0, alpha: 1.0)
            return [deleteAction, shareAction]
        }
        return nil
    }
3.2修改侧滑按钮,在自定义cell中重写didTransition函数
// 适配 iOS11.0之前
    override func didTransition(to state: UITableViewCell.StateMask) {
        if state == .showingDeleteConfirmation {
            for subView in self.subviews {
                if NSStringFromClass(subView.classForCoder) == "UITableViewCellDeleteConfirmationView" {
                    if let deleteBtn: UIButton = subView.subviews.first as? UIButton  {
                        changeAction(sourceBtn: deleteBtn, title: "取消收藏", imageStr: "icon_collecton_delete")
                    }
                    if let shareBtn: UIButton = subView.subviews.last as? UIButton  {
                        changeAction(sourceBtn: shareBtn, title: "分享", imageStr: "icon_collecton_share")
                    }
                }
            }
        }
    }
    
    private func changeAction(sourceBtn: UIButton, title: String?, imageStr: String?) {
        let btn = UIButton(type: .custom)
        btn.frame = CGRect(x: 0, y: 0, width: sourceBtn.frame.width, height: sourceBtn.frame.height)
        btn.backgroundColor = sourceBtn.backgroundColor
        btn.setImage(UIImage(named: imageStr ?? ""), for: .normal)
        btn.setTitle(title, for: .normal)
        btn.titleLabel?.font = MSFFont.fontValue(size: 14, weight: .regular)
        btn.setTitleColor(UIColor.white, for: .normal)
        // 修改button的图文上下显示
        btn.updateBtnEdgeInsets(style: .Top, space: 1)
        btn.isUserInteractionEnabled = false
        sourceBtn.backgroundColor = .clear
        sourceBtn.addSubview(btn)
    }
四、iOS11.0之后的系统版本代码如下

4.1UITableView 实现trailingSwipeActionsConfigurationForRowAt代理方法
@available(iOS 11.0, *)
    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let deleteAction = UIContextualAction(style: .normal, title: "") { [weak self] (action, view, resultClosure) in
            guard let `self` = self else {
                return
            }
            // TODO
        }
        let shareAction = UIContextualAction(style: .normal, title: "") { [weak self] (action, view, resultClosure) in
            guard let `self` = self else {
                return
            }
            // TODO
        }
        deleteAction.backgroundColor = .red
        shareAction.backgroundColor = MSFColor.RGBA(red: 255, green: 153, blue: 0, alpha: 1.0)
        let actions = UISwipeActionsConfiguration(actions: [deleteAction, shareAction])
        actions.performsFirstActionWithFullSwipe = false; // 禁止侧滑到最左边触发删除或者分享回调事件
        return actions
    }
4.2修改侧滑按钮 UITableView 实现willBeginEditingRowAt代理方法
//  适配iOS 11.0之后 修改侧滑删除、分享按钮
    func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {
        if #available(iOS 11.0, *) {
            for subView in tableView.subviews {
                if NSStringFromClass(subView.classForCoder) == "UISwipeActionPullView" {
                    if let deleteBtn: UIButton = subView.subviews.last as? UIButton  {
                        changeAction(sourceBtn: deleteBtn, title: "取消收藏", imageStr: "icon_collecton_delete")
                    }
                    if let shareBtn: UIButton = subView.subviews.first as? UIButton  {
                        changeAction(sourceBtn: shareBtn, title: "分享", imageStr: "icon_collecton_share")
                    }
                }  else if NSStringFromClass(subView.classForCoder) == "_UITableViewCellSwipeContainerView" {
                    // iOS13.0之后
                    for sub in subView.subviews {
                        if NSStringFromClass(sub.classForCoder) == "UISwipeActionPullView" {
                            if let deleteBtn: UIButton = sub.subviews.last as? UIButton  {
                                changeAction(sourceBtn: deleteBtn, title: "取消收藏", imageStr: "icon_collecton_delete")
                            }
                            if let shareBtn: UIButton = sub.subviews.first as? UIButton  {
                                changeAction(sourceBtn: shareBtn, title: "分享", imageStr: "icon_collecton_share")
                            }
                        }
                    }
                }
            }
        }
    }

    func changeAction(sourceBtn: UIButton, title: String?, imageStr: String?) {
        let btn = UIButton(type: .custom)
        btn.frame = CGRect(x: 0, y: 0, width: sourceBtn.frame.width, height: sourceBtn.frame.height)
        btn.backgroundColor = sourceBtn.backgroundColor
        btn.setImage(UIImage(named: imageStr ?? ""), for: .normal)
        btn.setTitle(title, for: .normal)
        btn.setTitleColor(UIColor.white, for: .normal)
       btn.titleLabel?.font = MSFFont.fontValue(size: 14, weight: .regular)
        if #available(iOS 13.0, *) {
            btn.titleLabel?.font = MSFFont.fontValue(size: 13, weight: .regular)
        } else {
            btn.contentHorizontalAlignment = .left
        }
      // 修改button的图文上下显示
        btn.updateBtnEdgeInsets(style: .Top, space: 1)
        btn.isUserInteractionEnabled = false
        sourceBtn.backgroundColor = .clear
        sourceBtn.addSubview(btn)
    }
五、修改button的图文上下排列

enum MSFBtnEdgeInsetsStyle {
    case Top                //image在上,label在下
    case Left               //image在左, label在右
    case Bottom             //image在下,label在上
    case Right              //image在右, label在左
}

extension UIButton {
    //更新btn的图文位置
   func updateBtnEdgeInsets(style: MSFBtnEdgeInsetsStyle, space: CGFloat) {
        let imageWidth = self.imageView?.frame.width ?? 0
        let imageHeight = self.imageView?.frame.height ?? 0
        
        let labelWidth = min(self.titleLabel?.intrinsicContentSize.width ?? 0, self.frame.width - imageWidth)
        let labelHeight = self.titleLabel?.intrinsicContentSize.height ?? 0
        
        var imageInsets = UIEdgeInsets.zero
        var labelInsets = UIEdgeInsets.zero
        
        switch style {
        case .Top:
            imageInsets = UIEdgeInsets.init(top: -(labelHeight + space) / 2, left: labelWidth / 2, bottom: (labelHeight + space) / 2, right: -labelWidth / 2 )
            labelInsets = UIEdgeInsets.init(top: (imageHeight + space) / 2, left: -imageWidth / 2, bottom: -(imageHeight + space) / 2, right: imageWidth / 2)
            break
        case .Left:
            imageInsets = UIEdgeInsets(top: 0, left: -space, bottom: 0, right: space)
            labelInsets = UIEdgeInsets(top: 0, left: space, bottom: 0, right: -space)
            break
        case .Bottom:
            imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: -(labelHeight + space / 2), right: -labelWidth)
            labelInsets = UIEdgeInsets(top: -(imageHeight + space / 2), left: -imageWidth, bottom: 0, right: 0)
            break
        case .Right:
            imageInsets = UIEdgeInsets(top: 0, left: labelWidth + space, bottom: 0, right: -(labelWidth + space))
            labelInsets = UIEdgeInsets(top: 0, left: -(imageWidth + space), bottom: 0, right: imageWidth + space)
            break
        }
        
        self.imageEdgeInsets = imageInsets
        self.titleEdgeInsets = labelInsets
        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341