with uitableviewcell tutorial multiple example different custom ios swift autolayout

ios - uitableviewcell - uitableview with multiple custom cells swift



iOS UITableViewCell desplazamiento horizontal de subvistas con diseño automático (2)

Afortunadamente, el problema era un error menor en mi ejemplo de código anterior:

constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[card2]|", options: nil, metrics: nil, views: ["card2": card2])

Está sobreescribiendo el conjunto de restricciones anterior, y debería agregarlo en su lugar:

constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-[card2]|", options: nil, metrics: nil, views: ["card2": card2])

Estoy intentando construir una vista de tabla, cuyas celdas contienen tarjetas que se desplazan horizontalmente. Creé una aplicación demo simple y he tenido éxito en la implementación de una versión que usa Diseño automático ... hasta cierto punto. Un problema (creo que es definitivo) permanece. El tamaño vertical de las tarjetas está obstruido.

TableView:

class MultiCardTableViewController: UITableViewController { override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 12 } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("CardCell", forIndexPath: indexPath) as CardCell //since these cells are re-used, we have to clear out the previous dynamic subviews for subView in cell.scrollContentView.subviews { subView.removeFromSuperview() } var card = NSBundle.mainBundle().loadNibNamed("CardView", owner: self, options: nil)[0] as CardView //Turn this off because subviews of UIScrollView use autoresizing mask by default, which conflict with Auto-Layout constraints card.setTranslatesAutoresizingMaskIntoConstraints(false) cell.scrollContentView.addSubview(card) var card2 = NSBundle.mainBundle().loadNibNamed("CardView", owner: self, options: nil)[0] as CardView //Turn this off because subviews of UIScrollView use autoresizing mask by default, which conflict with Auto-Layout constraints card2.setTranslatesAutoresizingMaskIntoConstraints(false) cell.scrollContentView.addSubview(card2) //Add bottom margin to the last cell (for consistency) //Add vertical constraints (standard margins) for each card var constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[card]|", options: nil, metrics: nil, views: ["card": card]) constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[card2]|", options: nil, metrics: nil, views: ["card2": card2]) //Add horizontal constraints that tie the cards together, and to the super view constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-[card]-(16)-[card2]-|", options: nil, metrics: nil, views: ["card": card, "card2": card2]) //Add horizontal constraint that disambiguates individual card width constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:[card(==card2)]", options: nil, metrics: nil, views: ["card": card, "card2": card2]) cell.scrollContentView.addConstraints(constraints) //Set the scrollview content horizontal size constraint to double the window width (1 window width for each card cell.contentWidthConstraint.constant = self.tableView.frame.width * 2 return cell } }

Celda:

class CardCell: UITableViewCell { @IBOutlet weak var scrollView: UIScrollView! //A content view directly inside of the scroll view, constrained to super view on all sides, as well as height & width @IBOutlet weak var scrollContentView: UIView! //A reference to the width constraint for the scrollContentView @IBOutlet weak var contentWidthConstraint: NSLayoutConstraint! }

CardView.xib:

Resultado:

El espaciado y el tamaño horizontales son correctos, pero parece que las restricciones verticales son insuficientes o incorrectas. Encuentro esto difícil de creer porque son muy simples. Cada tarjeta tiene la restricción vertical: V:|-[card]|

He intentado agregar una restricción de altura explícita en las tarjetas, similar al ancho, pero esto tampoco produce resultados correctos: V:[card(==card2)]

Resultado de la restricción de altura vertical explícita:

He estado destrozando mis cerebros durante días ... ¿Qué me estoy perdiendo?

Editar: se agregó el enlace fuente de Github para el proyecto de muestra


importar UIKit

ViewController de clase: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableviwe:UITableView? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.tableviwe = UITableView(frame: self.view!.bounds) self.tableviwe!.delegate = self self.tableviwe!.dataSource = self; self.tableviwe?.backgroundColor = UIColor.redColor() let angle:CGFloat = CGFloat(M_PI_2);//double angle; self.tableviwe?.transform = CGAffineTransformMakeRotation(angle) self.view?.addSubview(self.tableviwe!) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //UITableViewDelegate func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let alert = UIAlertView() alert.title = "Alert" alert.message = NSString(format: "%@ %d", "My hit ", indexPath.row) alert.addButtonWithTitle("Ok") alert.show() } //UITableViewDataSource func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1000 } func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{ return 200.0 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "channel") cell.textLabel?.text = NSString(format: "%@ %d", "hello my friend", indexPath.row) let angle:CGFloat = CGFloat(M_PI_2);// double angle; cell.contentView.transform = CGAffineTransformMakeRotation(-angle) return cell }