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

时间:2016-07-12 21:57:49

标签: ios swift uitableview uigesturerecognizer

当用户在单元格上执行长按手势时,我正在尝试更新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 个答案:

答案 0 :(得分:2)

  1. 不需要多个手势识别器。在视图控制器的主视图上使用单个长按手势识别器。
  2. 处理手势时,使用tableView.indexPathForRowAtPoint将位置转换为表格视图坐标。通过调用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 } 获取所选行。
  3. 遍历表格视图中的可见行。如果行位于选定的索引路径,则显示边框,否则删除边框。
  4. 示例:

    .myClass table td:nth-child(2){
        background-color:red;
    }
    

    enter image description here