Swift: Как перезагрузить высоту строки в UITableViewCell без перезагрузки данных

У меня есть случай, в котором я должен перезагрузить только высоту UITableViewCell,

но если я вызову функцию

tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: webView.tag, inSection: 0)], withRowAnimation: .Automatic)

он перезагружает высоту, а также данные ячейки. Как я могу просто контролировать высоту ячейки в Swift?

Это мой блок cellForRow:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! CustomTableViewCell1
    cell.heading.text = headerText
        return cell
    }

    else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell2", forIndexPath: indexPath) as! CustomTableViewCell2
        ImageLoader.sharedLoader.imageForUrl(self.headerImage , completionHandler:{(image: UIImage?, url: String) in
            cell.mainImage.image = image
        })
        return cell
    }
    else if indexPath.row == 2 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell3", forIndexPath: indexPath) as! CustomTableViewCell3
        //cell.aurthorImage.image = UIImage(named : "obama")
        ImageLoader.sharedLoader.imageForUrl(self.headerImage , completionHandler:{(image: UIImage?, url: String) in
            cell.aurthorImage.image = image
        })
        cell.aurthorImage.tag = aurthorID
        cell.aurthorImage.layer.cornerRadius = cell.aurthorImage.frame.height/2
        cell.aurthorImage.clipsToBounds = true
        cell.aurthorImage.userInteractionEnabled = true
        cell.aurthorImage.addGestureRecognizer(aurthorImageTapRecignizer)
        cell.aurthorName.text = self.authorName
        cell.time.text = self.time
        self.followButton = cell.followButton
        return cell
    }

    else if indexPath.row == 3 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell4", forIndexPath: indexPath) as! CustomTableViewCell4
        let htmlHeight = contentHeights[indexPath.row]

        cell.webElement.tag = indexPath.row
        cell.webElement.delegate = self
        cell.webElement.loadHTMLString(HTMLContent, baseURL: nil)
        cell.webElement.frame = CGRectMake(0, 0, cell.frame.size.width, htmlHeight)

        return cell
    }
    else if indexPath.row == 4 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! CustomTableViewCell1
        cell.heading.text = "Related Posts"
        return cell
    }
    else if indexPath.row == 5{
        let cell = tableView.dequeueReusableCellWithIdentifier("cell6", forIndexPath: indexPath) as! CustomTableViewCell6
        return cell

    }
    else if indexPath.row == 6 {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! CustomTableViewCell1
        cell.heading.text = "Comments"
        return cell
    }
    else if indexPath.row == 7 {

        let cell = tableView.dequeueReusableCellWithIdentifier("cell5", forIndexPath: indexPath) as! CustomTableViewCell5


        let htmlHeight = contentHeights[indexPath.row]
        self.commentSection = cell.commentsView
        self.commentSection.tag = indexPath.row
        self.commentSection.delegate = self
        let url = NSURL(string: commentsURL)
        let requestObj = NSURLRequest(URL: url! )
        self.commentSection.loadRequest(requestObj)
        self.commentSection.frame = CGRectMake(0, 0, cell.frame.size.width, htmlHeight)
            commentSectionDidNotLoad = false

            return cell
    }
    else {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! CustomTableViewCell1
        cell.heading.text = headerText
        return cell
    }

3 ответа

Вы можете использовать этот код для обновления высоты ячейки без перезагрузки их данных:

tableView.beginUpdates()
tableView.endUpdates()

Вы также можете использовать этот метод с последующим методом endUpdates, чтобы анимировать изменение высоты строк без перезагрузки ячейки.

Описание класса UITableView

Запустите обновление таблицы и завершите его, ничего не меняя.

tableView.beginUpdates()
tableView.endUpdates()

Это должно заставить таблицу установить новую высоту

Вы можете регулировать высоту, либо реализуя (a)heightForRowAtIndexPath с помощью логической установки высоты или (b) с автоматическим макетом и автоматической высотой строки просмотра таблицы

A.

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
     if [your condition, row == 5 in your comment] {
          return 100
     } else {
         return 40
     }
}

Всякий раз, когда вы хотите изменить высоту, вы просто позвоните в эти две строки

tableView.beginUpdates()
tableView.endUpdates()

B.

в viewDidLoad

tableView.estimatedRowHeight = 40.0
tableView.rowHeight = UITableViewAutomaticDimension

а затем вы можете просто выставить ограничение макета, который устанавливает высоту ячеек и получить к нему доступ, чтобы установить высоту, когда вы хотите

cell.heightConstraint.constant = 100
tableView.beginUpdates()
tableView.endUpdates()

Например, о вашем вопросе, чтобы указать конкретное измерение высоты:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
  if indexPath.row == 3 {
    return 50.0
  }

  return 72.0
}

Но я думаю, что у вас есть веб-представление внутри ячейки, поэтому, как правило, для расчета динамической высоты UITableViewCell с UIWebView: (в этом примере есть два веб-вида)

class MyTableViewController: UITableViewController, UIWebViewDelegate
{
    var content : [String] = ["<!DOCTYPE html><html><head><title>Page Title</title></head><body><h1>My First Heading</h1><p>My first paragraph</p></body></html>", "<HTML><HEAD><TITLE>Coca-Cola</TITLE></HEAD><BODY>In Chinese, Coca-Cola means Bite the Wax Tadpole</BODY></HTML>"]
    var contentHeights : [CGFloat] = [0.0, 0.0]

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("myCustomCell", forIndexPath: indexPath) as! MyCustomCell
        let htmlString = content[indexPath.row]
        let htmlHeight = contentHeights[indexPath.row]

        cell.webView.tag = indexPath.row
        cell.webView.delegate = self
        cell.webView.loadHTMLString(htmlString, baseURL: nil)
        cell.webView.frame = CGRectMake(0, 0, cell.frame.size.width, htmlHeight)
        return cell
    }
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    {
        return contentHeights[indexPath.row]
    }
    func webViewDidFinishLoad(webView: UIWebView)
    {
        if (contentHeights[webView.tag] != 0.0)
        {
            // height knowed, no need to reload cell
            return
        }
        contentHeights[webView.tag] = webView.scrollView.contentSize.height
        tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: webView.tag, inSection: 0)], withRowAnimation: .Automatic)
    }
}

Вы можете использовать ограничение высоты представления в ячейке, обновив представление в высоте ячейки, вы можете обновить конкретную высоту ячейки.

let height = cell.Height_constraint.constant
cell.Height_constraint.constant = height + 200 //200 you can use any number

Height_constraint: ограничение высоты subView в моей ячейке.

Другие вопросы по тегам