Подтвердить что ты не робот

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, это уже не проблема

4b9b3361

Ответ 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;
}