2016-03-23 17 views
0

Ich habe herum gespielt versuchen, Inhalte meiner Tableviewcell zu animieren, wenn es ausgewählt ist, aber ich habe Probleme. Ich hatte einige Orte gelesen, an denen man innerhalb von didSelectRowAtIndexPath keine Animation ausführen kann, oder zumindest animiert es sie nicht. Es scheint der Fall zu sein mit dem Code, den ich unten habe, die Ansicht bewegt sich, aber nicht animiert.Swift - Animieren, wenn TableView-Zelle ausgewählt (didSelectRowAtIndexPath)

Ich habe versucht, Logik in WillDisplayCell zu integrieren, um für die Auswahl aber vergeblich zu überwachen, und so würde ich es lieben, wenn jemand in der Lage ist, die richtige Lösung für mich zu finden, weil die Antwort scheinbar nicht verfügbar ist, trotz viel Suche:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath) 
    let cell = tableView.dequeueReusableCellWithIdentifier(currentCellDescriptor["cellIdentifier"] as! String, forIndexPath: indexPath) as! CustomCell 
    let indexOfTappedRow = visibleRowsPerSection[indexPath.section][indexPath.row] 
    if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpandable"] as! Bool == true { 
     if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == false { 


      // INTERESTING BIT: Animates cell contents to Right 
      if currentCellDescriptor["cellIdentifier"] as! String == "CellHeader" { 
       UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 12, options: .CurveLinear, animations: { 
        cell.headerTitleLeftConstraint.priority = 999 
        cell.headerTitleRightConstraint.priority = 1 
        cell.layoutIfNeeded() 
        }, completion: nil) 
      } 

     } else if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == true { 
      // MARK: Animates cell contents back to left 
      if currentCellDescriptor["cellIdentifier"] as! String == "CellHeader" { 
       UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 12, options: .CurveLinear, animations: { 
        cell.headerTitleLeftConstraint.priority = 1 
        cell.headerTitleRightConstraint.priority = 999 
        cell.layoutIfNeeded() 
        }, completion: nil) 
        } 
      } 
+0

Warum bist du ‚lassen cell = tableView.dequeueReusableCellWithIdentifier (currentCellDescriptor [ "cellIdentifier"] als String, forIndexPath: indexPath!) Mit wie! CustomCell 'in' didSelectRowAtIndexPath '? – MrDank

+0

Herr Vader, es ist, weil ich einen Plist habe, der alle meine Zelldaten enthält. Es ist viel einfacher, weil ich mehrere kollabierbare Ebenen von Zellen habe. –

Antwort

1

Erstens, verwenden Sie nicht dequeueReusableCellWithIdentifier hier. Es verwendet eine Zelle, die auf dem Bildschirm nicht sichtbar ist, und bereitet sie vor, es zu zeigen. Was Sie wollen, ist cellForRowAtIndexPath, die eine Zelle bereits auf dem Bildschirm bei der angegebenen indexPath zurückgibt.

Dann verstehe ich, dass Sie mit 2 Constraint spielen und die Layoutänderungen animieren möchten. Um dies zu tun, sollte die Animation nur enthalten layoutIfNeeded:

cell.headerTitleLeftConstraint.priority = 999 
cell.headerTitleRightConstraint.priority = 1 
UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 12, options: .CurveLinear, animations: { 
       cell.layoutIfNeeded() 
       }, completion: nil) 

Ich würde auch beraten Sie diese Logik von der Steuerung an Ihre CustomCell Klasse zu übertragen. Verwenden Sie beispielsweise das Attribut selected und setSelected(animated: Bool), um die Statusänderung visuell zu behandeln.

0

Mit Tanguy's Hilfe, so suchen wir. Ich habe immer noch einige Animationsprobleme, weil die Tabelle selbst nicht die nächste darunter liegende Zellenebene animiert, aber ich werde diesen Code verbessern und ihn zum Laufen bringen. Denken Sie, dass dies jetzt für den Zweck geeignet ist, also lohnt es sich zu veröffentlichen, um die Lösung selbst zu zeigen. Vielen Dank!!

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
     // Adjusts constraints everytime switch is tapped 
     isLeftAligned = !isLeftAligned 
      if userHanded == "Right" { 
      UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 12, options: .CurveLinear, animations: { 
       self.leftHandedHeaderConstraint.priority = (self.isLeftAligned) ? 1 : 999 
       self.rightHandedHeaderConstraint.priority = (self.isLeftAligned) ? 999 : 1 
       self.layoutIfNeeded() 
      }, completion: nil) 

     } else if userHanded == "Left" { 
      UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 12, options: .CurveLinear, animations: { 
       self.leftHandedHeaderConstraint.priority = (self.isLeftAligned) ? 999 : 1 
       self.rightHandedHeaderConstraint.priority = (self.isLeftAligned) ? 1 : 999 
       self.layoutIfNeeded() 
       }, completion: nil) 
     } 
} 
+0

P.S. Hinweis für andere, sicherzustellen, dass die tableView auf MultipleSelection festgelegt wird, damit nicht alle Zellen des gleichen Typs animieren :) –

Verwandte Themen