UITableViewCell-将背景设置为渐变以删除(可滑动操作)-Swift 4.2

时间:2019-03-15 14:43:34

标签: ios swift uitableview uicontextualaction

我为UITableViewCell自定义了尾随滑动操作。它具有图像以及标题和背景色。这样做是这样的:

    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .normal, title: ActionTitle.delete) { (deleteAction, view, handler) in
        self.deleteAction(indexPath: indexPath)
        return handler(true)
    }
    deleteAction.image = Common.getImageAndTitleForTableRowAction(title: ActionTitle.delete, actionImage: #imageLiteral(resourceName: "delete"))
    deleteAction.backgroundColor = Color.orangeColor
    let editAction = UIContextualAction(style: .normal, title: ActionTitle.edit) { (editAction, view, handler) in
        self.selectedIndexPath = indexPath
        self.editLoanRecord()
        return handler(true)
    }
    editAction.image = Common.getImageAndTitleForTableRowAction(title: ActionTitle.edit, actionImage: #imageLiteral(resourceName: "edit"))
    editAction.backgroundColor = Color.blueColor
    return UISwipeActionsConfiguration(actions: [deleteAction, editAction])
}

现在我需要将backgroundColor设置为渐变。

检查了很多关于stackoverflow的问题,但无法这样做。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

在许多情况下,Apple的默认实现仅会带您进入,任何进一步的自定义都需要重新实现该功能。

这似乎是其中一种情况,因为上下文操作不是视图,因此您无法像其他视图一样修改它以添加渐变,并且其属性受到限制。

您的选择是:实现自己的滑动单元,使用第三方库(restrictions of generics)或仅使用纯色。

答案 1 :(得分:0)

您可以尝试从渐变图像创建颜色,如下所示:

func linearGradientColor(from colors: [UIColor], locations: [CGFloat], size: CGSize) -> UIColor {
    let image = UIGraphicsImageRenderer(bounds: CGRect(x: 0, y: 0, width: size.width, height: size.height)).image { context in
        let cgColors = colors.map { $0.cgColor } as CFArray
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let gradient = CGGradient(
            colorsSpace: colorSpace,
            colors: cgColors,
            locations: locations
        )!
        context.cgContext.drawLinearGradient(
            gradient,
            start: CGPoint(x: 0, y: 0),
            end: CGPoint(x: size.width, y:0),
            options:[]
        )
    }
    return UIColor(patternImage: image)
}

...

deleteAction.backgroundColor = linearGradientColor(
    from: [.red, .blue],
    locations: [0, 1],
    size: CGSize(width: 100, height: 44)
)

但是此代码有一些限制。您无法猜测操作视图的大小。因此,根据您的需要,您可以重复颜色,拉伸颜色或使用大图像。使用第三方库也是一个不错的选择。

result