tableView:editActionsForRowAt:向右滑动?

时间:2019-09-10 05:53:04

标签: ios swift uiswipeactionsconfiguration

当我使用 tableView:editActionsForRowAt:在iOS应用程序中提供一些有用的功能时。

func tableView(_ tableView: UITableView,
               editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    print(#function)
    .... useful code .....
}

我到达了其他类似于上面的API的地步,但是向右滑动而不是像 tableView:editActionsForRowAt:那样向左滑动就可以触发。像这样说:

func tableView(_ tableView: UITableView,
               editMoreActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    print(#function)
    .... useful code .....
}

浏览网络时,我发现了UITableViewDelegate协议的以下两种方法:

tableView:leadingSwipeActionsConfigurationForRowAt
tableView:trailingSwipeActionsConfigurationForRowAt

经过一些基本的实验之后,我认为我可以使用 tableView:leadingSwipeActionsConfigurationForRowAt 来获得想要的功能,从而在向右滑动单元格时为用户提供更多功能。但是,似乎这种方法并没有提供太多的自由。例如,这里有我的代码(非常启发我在互联网上找到的一些示例):

func tableView(_ tableView: UITableView,
               leadingSwipeActionsConfigurationForRowAt 
               indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let modifyAction = UIContextualAction(style: .normal, title: nil, handler: {
        (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        print("Update action ...")
        success(true)
    })

    modifyAction.image = UIImage(named: "MyNiceIcon")!.withColor(color: .black)
    modifyAction.backgroundColor = .clear

    return UISwipeActionsConfiguration(actions: [modifyAction])
}

即使存在这些行,这里:

modifyAction.image = UIImage(named: "MyNiceIcon")!.withColor(color: .black)
modifyAction.backgroundColor = .clear

MyNiceIcon保持白色,按钮的背景为灰色。

我想念什么吗?还是可以仅使用白色的图像颜色? 而且背景色从不透明?

3 个答案:

答案 0 :(得分:0)

我希望这会对您有所帮助。您可以设置任何滑动动作的背景颜色,甚至可以在一次滑动中创建一些背景颜色。一个简单的例子就是使用这样的东西:

@available(iOS 11.0, *)
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let delete = deleteAction(at: indexPath)

    return UISwipeActionsConfiguration(actions: [delete])
}

   @available(iOS 11.0, *)
    private func deleteAction(at indexPath: IndexPath) -> UIContextualAction {
        let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, completion) in
            let confirmDeletionAC = UIAlertController(title: "Delete", message: "Are you sure you want to delete this record?", preferredStyle: .alert)
            let confirmAlertAction = UIAlertAction(title: "Delete", style: .default, handler: { (action) in
                self.deleteObject(at: indexPath)
                self.historicTableView.deleteRows(at: [indexPath], with: .automatic)
                //                print("SWIPED TO DELETE")
                completion(true)
            })
            let cancelAlertAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) in
                //                print("DELETE CANCELLED")
                completion(false)
            })
            confirmDeletionAC.addAction(cancelAlertAction)
            confirmDeletionAC.addAction(confirmAlertAction)
            self.present(confirmDeletionAC, animated: true)
        }

        action.backgroundColor = UIColor.flatWatermelon

        return action
    }

此代码来自我的一个项目,使我可以从右侧设置删除操作。如果要使动作从左侧发出,只需使用相同的函数,但使用leadingSwipeActionConfigurationForRowAt返回UISwipeActionsConfiguration,则可以使用UIContextualAction元素数组。

答案 1 :(得分:0)

要设置原始图片,您可以创建UIImage的自定义类并按如下方法覆盖方法withRenderingMode

class OriginalImageRender: UIImage {
    override func withRenderingMode(_ renderingMode: UIImage.RenderingMode) -> UIImage {
        return self
    }
}

要使用:

if let cgImageX =  UIImage(named: "MyNiceIcon")?.cgImage {
    modifyAction.image = OriginalImageRender(cgImage: cgImageX, scale: UIScreen.main.nativeScale, orientation: .up)
}

以上代码会将图片显示为原始图片,并添加到图片资源中。

答案 2 :(得分:0)

1-只需在课程末尾添加该课程

class OriginalImageRender: UIImage {
override func withRenderingMode(_ renderingMode: UIImage.RenderingMode) -> UIImage {
    return self
}

} 2-从您的UIImage创建一个cgImage

let cgImageX =  UIImage(named: "delete")?.cgImage

3-将此cgImage传递给OriginalImageRender类,并将此图像添加到您的操作中

 action.image = OriginalImageRender(cgImage: cgImageX!)

对我有用,希望对您有帮助