Sie können mit UITableViewRowAction
‚s backgroundColor
zu Satz benutzerdefinierten Bild oder Sicht. Der Trick ist mit UIColor(patternImage:)
.
Grundsätzlich wird die Breite des UITableViewRowAction
Bereichs durch den Titel bestimmt, sodass Sie eine genaue Länge des Titels (oder Leerzeichens) finden und die genaue Größe des Bildes mit festlegen können patternImage
.
Um dies zu implementieren, habe ich eine UIView
Erweiterungsmethode erstellt.
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!
}
und um eine Zeichenfolge mit Leerzeichen und exakter Länge zu erstellen,
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
}
und jetzt können Sie erstellen UITableViewRowAction
.
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let whitespace = whitespaceString(width: kCellActionWidth)
let deleteAction = UITableViewRowAction(style: .`default`, title: whitespace) { (action, indexPath) in
}
let kActionImageSize: CGFloat = 34
let view = UIView(frame: CGRect(x: 0, y: 0, width: kCellActionWidth, height: kCellHeight))
view.backgroundColor = UIColor.white
let imageView = UIImageView(frame: CGRect(x: (kCellActionWidth - kActionImageSize) / 2,
y: (kCellHeight - kActionImageSize) / 2,
width: 34,
height: 34))
imageView.image = UIImage(named: "x")
view.addSubview(imageView)
let image = view.image()
deleteAction.backgroundColor = UIColor(patternImage: image)
return [deleteAction]
}
Das Ergebnis wird so aussehen.
Eine andere Möglichkeit, dies zu tun, besteht darin, eine benutzerdefinierte Schriftart zu importieren, die das Bild enthält, das Sie als Schriftart verwenden und verwenden möchten UIButton.appearance
. Dies wirkt sich jedoch auf andere Schaltflächen aus, sofern Sie die Schriftart anderer Schaltflächen nicht manuell festlegen.
Ab iOS 11 wird diese Meldung angezeigt [TableView] Setting a pattern color as backgroundColor of UITableViewRowAction is no longer supported.
. Derzeit funktioniert es noch, aber es würde im zukünftigen Update nicht funktionieren.
==========================================
Für iOS 11+ können Sie Folgendes verwenden:
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let deleteAction = UIContextualAction(style: .normal, title: "Delete") { (action, view, completion) in
completion(true)
}
let muteAction = UIContextualAction(style: .normal, title: "Mute") { (action, view, completion) in
completion(true)
}
deleteAction.image = UIImage(named: "icon.png")
deleteAction.backgroundColor = UIColor.red
return UISwipeActionsConfiguration(actions: [deleteAction, muteAction])
}