Хобрук: Ваш путь к мастерству в программировании

UIImageView неправильно изменяет размер в ячейках собственного размера iOS 8

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

Я пытаюсь добиться чего-то похожего на приложение 9gag, где размеры ячеек автоматически изменяются в зависимости от размера изображения. Ширина обнимает стороны, но высота изменяется по мере необходимости.

У меня есть ярлык, который состоит из заголовка над ним, а также UIImageView и под изображением. У меня есть значки общего доступа и т. д. Я установил ограничения для изображения как UIImageView и для нижних значков общего доступа, а также для обоих начальные и конечные пробелы. Кажется, я пробовал каждую комбинацию переключения «Режима» представления (т. Е. Заполнение аспекта, подгонка аспекта), когда я подгоняю его по размеру, он правильно измеряет изображения, но добавляет кучу отступов как в нижней, так и в верхней части изображения. изображение (снимок экрана приведен ниже)введите здесь описание изображения

Метка и значки имеют соответствующие установленные ограничения (насколько я могу судить)

Я искал часы, пытаясь найти кого-то с похожей проблемой, но безрезультатно. Кажется, я не могу найти ничего в отношении ячеек с собственным размером, в которых используются изображения, которые могут различаться по размеру.

Может ли кто-нибудь указать мне правильное направление или узнать о решении моей проблемы? Вся помощь очень ценится, как всегда!

02.03.2015

Ответы:


1

Насколько я видел, вы не можете изменить размер изображения из Interface Builder. Вам придется вручную написать код в файле ViewController.m. Имейте что-то вроде этого:

- (void) adjustImageSize{
    CGSize imageSize = self.imageView.image.size;
    CGSize imageViewSize = self.imageView.frame.size;
    float imageAspectRatio = imageSize.width/imageSize.height;
    CGRect frame = self.statusImage.frame;
    frame.size.height =imageViewSize.width/imageAspectRatio;
    self.imageView.frame = frame;
    // set your Cell's frame here, based on your other constraints (labels/buttons etc), after you have resized your image
}

Вы можете вызвать это из своей функции источника данных tableView. А затем добавьте эту функцию делегата, чтобы сообщить tableView динамическую высоту каждой ячейки.

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

Вот как я выполнил динамическое изменение размера изображений для приложения на основе NewsFeed. Надеюсь это поможет.

02.03.2015

2

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

Решение состоит в том, чтобы рассчитать соотношение сторон изображения и установить его в качестве ограничения отношения к UIImageView ширине.

@interface PostImageViewCell()

@property (nonatomic, strong) NSLayoutConstraint *aspectConstraint;

@end

@implementation PostImageViewCell

- (void) setAspectConstraint:(NSLayoutConstraint *)aspectConstraint {

    if (_aspectConstraint != nil) {
        [self.postImage removeConstraint:_aspectConstraint];
        _aspectConstraint = nil;
    }
    if (aspectContraint != nil) {
        [self.postImage addConstraint:aspectConstraint];
        _aspectConstraint = aspectConstraint
    }
}

- (void)setPicture:(UIImage *)image {

    CGFloat aspect = image.size.width / image.size.height;
    self.aspectConstraint = [NSLayoutConstraint constraintWithItem:self.postImage
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.postImage
                                                         attribute:NSLayoutAttributeHeight
                                                        multiplier:aspect
                                                          constant:0.0];
    [self.postImage setImage:image];
}

@end
21.07.2015

3

У меня точно такая же проблема.

Я заметил, что ячейка будет вычислять свой размер на основе изображения в вашем imageView и игнорирует то, что UIImageView изменит размер изображения, чтобы оно соответствовало его границам.

Пример: Ваше изображение имеет размер 1000x1000. Если вы установите для режима содержимого значение «Aspect Fit», UIImageView отобразит изображение с собственной шириной. Таким образом, отображаемое изображение может иметь ширину вашего iPhone, например. 750px и высота 750px (это квадрат). Теперь ячейка изменит свой размер, как если бы imageView отображал изображение в исходном формате; 1000x1000. Что приводит к нежелательному пробелу.

Мой обходной путь прямо сейчас — уменьшить размер изображения вручную, но это очень дорого, а также создает некоторые другие проблемы с моим пользовательским интерфейсом.

Вы нашли лучшее решение?

13.04.2015
  • К сожалению, лучшего решения я не нашел. Я действительно понял то же самое, что вы сделали с изменением размера изображения. Я работал над предварительным кэшированием изображений до того, как они поступят для просмотра, потому что изображения уменьшались в масштабе после того, как они поступали для просмотра для меня. Вы вообще применяли предварительное кэширование? 16.04.2015
  • Так что прямо сейчас я кэширую портретную и альбомную версию изображения, и это работает очень хорошо. Вероятно, это занимает много памяти, но вычисление изображений на лету убивает производительность пользовательского интерфейса. 20.04.2015
  • Новые материалы

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

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

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