UISwipeActionsConfiguration/UIContextualAction 带有图标和文字以及清晰的背景

UISwipeActionsConfiguration/UIContextualAction with icon AND text AND clear background

那里有几个类似的问题(例如 ),但我认为应该有一个使用 Swift4 的 iOS 11 的最新答案,但没有使用私有 API,并且不依赖于将图标限制为 unicode 表情符号。

随着 API 的发展到 iOS11,我们现在可以放置图像和文本,但它们被迫进入模板模式并使用您设置的任何背景颜色进行反向着色。例如

let rename = UIContextualAction(style: .normal, title: "Rename") { (_, view, _) in
    self.renameEntry(indexPath)
}
rename.backgroundColor = UIColor.black
rename.image = UIImage(named: "pencilEdit")
let locate = UIContextualAction(style: .normal, title: "Locate") { (_, view, _) in
    self.locateEntry(indexPath)
}
locate.backgroundColor = UIColor.blue
locate.image = UIImage(named: "locatePin")
let delete = UIContextualAction(style: .destructive, title: "Forget") { (_, view, _) in
    self.deleteEntry(indexPath)
}
delete.backgroundColor = UIColor.red
delete.image = UIImage(named: "triggerDeleteSelector")
return UISwipeActionsConfiguration(actions: [rename, locate, delete])

产生这个:

显然,我们可以有图像或文本,但不能同时有。

但我想要的样子是

除了倒序,我不知道如何像 iOS10 那样欺骗系统。我仍然可以生成包含文本和图像的图像,但我无法控制该图像的颜色。将 backgroundColor 设置为 nil 或 .clear 只会生成空方块。

使用patternImage设置背景色,不设置标题或图片。这是一个 hacky 技巧,但它应该适合您的情况。

let rename = UIContextualAction(style: .normal, title: nil) { (_, view, _) in 
        self.renameEntry(indexPath) 
}
rename.backgroundColor = UIColor(patternImage: UIImage(named: "pencilEditWideFrame")!)

您必须像这样使用最左侧的图标保存带有宽框的图像,这样它们实际上就不会重复:

注意:我对此进行了测试,它在使用两个或多个上下文操作时有效,但不适用于一个。该模式最终会在完全滑动时重复。

这还假设您的 tableview 后面有一个纯背景,您可以将其用作图像的背景颜色,因为透明度仍然是 no-go。