2016-08-04 2 views
4

Я рассмотрел несколько руководств, в которых показано, как устанавливать динамические высоты ячеек, но все они показывают это только в том случае, если вы используете динамические ячейки, установив соответствующие ограничения и используя UITableViewAutomaticDimension , Тем не менее, я хотел бы сделать это для статических ячеек.Как создать статические ячейки с динамическими высотами ячеек с помощью Swift

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

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

Я использую iOS9, Xcode 7.3 и Swift 2.2

UPDATE

Table View Controller Code

import UIKit 

class CategoriesTableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 140 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return 2 
    } 

} 

UPDATE 2

В приведенном ниже ответе я добавил два метода ниже к моему контроллеру табличного представления и удалил 2 строки, которые у меня были в viewDidLoad(). Это сделало это для меня! Имейте в виду, что я должен был убедиться, что все метки в каждой ячейке используют верхнее, нижнее, ведущее и конечное ограничение. Кроме того, число строк для каждой метки должен быть установлен в 0.

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

ответ

7

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

enter image description here

Добавьте следующий код в ваш контроллер представления:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
+0

Я не использую текстовое представление. Я использую обычные метки для своего текста. – Jace

+1

Однако добавление двух методов устранило мою проблему. Теперь ячейки изменяются в зависимости от размера текста метки. Благодаря! – Jace

+0

oh okay.Welcome friend :) Сделайте компилятор счастливым! –

1

Все, что вам нужно сделать, это установить правильный AutoLayout внутри cell, поэтому высота увеличивается на основе длины текста описания. Затем вам необходимо установить следующее в вашем viewDidLoad

tableview.rowHeight = UITableViewAutomaticDimension 
tableview.estimatedRowHeight = 44 

Пожалуйста, обратите внимание: Вы должны установить numberOfLines от UILabel до 0

3

Для Swift 3

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
0

@Forge, добавьте, пожалуйста, к вашей теме
Swift 4 вариант:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
Смежные вопросы