2016-07-12 6 views
1

Ich versuche, UITableViewCell Grenze zu aktualisieren, wenn der Benutzer eine lange Geste auf die Zelle drückt, aber es wird nicht aktualisiert.Zeichnen Sie einen Rahmen um eine UITableviewCell, wenn mit UILongPressGestureRecognizer ausgewählt

Hier ist meine cellForRowAtIndexPath: Methode

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) 

Diese meine Funktion ist UILongPressGestureRecognizer Funktion.

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() 
} 
+0

Was ist 'objGesture'? Ist es ein Gestenerkenner? Wo wird dieser Code aufgerufen? Welche Ergebnisse erhalten Sie für jede Zeile des Codes (d. H. Welche Werte erhalten Sie für 'center',' rootViewPoint', 'indexPath' und' cell') –

+0

Ich bekomme mit diesem Code den rechten Indexpfad. Und ich rufe Code in cellforIRowatIndexPath –

+0

Wenn ich richtig verstehe - Sie möchten die Zelle Grenze ändern, wenn der Benutzer einen langen Druck auf die Zelle. Nur die Zelle, die lange gedrückt hat, sollte sich ändern. Ist das richtig? –

Antwort

2
  1. Multiple Geste recognisers sind nicht erforderlich. Verwenden Sie in der Hauptansicht für den Ansichtscontroller einen langen Erkennungsbefehl für lange Tippgeste.
  2. Wenn Sie die Geste bearbeiten, konvertieren Sie den Standort in Koordinaten für die Tabellenansicht unter Verwendung von locationInView. Rufen Sie die ausgewählte Zeile auf, indem Sie tableView.indexPathForRowAtPoint aufrufen.
  3. Schleife durch die sichtbaren Zeilen in der Tabellenansicht. Wenn sich die Zeile am ausgewählten Indexpfad befindet, zeigen Sie den Rahmen an, andernfalls entfernen Sie den Rahmen.

Beispiel:

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 
} 

enter image description here

+0

aber ich muss nur Rahmen zu ausgewählten Objekten setzen. –

+0

Bitte fügen Sie Ihrer Frage weitere Details hinzu, um zu beschreiben, was Sie erreichen möchten. Könnten Sie genauer sein? Ich denke du hast irgendwo einen Gestenerkenner, ist das richtig? Versuchen Sie, etwas über die Tabellenansicht zu ziehen? Oder möchten Sie nur einen Rahmen um die Zellen, auf die der Benutzer geklopft hat? –

+0

Ich habe meine Frage bearbeitet. Und ich versuche nur die Grenze des ausgewählten Objekts zu ändern. Aber ich brauche die Änderung in longpresshandler.So zuerst bekomme ich Zelle und indexpath mit Mittelpunkt und versuchen, bordercolor ändern, aber das ändert sich nicht. –