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).
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).
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
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 ...)
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?
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
@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? –