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

#swift #xcode #uitableview #asynchronous

#swift #xcode #uitableview #асинхронный

Вопрос:

Я использую a UITableView с пользовательскими UITableViewCell s. В ячейках у меня есть UIImageView . Я присваиваю изображение этому представлению изображения из URL-адреса моей модели. До сих пор все это работало нормально.

Когда ячейка возвращается cellForRowAtIndexPath , изображение извлекается через расширение UIImageView и присваивается image свойству при возврате асинхронной выборки.

Изображение не отображается в UIImageView, несмотря на то, что оно работало раньше (возможно, эта проблема возникла после выпуска Xcode 8)

Что еще более странно, оно появляется прямо в инспекторе иерархии пользовательского интерфейса в Xcode.

Что происходит??

Скриншот с устройства:

Скриншот с устройства

Скриншот из инспектора иерархии пользовательского интерфейса в Xcode

введите описание изображения здесь

Комментарии:

1. Вы меняете радиус угла изображения где-нибудь в коде?

2. Да! в ячейке.. В `awakeFromNib.

Ответ №1:

Переместите свой код, который изменяет радиус угла, из awakeFromNib в layoutSubviews в вашем подклассе cell, как в примере ниже. Это должно это исправить.

     override func layoutSubviews() {
        super.layoutSubviews()
        self.contentView.layoutIfNeeded()
        imageView.layer.cornerRadius = CGRectGetHeight(imageView.bounds) / 2.0
        imageView.clipsToBounds = true
    }
  

Комментарии:

1. Вы правы. Проблема в том, что границы ImageView очень велики при awakeFromNib. Перемещение его в layourSubviews не решило мою проблему. Это не вызывается при возврате изображения. Я решил проблему, просто установив cornerradius на постоянное число.

2. Добавление self.contentView.layoutIfNeeded() после super.layoutSubviews() может помочь с размером изображения в layoutSubviews.

3. После добавления self.contentView.layoutIfNeeded(), ImageView.bounds имеет правильный размер, и изображения отображаются правильно.. Спасибо 🙂

4. Нет проблем! Добавляю это к моему ответу.

Ответ №2:

Вы также можете попробовать изменить его в своем tableView классе.

Вот так:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath) as! yourCellClassName //Change this to your cell

        cell.imageView.layer.cornerRadius = 6
        cell.imageView.clipsToBounds = true

        return cell
   }
  

Надеюсь, это вам поможет.