2016-08-24 1 views
0

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

OverView

У меня есть представление коллекции, которая делает использование пользовательского макета, который я написал. Весь этот пользовательский макет делает это, когда он применяет некоторые математические вычисления и обнаруживает оптимальное количество ячеек для размещения на экране по ширине экрана и пытается округлить дополнительные пиксели с помощью прокладки. В результате большая часть моего размера ячеек меняется, когда просмотр коллекции меняет ориентацию, особенно на устройстве, таком как iPad Pro. Я имею в виду, если размер ячейки 300 х 300 в портрете, это может стать 320 х 300, что-то вроде пейзажа. (Они не точные значения, просто пытаются дать идею)

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

Выпуск

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

Solutions Я понял,

  1. Я должен кэшировать два изображения друг один для одной ориентации в SDWeImageCache но то снова увеличит объем памяти приложения.

  2. Найти ячейку самого большого размера можно получить в различной ориентации и изменить размер изображения до этого размера, а затем использовать одно и то же изображение для всего меньшего размера ячейки с изображением, имеющим режим AspectToFit.

Пожалуйста, предложите мне правильный подход. Мне не нужен код, просто нужна идея.

+1

2. кажется самым простым. Я бы пошел с 2 и посмотрел, будет ли результат выглядеть достаточно хорошо (я уверен, что так оно и будет). Если не пойти с 1. – deadbeef

+0

@deadbeef: Спасибо за предложение :) Единственная проблема с решением 2 заключается в том, что я не знаю максимальный размер ячейки, пока пользователь не повернет устройство во все ориентации :(или у меня будет для вычисления начальных размеров для всей ориентации, которая снова должна быть тонкой, поскольку она включает в себя едва ли несколько математических уравнений и должна быть легкой, чем изменение размера самого изображения: D –

+0

Излучаются ли они при повороте устройства? – impression7vx

ответ

1

Сообщите мне, если это плохая идея, но возможные варианты.

Вы можете

1) Получить оригинальный размер изображения. Сохраните это.

функ resetImage() {

2) Определите, если ширина изображения> высота

3) Если шириной> высоты, то вы знаете, что это собирается быть больше картины. Определите, как долго вы хотите. Предположим, вы хотите, чтобы более широкие снимки примерно 1/10 * Ширина ячейки

4) Определите высоту изображения соответственно. ((1/10)/widthOfCell) * ImageHeight

5) Если (ширина> высота) imageView.frame = CGRect (0, 0, 1/10 * widthCell, высота)

6) imageView.contentMode = .ScaleAspectFit, imageView.image = UIImage (названный: «awesome»)

7) Возможно, сохраните imageView.size, чтобы использовать другое вращение.

Это позволяет вам изменить только изображениеView вместо сохранения данных изображения, надеясь удалить пустое пространство. Комментарий и лемму смотрите, что думаете.

+0

Спасибо, приятель :) Я ценю ваши усилия :) Но я не знаю, Думаю, я могу изменить размер imageView после его рендеринга, так как с ним связано множество других компонентов интерфейса пользователя с использованием ограничения автоматической компоновки. Таким образом, изменение рамки изображения будет нарушать некоторые из них и может привести к деформации o/p. Второе: да, вы правы, что он удаляет пустое пространство, но для этого это нужно сделать, я должен будет сделать это вычисление и изменить размер изображения для каждой ориентации, если не приятель :) Во всяком случае, я попробую:) Следовательно, голосование :) –

+0

Ха-ха не проблема! Надеюсь, вы сможете это сделать, поскольку я сделал это сам, просто не с помощью кнопок вокруг него или чего-то еще: PI не предпочитает использовать ограничения или раскадровку, просто сделайте 'imageView = UIImageView (frame: CGRect (.. .)) 'тогда, когда мне нужно его изменить, я могу просто сказать« imageView.frame », но я сделал это нажатием кнопки, а не на повороте! Но дайте мне знать, если это было или не сработало, и мы увидим, что мы можем сделать оттуда! – impression7vx

+0

Возможно, вам придется переустанавливать кнопки по бокам, если они зависят от 'imageView.frame'! – impression7vx

Смежные вопросы