2016-07-21 14 views
5

Hallo allerseits. Ich fing an, Programmierung vor 1 Monat zu lernen, also bitte nett sein, wenn ich mein Problem nicht gut erkläre :)Swift: Erweitern Sie UITableViewCell Höhe in Abhängigkeit von der Größe der UICollectionView darin

Mein Projekt besteht aus einem Haupt UITableView. In jeder Zelle der UITableView habe ich eine UICollectionView (beim horizontalen Scrollen).

Img 1 : Main view

Die Breite jedes UICollectionViewCell ist die gleiche wie die gesamte UITableViewCell. Mein erstes Problem ist über Größe der Höhe der UITableViewCell (die von der Größe der UICollectionView selbst und der Größe des Inhalts darüber abhängen wird).

Img 2 : CollectionView

hat diese automatisch durchgeführt werden. In der Tat, die UICollectionViewCell s wird nicht die gleiche Höhe haben, so wenn der Benutzer die UICollectionView horizontal scrollen wird, wird eine neue UICollectionViewCell erscheinen (mit unterschiedlicher Höhe) und die Höhe der UITableViewCell wird anpassen müssen.

Das zweite Problem, das ich habe, ist über die Größe UICollectionViewCell, in der Tat werde ich nicht im Voraus wissen, wie hoch die Höhe sein wird (die Breite ist die gleiche wie die UITableView). Ich sollte den Inhalt von einer Feder importieren.

So, hier ist jetzt meine Viewcontroller-Datei,

die Variablen:

@IBOutlet weak var tableView: UITableView! 
var storedOffsets = [Int: CGFloat]() 

die UITableView Erweiterung: die Zelle des UITableView Erstellen und Einrichten Delegierter UICollectionView Inneren

extension IndexVC: UITableViewDelegate, UITableViewDataSource { 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 6 //Temp 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCellWithIdentifier("CellCollectionView") as? CellPost { 
     let post = self.posts[indexPath.row] 
     cell.configureCell(post) 

     return cell 
    } else { 
     return CellPost() 
    } 

} 

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    guard let tableViewCell = cell as? CellPost else { return } 

    tableViewCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row) 
    tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
} 

func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    guard let tableViewCell = cell as? CellPost else { return } 

    storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
} 

der Teil der UICollectionView: Fügen Sie die Ansicht von einer Nib/Xib zur Zelle

hinzu
extension IndexVC: UICollectionViewDelegate, UICollectionViewDataSource { 
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 9 //Temp 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellInCollectionView", forIndexPath: indexPath) 

    if let textPostView = NSBundle.mainBundle().loadNibNamed("textPostView", owner: self, options: nil).first as? textPostView { 
     textPostView.configurePost(post.descriptionLbl) 
     cell.addSubview(textPostView) 
     textPostView.translatesAutoresizingMaskIntoConstraints = false 
     cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":textPostView])) 
     cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":textPostView])) 

    } 

    return cell 
} 

Machen Sie die Größe der Zelle das gleiche wie die gesamten UICollectionView

extension IndexVC: UICollectionViewDelegateFlowLayout { 
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    return CGSizeMake(collectionView.frame.width, collectionView.frame.height) 
} 

Und Ich habe diese Erweiterung in der Klasse für die UITableViewCell (nicht nützlich für das Problem gewidmet, aber wenn einer von euch will In den neu erstellen)

extension CellPost { 
func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>>(dataSourceDelegate: D, forRow row: Int) { 

    collectionView.delegate = dataSourceDelegate 
    collectionView.dataSource = dataSourceDelegate 
    collectionView.tag = row 
    collectionView.setContentOffset(collectionView.contentOffset, animated:false) // Stops collection view if it was scrolling. 
    collectionView.reloadData() 
} 

var collectionViewOffset: CGFloat { 
    set { 
     collectionView.contentOffset.x = newValue 
    } 

    get { 
     return collectionView.contentOffset.x 
    } 
} 

Wenn jemand diesen Code verwenden möchten, es funktioniert großartig, aber ich habe die Höhe des UITableView mit einem tableView(... heightForRowAtIndexPath ...)

012 codieren

Ich habe alles versucht, um die UITableViewCell anzupassen, was drin ist (Ich habe versucht, die Größe des Inhalts von der Nib gesendet, die ich in die Zelle setzen, und dann senden Sie es an tableView(... heightForRowAtIndexPath ...) , aber ich kann es nicht funktionieren . Ich habe auch Auto Layouts versucht, aber vielleicht mache ich es falsch. Ich denke auch, dass das Problem von dem Teil kommen könnte, dass ich die Feder in meine Zelle importiere.

Ich habe auch keine Ahnung von einer Möglichkeit, die Zelle zu erweitern, nachdem der Benutzer die UICollectionViewCell geklaut hat, gibt es eine Möglichkeit, ein Ereignis zu erstellen, wenn das passiert? Und vielleicht wieder tableView(... heightForRowAtIndexPath ...) anrufen?

+0

benutzen es selten auf diese Weise, wenn Sie sich entscheiden, UICollectionView zu verwenden, in den meisten Fällen gibt es keine Notwendigkeit UITableView zu verwenden, um es zu enthalten, denke ich. – childrenOurFuture

+0

@Jean Baptiste, Hat die angenommene Antwort dein Problem gelöst? Ich mache genau das Gleiche wie Ihr Code, aber wenn ich UITableViewAutomaticDimension verwende, wird meine Collection-Ansicht überhaupt nicht gebunden. Könntest du mir bitte einen Hinweis geben? –

Antwort

1

Wie ich verstehe, müssen Sie die Tabellenansicht Zelle Höhe automatisch anpassen. So können Sie das automatische Layout zum Einstellen der Zellenhöhe verwenden.

schreiben in ViewDidLoad

self.tableView.estimatedRowHeight = 80 
self.tableView.rowHeight = UITableViewAutomaticDimension 

Bevor in der Zelle zurückkehrend CellForRowAtIndexPath

self.tableView.setNeedsLayout() 
self.tableView.layoutIfNeeded() 

Sie Link für automatische Layout finden. enter link description here

+1

Dies funktioniert nicht. Nicht sicher, warum es akzeptiert wird. –

0

Um mein Problem zu lösen, habe ich eine Reihe, die Höhe der UITableView jede Zelle zu speichern (mit dem Namen cellHeight).

Ich berechne auch die Höhe jeder Zelle am Anfang des Programms in einem Array bestehend aus Array (mit dem Namen cellHeightForPost). Die Hauptarray repräsentieren alle TableView cells, jedes Array innerhalb es die Höhe jeder Zelle des

Um update ‚Collection‘ repräsentieren die Tabellenansicht jedes Mal wenn ich die Collection Inneren verändern, i verwendet, um die fonction collectionView(... willDiplayCell...):

self.tableView.beginUpdates() 
cellHeight[collectionView.tag] = cellHeightForPost[collectionView.tag][indexPath.row] 
self.tableView.setNeedsLayout() 
self.tableView.layoutIfNeeded() 
self.tableView.endUpdates() 

Meine UITableView Größe ist definiert in tableView(... heightForRowAtIndexPath) und tableView(... estimatedHeightForRowAtIndexPath):

return cellHeight[indexPath.row] 

So stellen Sie die Größe des collectionViewCells:

return CGSize(width: collectionView.frame.width, height: cellHeightForPost[collectionView.tag][indexPath.row])