如何自定义UITableView中单元格重排汉堡手柄的颜色及样式?
自定义UITableView重排手柄的实用方案
方法一:修改默认手柄的颜色与尺寸(轻量方案)
默认重排手柄是系统私有视图,但可以通过遍历单元格子视图找到它,直接调整样式:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) // 其他单元格配置逻辑... // 延迟执行,确保重排控件已加载完成 DispatchQueue.main.async { self.tweakReorderControl(for: cell) } return cell } private func tweakReorderControl(for cell: UITableViewCell) { for subview in cell.subviews { if subview.description.contains("UITableViewCellReorderControl") { for iconView in subview.subviews { if let imageView = iconView as? UIImageView { // 修改手柄颜色 imageView.tintColor = .darkGray // 调整手柄尺寸 imageView.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) break } } break } } }
注意:该方案依赖系统私有视图的命名规则,当前iOS版本可用,但未来系统更新可能失效,适合快速临时解决问题。
方法二:完全自定义重排手柄(稳定方案)
如果担心系统API变动,直接隐藏默认手柄,自定义拖拽按钮并通过拖拽代理实现重排:
1. 隐藏默认重排手柄
class CustomCell: UITableViewCell { override func setEditing(_ editing: Bool, animated: Bool) { super.setEditing(editing, animated: animated) // 遍历找到默认重排控件并隐藏 for subview in self.subviews { if subview.description.contains("UITableViewCellReorderControl") { subview.isHidden = true break } } } }
2. 给单元格添加自定义拖拽按钮
class CustomCell: UITableViewCell { let dragHandle = UIButton(type: .custom) override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupDragHandle() } required init?(coder: NSCoder) { super.init(coder: coder) setupDragHandle() } private func setupDragHandle() { // 使用自定义图标,可自由设置颜色、大小 let handleImage = UIImage(systemName: "line.3.horizontal")?.withTintColor(.blue, renderingMode: .alwaysOriginal) dragHandle.setImage(handleImage, for: .normal) dragHandle.frame = CGRect(x: bounds.width - 60, y: 0, width: 44, height: bounds.height) dragHandle.isUserInteractionEnabled = false // 由系统拖拽逻辑处理交互 addSubview(dragHandle) } override func layoutSubviews() { super.layoutSubviews() dragHandle.frame = CGRect(x: bounds.width - 60, y: 0, width: 44, height: bounds.height) } }
3. 实现拖拽重排代理逻辑
extension YourViewController: UITableViewDragDelegate { func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let item = UIDragItem(itemProvider: NSItemProvider(object: indexPath.row as NSNumber)) item.localObject = indexPath return [item] } } extension YourViewController: UITableViewDropDelegate { func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) { guard let destIndexPath = coordinator.destinationIndexPath, let sourceIndexPath = coordinator.items.first?.dragItem.localObject as? IndexPath else { return } // 调整数据源顺序 let movedItem = yourDataSource[sourceIndexPath.row] yourDataSource.remove(at: sourceIndexPath.row) yourDataSource.insert(movedItem, at: destIndexPath.row) // 更新表格UI tableView.moveRow(at: sourceIndexPath, to: destIndexPath) } func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal { return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath) } }
这种方案完全脱离系统默认控件,样式、尺寸可自由定制,且不受系统版本限制。
方法三:通过tintColor快速改色
如果仅需调整颜色,直接设置单元格的tintColor即可,默认重排手柄会继承这个颜色:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.tintColor = .orange // 重排手柄会变为橙色 // 其他配置 return cell }
注意:该方法会影响单元格内所有使用
tintColor的控件(如accessoryView),需单独调整这些控件的颜色。
内容的提问来源于stack exchange,提问作者Belal Hmeidat
相关产品推荐
相关产品推荐

