UIImageView в моем UITableViewCell меняет размер при клике - PullRequest
23 голосов
/ 21 декабря 2011

В моем приложении довольно ванильный 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;

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

Спасибо!

РЕДАКТИРОВАТЬ: У меня нет хорошего объяснения моего решения, кроме как сказать, что изображения более определенного размера, как представляется, приводит ктакое поведение и использование реальных миниатюр (даже изображения, несколько превышающие размер кадра UIImageView) не демонстрируют такого поведения.

Ответы [ 11 ]

21 голосов
/ 10 июня 2015

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

11 голосов
/ 21 декабря 2011

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

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

  2. imageView.autoResizingMask следует установить на UIViewAutoResizingNone

  3. imageView.clipsToBounds следует установить наYES

РЕДАКТИРОВАТЬ: больше предложений

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

  1. Реализация tableView:willDisplayCell:forRowAtIndexPath: и установка там свойств imageView.Если imageView.frame является проблемой, это, вероятно, не решит проблему.

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

РЕДАКТИРОВАТЬ: проблемы с большим изображением

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

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

3 голосов
/ 30 сентября 2015

Этот ответ помог мне.Но я должен был обязательно вызвать [cell layoutSubviews] в методе, который на самом деле выполняет настройку, например:

cell.imageView.image = image;
[cell layoutSubviews];

Надеюсь, это может быть вам полезно!

3 голосов
/ 09 августа 2013

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

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

1 голос
/ 05 декабря 2013

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

  1. Выберите ImageView в пользовательской ячейке
  2. перейти к Показать для инспектора идентификации
  3. Прокрутите до конца и снимите флажок «Взаимодействие с пользователем включено».
1 голос
/ 27 декабря 2011

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

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

1 голос
/ 21 декабря 2011

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

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

0 голосов
/ 15 июля 2019

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

cell.selectionStyle = .none
0 голосов
/ 16 января 2015

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

[self.tableview reloadData];
0 голосов
/ 24 мая 2012

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

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

, когда настройка изображения решает проблему для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...