Увеличьте содержимое одной ячейки в UICollectionView

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

Моя ситуация выглядит следующим образом: у меня есть UICollectionView, пользовательский UICollectionViewFlowLayout, где для itemSize задан размер экрана, и пользовательский UICollectionViewCell с UIImageView. Это прекрасно работает при прокрутке разных фотографий, проблема заключается в их прокрутке.

Первый подход, который я попробовал, описан в сеансе WWDC 2012: "Расширенная коллекция Представления и создание пользовательских макетов». Эффект, который можно получить при таком подходе, заключается в том, что ячейка масштабируется должным образом, но затем она будет перекрываться соседними ячейками, создавая нежелательный эффект.

Второй подход аналогичен предложенному в сессии WWDC 2010: "Разработка приложений с использованием прокрутки". Взгляды'. Однако я не совсем уверен, что этот подход будет работать с UICollectionView вместо UIScrollView + subviews. Я устанавливаю свой контроллер представления как UIScrollViewDelegate и переопределяю viewForZoomingInScrollView:, где я возвращаю UIImageView видимой ячейки в данной точке. Ничего не произойдет, если я это сделаю. Я также попытался вернуть ячейку, и в этом случае весь макет UICollectionView испорчен. Я взглянул на пример проекта, который создала Apple (PhotoScroller), который успешно реализует то, что я хочу, но там у них просто есть UIImageView в качестве подвида UIScrollView.

Я думаю, что для того, чтобы реализовать поведение приложения «Фотографии» с помощью UICollectionView, мне нужно сделать это, выбрав первый подход и изменив атрибуты макета других ячеек в моем представлении коллекции, а не только увеличенного.

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


person jjramos    schedule 09.07.2014    source источник


Ответы (1)


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

В итоге я сделал UIScrollView самым верхним представлением моего пользовательского UICollectionViewCell и добавил UIImageView в качестве подпредставления этого UIScrollView. Первая проблема, которую мне нужно решить, когда я добавил, заключается в том, что UIScrollViews плохо работают с AutoLayout, как объяснено здесь. Итак, если вы хотите, чтобы ваше изображение было полноэкранным как в портретной, так и в альбомной ориентации, не забудьте использовать соответствующие маски автоматического изменения размера. Сделав это и вернув свой UIImageView в viewForZoomingInScrollView: я получил эффект масштабирования, который искал.

Однако компромисс, на который мне пришлось пойти, заключался в том, что я не разрешаю пользователю прокручивать разные изображения, если применяется какое-либо масштабирование (т. Е. Масштаб масштабирования отличается от 1,0). Кроме того, он отлично работает.

person jjramos    schedule 16.07.2014
comment
Удалось ли вам решить эту проблему с зумом? У меня есть требование прокручивать событие ячеек, если содержимое увеличено, и я до сих пор не могу найти никаких решений, которые бы работали... - person pawel.kalisz; 17.11.2016