Можно ли определить ограничение диапазона для того же якоря макета на iOS? - PullRequest
0 голосов
/ 27 октября 2019

Я хочу отобразить изображение в каждой ячейке UICollectionView. Изображения должны иметь ту же ширину, что и экран, но их высота будет зависеть от их размера. Я хотел бы убедиться, что изображения ограничены диапазоном пропорций (например, от 1,91 до 4/5). Изображения, хранящиеся на сервере, могут иметь любое соотношение сторон;таким образом, они не ограничены. Когда они отображаются в UICollectionViewCell, они должны масштабироваться, чтобы заполнить их, если они меньше или больше, чем диапазон ограничивающей рамки (то есть от 1,91 до 4/5).

Например, если изображение имеет 2: 1соотношение сторон, оно должно быть зафиксировано до 1,91: 1. Если он имеет соотношение сторон 1: 2, он должен быть зафиксирован до 4: 5. Я хотел бы использовать новые UICollectionViewCompositionalLayout.

enter image description here

Для этого усилия я изначально думал о предварительном вычислении высот и их сохранении вмодель данных и обновление высоты просмотра на основе этого. См. Ограничения высоты вида установлены неправильно, когда я прокручиваю UICollectionView вверх и вниз , но у меня возникают проблемы с этим подходом.

Мой вопрос для начинающих заключается в том, возможно ли определить два ограничениядля того же якоря, чтобы определить диапазон?

_imageContainer.heightAnchor.constraintGreaterThanOrEqualToAnchor(_imageContainer.widthAnchor, multiplier: 4.0/5).active = true
_imageContainer.heightAnchor.constraintLessThanOrEqualToAnchor(_imageContainer.widthAnchor, multiplier: 1.91).active = true

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

1 Ответ

0 голосов
/ 28 октября 2019

да, делайте так, как делает Google в своем API изображения, и сохраняйте размеры изображения в своей базе данных.

см. Их пользовательский API для поиска маршрута

customsearch / v1

возвращает

@"pagemap.cse_thumbnail.width"
@"pagemap.cse_thumbnail.height"

, как только вы получите эти значениязатем в методах delgate для UICollectionView, в частности sizeForItemAtIndexPath, вы извлекаете эти сохраненные значения из запроса к серверу, а затем нормализует размер ячейки по ширине, равной общей ширине экрана, с учетом высоты, учитываемой для соответствия.

вы бы использовали такую ​​функцию, чтобы получить размер ячейки в нормализованном виде

static CGFloat CustomFloatCalc(CGFloat value) {
   CGFloat scale = [UIScreen mainScreen].scale;
   return floor(value * scale) / scale;
}

что-то вроде этого:

     CGFloat itemHeight = 0;
     if (itemSize.height > 0 && itemSize.width > 0) {
        itemHeight = CustomFloatCalc(itemSize.height * itemWidth / itemSize.width);
     }

теперь вы можете вычислитьзначение изображения «на лету» в sizeForItemAtIndexPath, но при этом увеличивается нагрузка на память и процессор на устройстве. Лучше хранить значения в бэкэнде, как это делает Google.

Удачи

...