我在UIViewController中的视图中有一个UITableView。 我试图根据文本长度自动调整表格单元格的大小。但它不会设置textview的文本,单元格最终以idCellTextView-cell的标准高度结束。我已经搜索了一些资料,并尝试使用以下代码中textview相对于contentview的自动布局固定:
tableView.estimatedRowHeight = 70
tableView.rowHeight = UITableViewAutomaticDimension
与问题相关的其余视图控制器如下所示:
class ExperimentViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextViewDelegate {
var expId: String = ""
let experimentDescription: String = ""
var cellDescriptors: NSMutableArray!
var visibleRowsPerSection = [[Int]]()
let notificationCenter = NotificationCenter.default
override func viewDidLoad() {
super.viewDidLoad()
//TABLE CELLS
loadCellDescriptors()
tableView.tableFooterView = UIView()
tableView.layoutMargins = UIEdgeInsets.zero
tableView.separatorInset = UIEdgeInsets.zero
tableView.delegate = self
tableView.dataSource = self
tableView.isHidden = true
tableView.estimatedRowHeight = 70
tableView.rowHeight = UITableViewAutomaticDimension
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "idCellNormal")
tableView.register(UINib(nibName: "HintCell", bundle: nil), forCellReuseIdentifier: "idCellTextView")
//ADD VIEWS
baseView.addSubview(backgroundImage)
baseView.addSubview(foregroundImage)
baseView.addSubview(nameLabel)
baseView.addSubview(segmentedController)
baseView.addSubview(descriptionText)
baseView.addSubview(hint)
baseView.addSubview(tableView)
}
/*
Get property list for the different cells we want to have in the hint table
*/
func loadCellDescriptors() {
if let path = Bundle.main.path(forResource: "CellDescriptor", ofType: "plist") {
cellDescriptors = NSMutableArray(contentsOfFile: path)
getIndicesOfVisibleRows()
tableView.reloadData()
}
}
/*
Returns number of rows in a given section
*/
func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
return visibleRowsPerSection[section].count
}
/*
Returns number of sections in table
*/
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
/*if cellDescriptors != nil {
return cellDescriptors.count
}
else {
return 0
}*/
print(items.count)
return 3
}
/*
Sets up the cell contents
*/
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String , for: indexPath) as! CustomCell
if currentCellDescriptor["cellIdentifier"] as! String == "idCellNormal" {
print("1")
if currentCellDescriptor["primaryTitle"] != nil {
cell.labelOfRow.text = "Hintet er"
cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
}
} else if currentCellDescriptor["cellIdentifier"] as! String == "idCellTextView" {
cell.textView.delegate = self
cell.textView.isEditable = false
cell.textView.isSelectable = false
cell.textView.isScrollEnabled = true
cell.textView.text = "orem Ipsum er rett og slett dummytekst fra og for trykkeindustrien. Lorem Ipsum har vært bransjens standard for dummytekst helt siden 1500-tallet, da en ukjent boktrykker stokket en mengde bokstaver for å lage et prøveeksemplar av en bok. Lorem Ipsum har tålt tidens tann usedvanlig godt, og har i tillegg til å bestå gjennom fem århundrer også tålt spranget over til elektronisk typografi uten vesentlige endringer. Lorem Ipsum ble gjort allment kjent i 1960-årene ved lanseringen av Letraset-ark med avsnitt fra Lorem Ipsum, og senere med sideombrekkingsprogrammet Aldus PageMaker som tok i bruk nettopp Lorem Ipsum for dummytekst.orem Ipsum er rett og slett dummytekst fra og f"
}
cell.layoutMargins = UIEdgeInsets.zero
return cell
}
/*
Handles row selections
Finds the index of the cell that was selected, checks if it is/can be expanded and animates in the additional rows
*/
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexOfTappedRow = visibleRowsPerSection[indexPath.section][indexPath.row]
let cellDescriptor = cellDescriptors[indexPath.section] as! NSMutableArray
let cell = (cellDescriptors[indexPath.section] as! NSMutableArray)[indexOfTappedRow]
var shouldExpandAndShowSubRows: Bool = false
//Checks if cell is expandable, if it is we check if cell isn't already expanded. If it isn't we can expand the cell
if (cell as AnyObject)["isExpandable"] as! Bool == true {
shouldExpandAndShowSubRows = false
if (cell as AnyObject)["isExpanded"] as! Bool == false {
shouldExpandAndShowSubRows = true
}
}
(cell as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: "isExpanded")
//Makes the cells inside the specific section visible
for i in (indexOfTappedRow + 1)...(indexOfTappedRow + ((cell as AnyObject)["additionalRows"] as! Int)) {
(cellDescriptor[i] as AnyObject).setValue(shouldExpandAndShowSubRows, forKey: "isVisible")
}
//Update the overview of the currently visible rows
getIndicesOfVisibleRows()
//Reload the sections to see the changes
tableView.reloadSections(NSIndexSet(index: indexPath.section) as IndexSet, with: UITableViewRowAnimation.fade)
}
/*
Get overview of the rows that are currently visible
*/
func getIndicesOfVisibleRows() {
visibleRowsPerSection.removeAll()
for currentSectionCells in cellDescriptors.objectEnumerator().allObjects as! [[[String:AnyObject]]] {
var visibleRows = [Int]()
for row in 0...((currentSectionCells).count - 1) {
if currentSectionCells[row]["isVisible"] as! Bool == true {
visibleRows.append(row)
}
}
visibleRowsPerSection.append(visibleRows)
}
}
/*
Get cell descriptor from file for specific cell
*/
func getCellDescriptorForIndexPath(_ indexPath: IndexPath) -> [String: AnyObject] {
let indexOfVisibleRow = visibleRowsPerSection[indexPath.section][indexPath.row]
let cellDescriptor = (cellDescriptors[indexPath.section] as! NSMutableArray)[indexOfVisibleRow] as! [String: AnyObject]
return cellDescriptor
}
}