大家好。我在一个月前开始学习编程,所以如果我不能很好地解释我的问题,请保持良好状态:)
我的项目由主UITableView
组成。在UITableView
的每个单元格中,我有一个UICollectionView
(在水平滚动上)。
每个UICollectionViewCell
的宽度与整个UITableViewCell
相同。我的第一个问题是调整UITableViewCell
的高度(这取决于UICollectionView
本身的大小以及内容的大小)。
这必须自动完成。事实上,UICollectionViewCell
的不会有相同的高度,因此当用户水平滚动UICollectionView
时,会出现一个新的UICollectionViewCell
(不同的高度)和UITableViewCell
的高度必须适应。
我遇到的第二个问题是调整UICollectionViewCell
的大小,事实上我事先并不知道它的高度是什么(宽度与UITableView
相同)。我应该从笔尖导入内容。
所以现在这是我的ViewController文件,
变量:
@IBOutlet weak var tableView: UITableView!
var storedOffsets = [Int: CGFloat]()
UITableView
扩展程序:创建UITableView
的单元格并在其中设置UICollectionView
的委托
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
}
UICollectionView
的一部分:将视图从Nib / xib添加到单元格
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
}
使单元格的大小与整个UICollectionView
extension IndexVC: UICollectionViewDelegateFlowLayout {
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSizeMake(collectionView.frame.width, collectionView.frame.height)
}
我在专用于UITableViewCell
的类中创建了此扩展(对问题没用,但是如果有人想要重新创建它)
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
}
}
如果有人想要使用此代码,那么效果很好,但我必须使用UITableView
tableView( ... heightForRowAtIndexPath ...)
的高度进行硬编码
我尝试了一切让UITableViewCell
适应其中的内容(我尝试计算笔尖发送到内容中的内容的大小,然后将其发送到tableView( ... heightForRowAtIndexPath ...)
但我不能让它发挥作用。我也尝试了自动布局,但也许我做错了。我也认为问题可能来自我在我的单元格中导入笔尖的部分。
我也不知道在用户刷过UICollectionViewCell
之后扩展单元格的方法,有没有办法在发生这种情况时创建一个事件?也许再次致电tableView( ... heightForRowAtIndexPath ...)
?
答案 0 :(得分:2)
据我了解,您需要自动调整tableview单元格高度。所以你可以使用autolayout来调整单元格高度。
在ViewDidLoad中写入
self.tableView.estimatedRowHeight = 80
self.tableView.rowHeight = UITableViewAutomaticDimension
在CellForRowAtIndexPath中返回单元格之前
self.tableView.setNeedsLayout()
self.tableView.layoutIfNeeded()
您可以找到autolayout的链接。 enter link description here
答案 1 :(得分:0)
为了解决我的问题,我创建了一个数组来存储UITableView
(名为cellHeight
)的每个单元格的高度。
我还在由数组(名为cellHeightForPost
)组成的数组中计算程序开头的每个单元格的高度。主数组代表所有TableView cells
,其中的每个数组代表'collectionView'的每个单元格的高度
为了更新每次我更改其中的collectionView时,我都使用了函数collectionView(... willDiplayCell...)
:
self.tableView.beginUpdates()
cellHeight[collectionView.tag] = cellHeightForPost[collectionView.tag][indexPath.row]
self.tableView.setNeedsLayout()
self.tableView.layoutIfNeeded()
self.tableView.endUpdates()
我的 UITableView尺寸在tableView(... heightForRowAtIndexPath)
和tableView(... estimatedHeightForRowAtIndexPath)
中定义:
return cellHeight[indexPath.row]
设置collectionViewCells
的尺寸:
return CGSize(width: collectionView.frame.width, height: cellHeightForPost[collectionView.tag][indexPath.row])