UITableViewAutomaticDimension не работает до прокрутки
Когда сначала загружается Table View, все видимые ячейки являются оцененнымиRowHeight. Когда я прокручиваю вниз, ячейки автоматически масштабируются должным образом, и когда я прокручиваю назад ячейки, которые первоначально были оценены, RowHeight автоматически оцениваются должным образом.
После того, как ячейки будут автоматически отсортированы, они никогда не возвращаются к тому, чтобы быть оцененным RowHeight.
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
self.tableView.estimatedRowHeight = 80.0
self.tableView.rowHeight = UITableViewAutomaticDimension
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
и
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as CustomTableViewCell
// Configure the cell...
let restaurant = restaurants[indexPath.row]
cell.namelabel.text = restaurant.name
cell.locationlabel.text = restaurant.location
cell.typelabel.text = restaurant.type
cell.thumbnailImageView.image = UIImage(named: restaurant.image)
cell.thumbnailImageView.layer.cornerRadius = cell.thumbnailImageView.frame.size.width / 2
cell.thumbnailImageView.clipsToBounds = true
cell.accessoryType = restaurant.isVisited ? .Checkmark : .None
return cell
}
Мысли о том, как автоматически инициализировать ячейки?
ОБНОВЛЕНИЕ: Как и в случае с Xcode 7 beta 6, это уже не проблема
Ответы
Ответ 1
Я столкнулся с той же проблемой и обнаружил, что аксессуар cell.accessoryType
работает с этим автоматическим изменением размера, когда это не None
, поэтому на данный момент это похоже на ошибку в XCode.
Но, как отметил @Blankarsch, вызов reloadSections(..)
помогает исправить эту проблему, если вам нужно иметь аксессуар.
![Accessory to "None" solved my issue]()
Ответ 2
Просто вызовите "reloadSections" после загрузки вашей таблицы:
self.tableView.reloadSections(NSIndexSet(indexesInRange: NSMakeRange(0, self.tableView.numberOfSections())), withRowAnimation: .None)
Или в Swift 3:
let range = Range(uncheckedBounds: (lower: 0, upper: self.tableView.numberOfSections))
self.tableView.reloadSections(IndexSet(integersIn: range), with: .none)
Ответ 3
просто переопределить оцененныйHeightForRowAtIndexPath как это
(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
и проверьте ограничения autoLayout в представлении CustomTableViewCell.
Ответ 4
Я думаю, что ответы более здесь имеют меньше побочных эффектов. В частности, добавление cell.layoutIfNeeded()
в tableView:cellForRowAtIndexPath:
Я также делаю то, что предлагает @nosov, как хорошая практика, но не проверял, нужно ли их делать в тандеме.
Ответ 5
Просто убедитесь, что ваши метки не имеют явного размера содержимого, заданного в Interface Builder. Они должны быть автоматическими, как на скриншоте ниже, для того, чтобы автоматическая высота рядов работала правильно, без необходимости перезагрузки каких-либо разделов спереди.
![enter image description here]()
Ответ 6
Если вы устанавливаете свои ограничения на основе самой ячейки (вместо представления содержимого ячейки), таблица не может получить правильный размер. Итак, чтобы исправить эту проблему, ваши ограничения должны быть установлены в виде содержимого.
Однако это проблема, когда ваши ячейки поддерживают как конфигурацию с/без аксессуаров. В этом случае представление содержимого изменяется в соответствии с видом аксессуара, и результат может не соответствовать ожидаемому пользователем. Таким образом, в этом случае решение устанавливает 2 ограничения, один для ячейки и второй с более низким приоритетом для представления содержимого ячейки.
Ответ 7
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath;
В функции задается ячейка с предпочтительным контентом, чтобы UITableViewAutomaticDimension работала безупречно.
Проблема возникает из-за того, что содержимое ячейки загружается в какую-либо другую функцию делегата, поэтому вы можете видеть, что ячейки автоматически изменяют размер до требуемого размера.
Ответ 8
Обязательно запустите свою ячейку в tableView:cellForRowAt:
. Я столкнулся с этой проблемой даже с Xcode 8, когда я устанавливал содержимое ячейки в tableView:willDisplay:forRowAt:
Ответ 9
Для меня у меня есть эта проблема при использовании ячейки willDisplay для установки текста моих ярлыков
Если я устанавливаю текст своих ярлыков в указателе pathStream, все в порядке
Ответ 10
Для меня это решило, что это была комбинация ответа [David Hernandez].
![введите описание изображения здесь]()
Удалено выделение сверху, а в ячейке layoutSubviews я устанавливаю предпочтительныйMaxLayoutWidth как это (измените 30 на желаемый правый правый интервал)
-(void) layoutSubviews {
[super layoutSubviews];
self.textDescriptionLabel.preferredMaxLayoutWidth = self.frame.size.width - 30;
}