根据单元格增加TableView高度

时间:2016-12-12 05:29:09

标签: ios iphone swift uitableview

我需要根据UITableView内容大小增加UITableViewCell个高度。 我正在使用自定义Google自动完成功能。我有UITextField。当我在UITextField中输入一封信时,它会调用shouldChangeCharactersIn范围委托方法。

在该方法中,我会向Google AutoComplete API发送动态请求以获取预测结果。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if tableView.numberOfRows(inSection: 0) > 0
    {

    let newLength = (textField.text?.characters.count)! + string.characters.count - range.length
    let enteredString = (textField.text! as NSString).replacingCharacters(in: range, with:string)

    if newLength == 0 {
        tableView.isHidden = true
    }

    if newLength > 0
    {
        address.removeAll()
        self.tableView.isHidden = false

        GetMethod("https://maps.googleapis.com/maps/api/place/autocomplete/json?input=\(enteredString)&key=MYAPIKEY", completion: { (resultDict) in

            let resultArray = resultDict.object(forKey: "predictions")! as! NSArray

            print(resultArray.count)

            for temp in resultArray

            {
                 let newtemp = temp as! NSDictionary
                 let tempAdd = newtemp.value(forKey:"description") as! String
                let placeId = newtemp.value(forKey:"place_id") as! String
                var dict = [String : AnyObject]()
                dict["address"] = tempAdd as AnyObject?
                dict["latlong"] = placeId as AnyObject?
                self.address.append(dict as AnyObject)
                 print(newtemp.value(forKey:"description"))
                 print(self.address.count)
                self.tableView.reloadData()

            }

        })
      }
    return true
}

在我将所有地址动态存储到地址数组后,我需要根据传入的地址内容增加UITableView高度。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "TableViewCell"
    var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
    if cell == nil
    {
    cell = UITableViewCell(style: .default, reuseIdentifier: cellIdentifier)
    }

    let addresstoDisp  = address[indexPath.row] as! NSDictionary
    let name = addresstoDisp.value(forKey: "address")
    cell?.textLabel?.numberOfLines = 0
    cell?.translatesAutoresizingMaskIntoConstraints = false

    cell?.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
    cell?.textLabel?.textAlignment = NSTextAlignment.center
    cell?.textLabel?.text = name as! String

    return cell!
}

UITableViewCell身高正在增加。另外我需要增加tableView高度。

4 个答案:

答案 0 :(得分:13)

创建单元格后添加这些行。因为它在viewDidLoad()

中返回0高度
 var frame = tableView.frame
 frame.size.height = tableView.contentSize.height
 tableView.frame = frame

<强>更新

//After Tableviews data source values are assigned
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.heightAnchor.constraint(equalToConstant: tableView.contentSize.height).isActive = true

答案 1 :(得分:3)

下面的代码对具有AutomaticDimension的UITableViewCell有用。

  1. 为tableViewHeight创建出口。
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!
var tableViewHeight: CGFloat = 0  // Dynamically calcualted height of TableView.
  1. 对于单元的动态高度,我使用了以下代码:
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return tableView.estimatedRowHeight
}
  1. 对于TableView的高度,以及TableView单元格的动态高度:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    print(cell.frame.size.height, self.tableViewHeight)
    self.tableViewHeight += cell.frame.size.height
    tableViewBillsHeight.constant = self.tableViewHeight
}

说明:

在创建TableView单元格之后,我们获取将要显示的单元格的框架高度,并将该单元格的高度添加到主TableView中。

答案 2 :(得分:1)

无需设置和重置高度约束,就可以根据其内容来调整表格视图的大小,如下所示:

class DynamicHeightTableView: UITableView {
  override open var intrinsicContentSize: CGSize {
    return contentSize
  }
}

答案 3 :(得分:0)

在您的viewDidLoad中写:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    myTable.reloadData()
    myTable.layoutIfNeeded()
}

现在重写viewDidLayoutSubviews方法以为tableview提供显式的高度约束:

override func viewDidLayoutSubviews() {
    myTable.heightAnchor.constraint(equalToConstant:
    myTable.contentSize.height).isActive = true
}

这可确保已加载表格视图,并且已完成与约束相关的所有布局调整。