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

UIImageView в моем UITableViewCell меняет размер на клик

У меня есть довольно ванильный UITableView в моем приложении, используемом для отображения изображения и текста стандартным/стандартным способом. При первом запросе UITableViewCell я возвращаю его с образцом-заполнителем и начинаю асинхронную загрузку реального изображения. Когда загрузка будет завершена, я заменю изображение заполнителя.

Если загрузка не удалась, изображение-заполнитель остается. Нажатие на такую ​​строку действует нормально. Если загрузка выполнена успешно, щелчок по строке с заданным изображением приводит к тому, что UIImageView расширяется до высоты строки (и ширина увеличивается в масштабе). UIImageView никогда не возвращается к нормальному размеру. Грубые попытки установить кадр UIImageView не смягчают проблему таинственного изменения размера.

// from my - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; method
// after boilerplate cell dequeuing code
cell.textLabel.text = [selectedNoun title];

// add placeholder image
UIImage *placeholderImage = [UIImage imageNamed:@"placeholder.png"];
cell.imageView.image = placeholderImage;
[cell.imageView setContentMode:UIViewContentModeScaleAspectFit];
//...
// If the image has been downloaded I set it
cell.imageView.image = iconDownloader.image;

Это сводит меня с ума. Фактически это происходит только в одной из двух таблиц в моем приложении, но после сравнения строк или строк я не вижу никакой разницы. Надеясь, что кто-то уже сталкивался с этим раньше.

Спасибо!

EDIT: у меня нет хорошего объяснения для моего решения, кроме как сказать, что изображения с определенным размером, похоже, приводят к такому поведению и использованию фактических эскизов (даже изображений, несколько больших, чем UIImageView), не проявляют это поведение.

4b9b3361

Ответ 1

Если у вас есть пользовательский UITableViewCell, убедитесь, что ваш UIImageView не назван с помощью "imageView"

Ответ 2

Единственное, что приходит на ум, влияющее на размер и внешний вид представления в пределах его супервизора:

  • Вы изменяете свойства frame/bounds/center в любом месте? Где/как первоначально установлен фрейм?

  • imageView.autoResizingMask должен быть установлен на UIViewAutoResizingNone

  • imageView.clipsToBounds должен быть установлен в YES

EDIT: больше предложений

Я снимаю в темном b/c ваш опубликованный код выглядит отлично, и если вы установили imageView.clipsToBounds, который должен сдерживать обратное изображение в кадре imageView. Вот еще несколько вещей, чтобы попробовать:

  • Внесите tableView:willDisplayCell:forRowAtIndexPath: и установите там свойства imageView. Если imageView.frame является проблемой, это, вероятно, не устранит ее.

  • Добавьте свой собственный UIImageView в ячейку, настроенную так, как вы хотите, и не используйте встроенное свойство imageView. Если поведение ячейки по умолчанию вызывает проблему, это должно работать.

EDIT: проблемы с большим изображением

Я не знаю точно, насколько велики "действительно большие изображения", которые вы используете в настоящее время, но это, скорее всего, проблема. Из документов UIImage (выделение мое):

Вам следует избегать создания объектов UIImage, размер которых превышает 1024 x 1024. Помимо большого объема памяти такой образ вы можете столкнуться с проблемами при использовании изображения в качестве текстуры в OpenGL ES или при рисовании изображения на вид или слой. Этот размер ограничение не применяется, если вы выполняете кодовые манипуляции, такие как изменение размера изображения более 1024 x 1024 пикселов путем рисования его в графическом контексте с поддержкой растровой графики. На самом деле, вы может потребоваться изменить размер изображения таким образом (или разбить его на несколько меньшие изображения), чтобы привлечь его к одному из ваших представлений.

Ответ 3

Моя проблема была несколько иной, у меня был пользовательский UITableViewCell с собственным UIImageView, и когда ящик исчез и снова появился, изображение будет неправильным. Моя проблема заключалась в том, что я устанавливал cell.imageView в одном месте и cell.thumbnail (пользовательское изображение) в другом, поэтому я изменил все ссылки на cell.thumbnail.

Надеюсь, это поможет кому-то в будущем с аналогичной проблемой.

Ответ 5

В этих ситуациях я использую эту платформу загрузчика изображений. Он включает в себя метод установки изображения-заполнителя по вашему выбору, при загрузке изображений в фоновом режиме, а в качестве дополнительного преимущества он кэширует изображения, гарантирующие, что один и тот же образ не будет загружаться дважды. Это отличная работа, которую я нашел очень полезной для загрузки изображений в виде таблицы.

SDWebImage: https://github.com/rs/SDWebImage

Ответ 6

У меня была та же проблема, и я не понял причину этого. Во всяком случае, это что-то связано с изображением заполнителя: если вы загружаете образ того же размера, что и заполнитель, размер не будет изменен, но если размеры не совпадают, загруженное изображение будет изменено на размеры замещающего объекта и при щелчке измените размер.

Итак, если вы хотите избежать проблемы, используйте заполнитель, соответствующий высоте строки.

Ответ 7

выполните следующие действия:

  • Выберите ImageView в пользовательской ячейке
  • выберите "Показать инспектору идентификации"
  • Прокрутите до конца и снимите флажок "Включено взаимодействие с пользователем".

Ответ 8

Это маловероятно, но вы должны попытаться выяснить, что происходит с кадрами подпрограмм UITableViewCell, когда его свойство isSelected переключается с NO на YES (I.e. что происходит, когда вы нажимаете на ячейку). Я сомневаюсь, что это поможет, но стоит посмотреть (если вы можете найти что-нибудь... что все под капотом UITableViewCell я бы мог представить).

Вы также должны изучить свойство imageview clipsToBounds. Может быть, что-то с этим связано?

Ответ 9

делать что-то вроде

CGRect bounds = [self bounds];
[self setImage:image];
[self setBounds:bounds];

при настройке изображения исправлена ​​проблема для меня

Ответ 10

Если вы перезагрузите tableview, когда закончите загрузку, изображение получит размер, который предположительно имел бы

[self.tableview reloadData];

Ответ 11

Я исправляю проблему с:

cell.selectionStyle = .none