Change UITableView delete image swit

2019-09-15 08:25发布

I need to change UITableView Cell's "-" button color and delete button(which is showing after "-" button pressed) image. I have tried this answer uitableview delete button image in iOS but it doesn't work in UITableView edit mode. Please, help.

2条回答
仙女界的扛把子
2楼-- · 2019-09-15 09:02

We can do this in further steps:

1.) First, add a UIView extension

extension UIView {
    func image() -> UIImage {
       UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
       guard let context = UIGraphicsGetCurrentContext() else {
        return UIImage()
       }
       layer.render(in: context)
       let image = UIGraphicsGetImageFromCurrentImageContext()
       UIGraphicsEndImageContext()
       return image!
   }

}

2.) second add these below delegates method of UITableView.

    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        return .delete
}

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let kCellActionWidth = CGFloat(70.0)// The width you want of delete button
    let kCellHeight = tableView.frame.size.height // The height you want of delete button
    let whitespace = whitespaceString(width: kCellActionWidth) // add the padding 


    let deleteAction = UITableViewRowAction(style: .`default`, title: whitespace) {_,_ in
        // do whatever the action you want
    }

    // create a color from patter image and set the color as a background color of action
    let view = UIView(frame: CGRect(x: tableView.frame.size.width-70, y: 0, width: 70, height: kCellHeight))
    view.backgroundColor = UIColor(red: 219.0/255.0, green: 71.0/255.0, blue: 95.0/255.0, alpha: 1.0) // background color of view
    let imageView = UIImageView(frame: CGRect(x: 15,
                                              y: 20,
                                              width: 40,
                                              height: 40))
    imageView.image = UIImage(named: "xyz")! // required image
    view.addSubview(imageView)
    let image = view.image()

    deleteAction.backgroundColor = UIColor.init(patternImage: image)
    return [deleteAction]

}

fileprivate func whitespaceString(font: UIFont = UIFont.systemFont(ofSize: 15), width: CGFloat) -> String {
    let kPadding: CGFloat = 20
    let mutable = NSMutableString(string: "")
    let attribute = [NSFontAttributeName: font]
    while mutable.size(attributes: attribute).width < width - (2 * kPadding) {
        mutable.append(" ")
    }
    return mutable as String
}
查看更多
Melony?
3楼-- · 2019-09-15 09:05

Override this function in your custom cell

override func didTransition(to state: UITableViewCellStateMask) {
    super.willTransition(to: state)

    if state == .showingDeleteConfirmationMask {
        for subview: UIView in subviews {
            if NSStringFromClass(type(of: subview)) == "UITableViewCellDeleteConfirmationView" {
                let deleteBtn = UIImageView(frame: CGRect(x: 0, y: 0, width: 84, height: 43))
                deleteBtn.backgroundColor = .red
                deleteBtn.contentMode = .scaleAspectFit

                deleteBtn.image = UIImage(named: "delete.png")
                subview.subviews[0].addSubview(deleteBtn)
            }
        }
    }
}

Hope this help. enter image description here

查看更多
登录 后发表回答