#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
}
Надеюсь, это вам поможет.