web-dev-qa-db-fra.com

Développer et réduire les cellules de la table

Je peux développer et réduire des cellules, mais je souhaite appeler des fonctions (développer et réduire) dans UITableViewCell pour changer le titre du bouton.

 Iphone 5

 import UIKit 

 class MyTicketsTableViewController: UITableViewController {

 var selectedIndexPath: NSIndexPath? 
 var extraHeight: CGFloat = 100 

 redéfinit func viewDidLoad () {
 super.viewDidLoad () 
 } 

 écrasez func didReceiveMemoryWarning () {
 super.didReceiveMemoryWarning () 
 // Élimine toutes les ressources pouvant être recréées .
 } 

 redéfinit func tableView (tableView: UITableView, section numberOfRowsInSection: Int) -> Int {
 retourne 5 
 } 

 redéfinit func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
 let cell = tableView.dequeueReusableCellWithIdentifier ("cellule", pourIndexPath: indexPath) en tant que! MyTicketsTableViewCell 
 cellule de retour 
 } 

 redéfinit func tableView (tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
 if (selectedIndexPath! = nil && indexPath.compare (selectedIndexPath!) == NSComparisonResult.OrderedSame) {
 retourne 230 + extraHeight 
 } 

 retourne 230,0 
 } 

 redéfinit func tableView (tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 if (selectedIndexPath == indexPath) {
 selectedIndexPath = nil 
 } autre {
 selectedIndexPath = indexPath 
 } 

 tableView.beginUpdates () 
 tableView.endUpdates () 
 } 
} 

 import UIKit 

 class MyTicketsTableViewCell: UITableViewCell {

 @IBOutlet faible var expandButton: ExpandButton! 
 @IBOutlet faible var detailsHeightConstraint: NSLayoutConstraint! .________. var defaultHeight: CGFloat! .________. remplacez func awakeFromNib () {
 super.awakeFromNib () 

 defaultHeight = detailsHeightConstraint.constant 

 expandButton.button.setTitle ("TAP FOR DETAILS", pourState: .Normal) 
 detailsHeightConstraint.constant = 30 
 } 

 func expand () {
 UIView.animateWithDuration (0.3, délai: 0.0, options: .CurveLinear, animations: {
 Self.expandButton.arrowImage.transform = CGAffineTransformMakeRotation (CGFloat (M_PI * 0.99)) 
 Self.detailsHeightCestrainton. 
 self.layoutIfNeeded () 

}, complétion: {terminé en 
 self.expandButton.button.setTitle ("CLOSE", pourState: .Normal) 
}) 
 } 

 func collapse () {
 UIView.animateWithDuration (0.3, délai: 0.0, options: .CurveLinear, animations: {
 Self.expandButton.arrowImage.transform = CGAffineTransformMakeRotation (CGFloat (M_PI * 0.0)) 
 Self.detailsHeightCestraint.constant =. ) 
 self.layoutIfNeeded () 

}, complétion: {terminé en 
 self.expandButton.button.setTitle ("TAP FOR DETAILS", pourState: .Normal) 
})
 } 

} 

16
Ahmet A.

Si vous voulez que la cellule grossisse physiquement, alors où vous avez votre magasin IndexPath, dans heightForRow:, utilisez:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if selectedIndexPath == indexPath {
      return 230 + extraHeight
    }
    return 230.0
}

Ensuite, lorsque vous souhaitez en développer un dans le didSelectRow:

selectedIndexPath = indexPath
tableView.beginUpdates
tableView.endUpdates

Modifier

Cela rendra les cellules plus animées elles-mêmes plus grandes, vous n’aurez pas besoin des blocs d’animation supplémentaires dans la cellule.

Modifier 2  

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if(selectedIndexPath == indexPath) {
          selectedIndexPath = nil

          if let cell = tableView.cellForRowAtIndexPath(indexPath) as? MyTicketsTableViewCell {
            cell.collapse()
          }
          if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow:indexPath.row+1, section: indexPath.section) as? MyTicketsTableViewCell {
            cell.collapse()
          }
        } else {
          selectedIndexPath = indexPath

          if let cell = tableView.cellForRowAtIndexPath(indexPath) as? MyTicketsTableViewCell {
              cell.expand()
          }

          if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow:indexPath.row+1, section: indexPath.section) as? MyTicketsTableViewCell {
             cell.expand()
          }
        }

        tableView.beginUpdates()
        tableView.endUpdates()
    }
20
SeanLintern88

Tout ce dont vous avez besoin est d’implémenter UITableView Delegate de la manière suivante:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

Par défaut, EstimatedHeight est CGRectZero. Lorsque vous définissez une valeur, elle active le redimensionnement automatique (la même situation avec UICollectionView). Vous pouvez également le faire de la manière suivante:

tableView?.estimatedRowHeight = CGSizeMake(50.f, 50.f); 

Ensuite, vous devez configurer vos contraintes dans votre cellule.

Consultez ce message: https://www.hackingwithswift.com/read/32/2/automatically-resizing-uitableviewcells-with-dynamic-type-and-ns

J'espère que ça aide)

2
Alex Kosyakov

Dans la classe MyTicketsTableViewController, dans la méthode sourcecellForRowAtIndexPath, ajoutez la cible pour le bouton.

cell.expandButton.addTarget(self, action: "expandorcollapsed:", forControlEvents: UIControlEvents.TouchUpInside)
0
Jeyamahesan