如何在不使用第三方框架的情况下为UIContextualAction设置圆角?
如何在不使用第三方框架的情况下为UIContextualAction设置圆角?
嘿,我之前也碰到过这个问题——UIContextualAction确实没有直接暴露设置圆角的API,但不用第三方框架也能搞定!给你两个可行的方案,其中第一个是完全合规、无审核风险的推荐方案:
方案1:生成带圆角的纯色背景图(推荐)
思路是先创建一张带有圆角的纯色图片,再把它设置为UIContextualAction的背景色(通过UIColor(patternImage:)实现),以此模拟圆角效果。
首先写一个生成带圆角图片的工具函数:
func generateRoundedCornerImage(color: UIColor, size: CGSize, cornerRadius: CGFloat) -> UIImage? { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) defer { UIGraphicsEndImageContext() } let roundedPath = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius) color.setFill() roundedPath.fill() return UIGraphicsGetImageFromCurrentImageContext() }
接着修改你原有的代码,用这张带圆角的图片替换原来的纯色背景:
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let deleteAction = UIContextualAction(style: .destructive, title: nil) { [weak self] (_, _, completionHandler) in self?.handleDeleteAction(at: indexPath) completionHandler(true) } // 生成带圆角的背景图,圆角半径可按需调整,尺寸匹配单元格高度与操作按钮宽度 let actionSize = CGSize(width: 60, height: tableView.rowHeight) if let roundedBgImage = generateRoundedCornerImage(color: DynamicColor.red.getColor(), size: actionSize, cornerRadius: 8) { deleteAction.backgroundColor = UIColor(patternImage: roundedBgImage) } if #available(iOS 13.0, *) { let deleteActionImage = UIImage(systemName: Constants.Image.deleteSystemIcon)?.withTintColor(.white, renderingMode: .alwaysOriginal) deleteAction.image = deleteActionImage } let configuration = UISwipeActionsConfiguration(actions: [deleteAction]) return configuration }
这里的actionSize可以根据需求调整,按钮宽度一般设为60左右就合适,高度直接用单元格高度能保证适配不同的行高设置。
方案2:利用KVC访问内部视图(不推荐)
如果你想直接操作UIContextualAction的内部控件,可以尝试用KVC设置私有属性,但这种方法依赖系统私有API,可能在iOS版本更新后失效,甚至有App Store审核被拒的风险,谨慎使用:
// 在创建deleteAction后添加这段代码 deleteAction.setValue(8, forKey: "_cornerRadius")
这种方法在部分iOS版本中可能不生效,所以优先推荐方案1。
备注:内容来源于stack exchange,提问作者Айдос Куатбек
相关产品推荐
相关产品推荐

