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.
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) }) } }
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()
}
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)
Dans la classe MyTicketsTableViewController
, dans la méthode sourcecellForRowAtIndexPath
, ajoutez la cible pour le bouton.
cell.expandButton.addTarget(self, action: "expandorcollapsed:", forControlEvents: UIControlEvents.TouchUpInside)