我有一个包含多个部分的表格视图。在第1部分中,我想要4个具有固定高度的tableview单元格,而在所有其他部分中,我希望具有动态高度的tableview单元格。 问题是,当我填充表格视图时,> 0部分中的动态单元格 单元未根据内容调整大小。
对于动态高度,我在viewDidLoad视图控制器委托中使用了以下几行。
tableView.estimatedRowHeight = 83
tableView.rowHeight = UITableViewAutomaticDimension
和其他方法是:
func numberOfSections(in tableView: UITableView) -> Int {
return configRowsInSection.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
//configRowsInSection = listingsDetail.Specifications[IndexPath.sec].Configurations
switch (section) {
case 0:
return 4
default:
return Configurations.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "BannerCell", for: indexPath) as! BannerCell
cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
cell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0
//addPageControl(cell.collectionView)
}
else if indexPath.row == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailCell", for: indexPath) as! DetailCell
cell.Model.text = formatTitle(listingDetail: listingsDetail)
cell.SerialNumber.text = "Serial# " + listingsDetail.SerialNumber
}
else if indexPath.row == 2{
let cell = tableView.dequeueReusableCell(withIdentifier: "PriceCell", for: indexPath) as! PriceCell
cell.Price.text = "PRICE "+listingsDetail.AskingPrice!
}
else if indexPath.row == 3 {
let cell = tableView.dequeueReusableCell(withIdentifier: "HighlightCell", for: indexPath) as! HighlightCell
cell.filterText.text = listingsDetail.filter
cell.seatsText.text = listingsDetail.seats
cell.wheelsText.text = listingsDetail.wheels
cell.hoursText.text = listingsDetail.hours
}
}
else {
let cell = tableView.dequeueReusableCell(withIdentifier: "SpecificationCell", for: indexPath) as! SpecificationCell
cell.configValueBig.text = specificationDetail[indexPath.section-1].Configurations[indexPath.row].Desc
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var rowHeight:CGFloat!
if indexPath.section == 0 {
if indexPath.row == 0 {
rowHeight = 200
}
else if indexPath.row == 1 {
rowHeight = 100
}
else if indexPath.row == 2 {
rowHeight = 70
}
else {
rowHeight = 144
}
return rowHeight
}
else {
rowHeight = 83
//rowHeight = UITableView.automaticDimension (This makes the row height as -1)
}
return rowHeight
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 83
}
处理具有一个具有固定高度的行的部分和具有可变高度的行的其他动态部分的表视图的最佳方法是什么。 预先感谢!
答案 0 :(得分:0)
请尝试确保第二部分从底部开始具有正确的约束。
处理动态高度的最佳方法是使用UITableView.automaticDimension
func numberOfSections(in tableView: UITableView) -> Int {
return configRowsInSection.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
//configRowsInSection = listingsDetail.Specifications[IndexPath.sec].Configurations
switch (section) {
case 0:
return 4
default:
return Configurations.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "BannerCell", for: indexPath) as! BannerCell
cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
cell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0
//addPageControl(cell.collectionView)
}
else if indexPath.row == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailCell", for: indexPath) as! DetailCell
cell.Model.text = formatTitle(listingDetail: listingsDetail)
cell.SerialNumber.text = "Serial# " + listingsDetail.SerialNumber
}
else if indexPath.row == 2{
let cell = tableView.dequeueReusableCell(withIdentifier: "PriceCell", for: indexPath) as! PriceCell
cell.Price.text = "PRICE "+listingsDetail.AskingPrice!
}
else if indexPath.row == 3 {
let cell = tableView.dequeueReusableCell(withIdentifier: "HighlightCell", for: indexPath) as! HighlightCell
cell.filterText.text = listingsDetail.filter
cell.seatsText.text = listingsDetail.seats
cell.wheelsText.text = listingsDetail.wheels
cell.hoursText.text = listingsDetail.hours
}
}
else {
let cell = tableView.dequeueReusableCell(withIdentifier: "SpecificationCell", for: indexPath) as! SpecificationCell
cell.configValueBig.text = specificationDetail[indexPath.section-1].Configurations[indexPath.row].Desc
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var rowHeight:CGFloat!
if indexPath.section == 0 {
if indexPath.row == 0 {
rowHeight = 200
}
else if indexPath.row == 1 {
rowHeight = 100
}
else if indexPath.row == 2 {
rowHeight = 70
}
else {
rowHeight = 144
}
return rowHeight
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
答案 1 :(得分:0)
对于cellForRowAtIndexPath中的所有自定义单元格,我们需要返回单元格:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "BannerCell", for: indexPath) as! BannerCell
cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
cell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0
//addPageControl(cell.collectionView)
return cell
}
else if indexPath.row == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailCell", for: indexPath) as! DetailCell
cell.Model.text = formatTitle(listingDetail: listingsDetail)
cell.SerialNumber.text = "Serial# " + listingsDetail.SerialNumber
return cell
}
else if indexPath.row == 2{
let cell = tableView.dequeueReusableCell(withIdentifier: "PriceCell", for: indexPath) as! PriceCell
cell.Price.text = "PRICE "+listingsDetail.AskingPrice!
return cell
}
else if indexPath.row == 3 {
let cell = tableView.dequeueReusableCell(withIdentifier: "HighlightCell", for: indexPath) as! HighlightCell
cell.filterText.text = listingsDetail.filter
cell.seatsText.text = listingsDetail.seats
cell.wheelsText.text = listingsDetail.wheels
cell.hoursText.text = listingsDetail.hours
return cell
}
}
else {
let cell = tableView.dequeueReusableCell(withIdentifier: "SpecificationCell", for: indexPath) as! SpecificationCell
cell.configValueBig.text = specificationDetail[indexPath.section-1].Configurations[indexPath.row].Desc
return cell
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 83
}