使用 UILongPressGestureRecognizer 选择时在 UITableviewCell 周围绘制边框

Draw a border around a UITableviewCell when selected with UILongPressGestureRecognizer

我正在尝试在用户对单元格执行长按手势时更新 UITableViewCell 的边框,但它没有更新。

这是我的cellForRowAtIndexPath:方法

let objLongPressHandler = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressHandler(_:)))
objLongPressHandler.view?.tag = indexPath.row
objLongPressHandler.delegate = self
objLongPressHandler.enabled = true
objLongPressHandler.minimumPressDuration = 0.1

cell.contentView.addGestureRecognizer(objLongPressHandler)

这是我的函数 UILongPressGestureRecognizer 函数。

func longPressHandler(objGesture: UILongPressGestureRecognizer) {

    let center = objGesture.view?.center
    let rootViewPoint = objGesture.view!.superview?.convertPoint(center!, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(rootViewPoint!)
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath!) as! GroupTableViewCell
    cell.contentView.layer.borderColor = UIColor.redColor().CGColor
    cell.contentView.layer.borderWidth = 3
    cell.setNeedsLayout()
}
  1. 不需要多个手势识别器。在视图控制器的主视图上使用单个长按手势识别器。
  2. 处理手势时,使用 locationInView 将位置转换为 table 视图坐标。通过调用 tableView.indexPathForRowAtPoint 获取选定的行。
  3. 遍历 table 视图中的可见行。如果该行位于选定的索引路径中,则显示边框,否则移除边框。

示例:

override func viewDidLoad() {
    super.viewDidLoad()

    // Install tap gesture recogniser on main view.
    let gesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressHandler(_:)))
    gesture.enabled = true
    gesture.minimumPressDuration = 0.1

    view.addGestureRecognizer(gesture)
}

func longPressHandler(gesture: UILongPressGestureRecognizer) {

    // Get the location of the gesture relative to the table view.
    let location = gesture.locationInView(tableView)

    // Determine the row where the touch occurred.
    guard let selectedIndexPath = tableView.indexPathForRowAtPoint(location) else {
        return
    }

    // Iterate through all visible rows.
    guard let indexPaths = tableView.indexPathsForVisibleRows else {
        return
    }

    for indexPath in indexPaths {

        // Get the cell for each visible row.
        guard let cell = tableView.cellForRowAtIndexPath(indexPath) else {
            continue
        }

        // If the index path is for the selected cell, then show the highlighted border, otherwise remove the border.
        let layer = cell.contentView.layer

        if indexPath == selectedIndexPath {
            layer.borderColor = UIColor.redColor().CGColor
            layer.borderWidth = 3
        }
        else {
            layer.borderWidth = 0
        }

        cell.setNeedsLayout()
    }

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    cell.textLabel?.text = "Cell #\(indexPath.row)"
    return cell
}