Ви можете використовувати UITableViewRowAction
's backgroundColor
для встановлення власного зображення або перегляду. Фокус у використанні UIColor(patternImage:)
.
В основному ширина UITableViewRowAction
області визначається її заголовком, тому ви можете знайти точну довжину заголовка (або пробіли) і встановити точний розмір зображення за допомогою patternImage
.
Для реалізації цього я зробив 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!
}
і зробити рядок із пробілами та точною довжиною,
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
}
і тепер ви можете творити 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]
}
Результат буде виглядати так.
Інший спосіб зробити це - імпортувати спеціальний шрифт, який містить зображення, яке ви хочете використовувати як шрифт та використовувати UIButton.appearance
. Однак це вплине на інші кнопки, якщо ви вручну не встановите шрифт іншої кнопки.
З iOS 11 він покаже це повідомлення [TableView] Setting a pattern color as backgroundColor of UITableViewRowAction is no longer supported.
. На даний момент він все ще працює, але не буде працювати в майбутньому оновленні.
==============================================
Для iOS 11+ ви можете використовувати:
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])
}