2016-03-23 18 views
0

Seçili olduğunda tableviewcell'in içeriğini canlandırmaya çalışıyorum ama sorun yaşıyorum. DidSelectRowAtIndexPath içinde animatewithduration'ı çalıştıramayacağınız bazı yerleri okudum ya da en azından sizin yaptığınız gibi hareket etmiyor. Aşağıda sahip olduğum kodda durum böyle görünüyor, görünüm hareket ediyor ama animasyon vermiyor.Swift - TableView Hücresi Seçildiğinde Animasyon Yapılıyor (didSelectRowAtIndexPath)

Seçimi izlemek için hiçbir şey yapmamak için willDisplayCell'e mantığı dahil etmeyi denedim ve birileri bana uygun çözümü bulabiliyorsa sevinirim. arama:

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

Neden izin' kullandıkları cep = tableView.dequeueReusableCellWithIdentifier (currentCellDescriptor [ "cellIdentifier"] dize, forIndexPath olarak: indexPath!) Olarak! CustomCell 'didSelectRowAtIndexPath' içinde? – MrDank

+0

Bay Vader, çünkü tüm hücre verilerimi içeren bir plistim var. Bu şekilde çok daha kolay, çünkü birden çok çökebilir hücre seviyesine sahibim. –

cevap

1

İlk olarak, dequeueReusableCellWithIdentifier'u kullanmayın. Ekranda görünmeyen bir hücreyi kullanacak ve göstermeye hazırlanacaktır. İstediğiniz cellForRowAtIndexPath, verilen indexPath numaralı ekranda bir hücreyi döndürür.

Daha sonra 2 kısıtlama ile oynamak ve düzen değişikliklerini canlandırmak istediğinizi anlıyorum. Bunu yapmak için, animasyon sadece layoutIfNeeded içermelidir:

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) 

Ben de senin CustomCell sınıfa denetleyicisinden bu mantığı aktarmak almanızı öneriyoruz. Örneğin, durum değişikliğini görsel olarak ele almak için selected özniteliğini ve setSelected(animated: Bool) kullanın.

0

Tanguy'nin yardımı ile, bu nasıl görünüyoruz. Hala bazı animasyon sorunları yaşıyorum çünkü tablonun kendisi aslında bir sonraki hücreler seviyesini canlandırmayacak, ancak bu kodu geliştirip çalışacağım. Bunun şimdi amaç için uygun olduğunu düşünün, bu yüzden çözümün kendisini göstermek için gönderme yapmaya değer. Teşekkürler!!

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. Diğerleri için, aynı türdeki tüm hücrelerin hareket etmemesi için tableView'u MultipleSelection olarak ayarladığınızdan emin olun :) –

İlgili konular