UIScrollView изображение/просмотрщик фотографий с включенным и масштабируемым пейджингом
Хорошо, я думаю, что пришло время сделать официальное место в интернете для этой проблемы: Как сделать UIScrollView
просмотрщик фотографий с пейджингом и масштабированием. Добро пожаловать, мои коллеги UIScrollView
хакеры.
У меня есть UIScrollView
с включенной подкачкой, и я отображаю UIImageViews
как встроенное приложение для фотографий. (Это звучит знакомо?)
На github я нашел следующий проект:
https://github.com/andreyvit/ScrollingMadness/wiki
Который показывает, как реализовать масштабирование в режиме прокрутки, когда включена подкачка. Если кто-то еще попробует это, мне фактически пришлось удалить подкласс UIScrollView
и использовать собственный класс, иначе он не работает. Я думаю, это из-за изменений в 3.0 SDK, связанных с тем, как представление прокрутки перехватывает события касания.
Таким образом, идея состоит в том, чтобы удалить все другие виды, когда вы начинаете масштабирование, и переместить текущий вид на (0, 0) в scrollview
, обновив contentsize
и т.д. Затем, когда вы вернетесь к 1.0f, добавится другие взгляды возвращаются и приводят все в порядок.
В любом случае, этот проект отлично работает в симуляторе, но на устройстве есть некоторые неприятные движения вида, размер которого вы изменяете, и похоже, что это вызвано тем, что мы меняем contentsize
/offset
и т.д. Для вида. быть изменен Вы должны сделать этот вид движущимся, иначе вы можете перемещаться влево через пробел, оставленный другими видами.
Я нашел одну интересную заметку в разделе "Известные проблемы" заметок о выпуске 3.0 SDK:
UIScrollView: после масштабирования вставка содержимого игнорируется, а содержимое остается в неправильном положении.
Этот вид звучит как то, что здесь происходит. После увеличения изображение сместится за пределы экрана, поскольку вы изменили смещение и т.д.
Я уже часами занимаюсь этим, и я медленно прихожу к печальному осознанию того, что это просто не сработает.
Просмотрщик фотографий Three20 исключен: слишком большой вес, слишком много ненужного интерфейса и другого поведения.
Кажется, что встроенное приложение Photo делает что-то волшебное. Если вы увеличиваете изображение и перемещаетесь к дальним краям, текущая фотография перемещается независимо от фотографии рядом с ней, а это не то, что вы получаете при попытке сделать это со стандартным UIScrollView
.
Я видел обсуждение о вложении UIScrollView
, но я действительно не хочу туда идти.
Кто-нибудь справился с этим со стандартом UIScrollView
(и работает в 2.2 и 3.0 SDK)? Мне не нравится, когда я использую свой собственный код приближения + отказов + панорамирования + пейджинга.
Ответы
Ответ 1
UPDATE
Я удалил свой предыдущий ответ из-за новостей ниже...
Большие новости для тех, кто еще не слышал. Apple выпустила видеоролики сессии WWDC 2010 года всем участникам программы разработки iphone. Одна из обсуждаемых тем - как они создали приложение для фотографий!!! Они создают очень похожее приложение шаг за шагом и сделали весь код доступным бесплатно.
Он также не использует private api. Вот ссылка на загрузку образца кода. Вам, вероятно, потребуется войти в систему, чтобы получить доступ.
Отметьте это
И вот ссылка на страницу WWDC iTunes:
Проверить это
Ответ 2
Я написал простой и удобный в использовании браузер фотографий MWPhotoBrowser. Я решил создать его, поскольку Three20 был слишком тяжелым/раздутым, поскольку все, что мне было нужно, было просмотром фотографий.
MWPhotoBrowser может отображать одно или несколько изображений, предоставляя объекты UIImage или URL-адреса для файлов, веб-изображений или библиотечных ресурсов. Фотосервер обрабатывает загрузку и кеширование фотографий из Интернета. Фотографии можно масштабировать и панорамировать, а также могут отображаться необязательные (настраиваемые) титры. Браузер также может использоваться, чтобы позволить пользователю выбирать одну или несколько фотографий, используя либо сетку, либо основной вид изображения.
![MWPhotoBrowser Screenshots]()
Ответ 3
Вы говорите, что видели обсуждения вложенности UIScrollViews, но не хотите туда идти - но это путь! Он работает легко и хорошо.
Это, по сути, то, что Apple делает в своем примере PhotScroller (и в разговоре WWDC 2010 года, связанном с ответом Джона). Только в этих примерах они добавили целую кучу сложной черепицы и другого управления памятью. Если вам не нужны плитки и т.д., И если вы не хотите пробираться по этим примерам и пытаетесь удалить связанные с ним биты, основной принцип вложенности UIScrollViews на самом деле довольно прост:
-
Создайте внешний UIScrollView и установите его pagingEnabled = true. Добавьте его в свой основной вид и установите его ширину и высоту в соответствии с шириной и высотой вашего основного вида.
-
Создайте столько внутренних UIScrollView, сколько хотите. Установите ширину и высоту их ширины и высоты. Добавьте их как subviews в свой внешний UIScrollView, каждый из которых находится рядом с другим, слева направо.
-
Установите размер содержимого внешнего UIScrollView в общую ширину всех внутренних UIScrollViews рядом (что равно [ваша основная ширина] * [количество изображений]).
-
Добавьте изображения UIImageView во внутренние UIScrollViews, один UIImageView для каждого внутреннего UIScrollView. Установите каждый размер содержимого UIScrollView для каждого размера UIImageView.
-
Установите минимальные и максимальные шкалы масштабирования для каждого внутреннего UIScrollView и установите каждый из внутренних делегатов UIScrollView в ваш контроллер просмотра. В представлении делегата forZoomingInScrollView верните соответствующий UIImageView для передаваемого UIScrollView. (Чтобы сделать это, просто сохраните каждый из UIImageViews в NSArray и установите соответствующее свойство тега UIScrollView в индекс соответствующего UIImageView. Затем вы можете прочитать тег в UIScrollView, переданный viewForZoomingInScrollView, и вернуть соответствующий UIImageView из NSArray).
Что это. Работает так же, как и приложение для фото.
Если у вас много фотографий, чтобы сохранить память, у вас может быть только два внутренних UIScrollViews и два UIImagesViews. Затем вы динамически переключаетесь между ними, перемещая их по внешнему UIScrollView и изменяя их изображения, когда пользователь прокручивает внешний UIScrollView. Это немного сложнее, но тот же принцип.
Ответ 4
Я немного поиграл с приложением для родных фотографий, и я думаю, что могу с уверенностью сказать, что они используют один UIScrollView. Поддача заключается в следующем: увеличьте изображение и потяните влево или вправо. Вы увидите следующую или предыдущую фотографию. Если вы буксируете достаточно сильно, он будет даже показывать следующую фотографию при масштабировании 1.0f. Откиньтесь назад, и ранее увеличенное изображение вернется к масштабированию 1.0f.
Обидно, я не писал Photos.app, но я буду изучать, как они это сделали:
- Единый UIScrollView и один UIScrollViewDelegate
- Заполнение UIScrollView с помощью дочерних элементов UIImageView
- Слушайте
scrollViewDidScroll:
- Произведите некоторую математику и выясните, на какой странице вы находитесь в данный момент.
- Слушайте
viewForZoomingInScrollView:
- Возвращает другое представление в зависимости от индекса страницы
- Слушайте
scrollViewDidEndZooming:withView:atScale:
и произвольно выполняйте сглаживание и т.д. на основе содержимого
Если вы решите попробовать, дайте мне знать, как это работает для вас. Мне было бы интересно узнать, как вы, наконец, в конечном итоге заставить это работать. Еще лучше, разместите его до github.
Ответ 5
Я немного поиграл с приложение для родных фотографий, и я думаю, что могу с уверенностью говорят, что используют единственный UIScrollView. Дешевая распродажа это: увеличьте изображение и потяните слева или справа. Вы увидите следующей или предыдущей фотографии. Если вы буксируете достаточно сложно, он даже следующая фотография при масштабировании 1.0f. Откиньтесь назад и ранее увеличенное изображение будет обратно к масштабированию 1.0f.
Это неправильно. Я использую вложенные scrollviews и получаю точно такой же эффект. Если вы используете схему управления памятью (которую мне пришлось начать использовать... мой номер страницы довольно высок ("бит 50 каждый в 2 scrollViews)), тогда вы можете использовать механизм, аналогичный тому, что вы запускаете на своей странице загружает/выгружает, чтобы вызвать масштабирование reset для страниц -1 и +1 на текущей странице.
Я подозреваю, что яблоко отменяет это, как только предыдущий снимок исчез.
Я не понимаю, как добиться гладкой прокрутки между страницами - в момент перехода всегда очень короткая зависание. Не понимаю. Я получил довольно глубокую фиксацию - NSInvocationOperations была моей первой остановкой, а затем я сделал многократно просматриваемую очередь для просмотров страниц (которые сохраняют их изображения)... все же этот durned висит.
У меня есть только один NSOperationQueue, и я попытался задействовать максимальное количество одновременных операций. Я думал, что основной поток забивается конкурирующими очередями, или, может быть, даже одна очередь пытается сделать многое... все еще, повесить.
Я даже попытался создать супер низкокачественные версии моих медиа, в случае, если это была проблема. С каждым изображением весом около 10 тысяч (это jpegs, заметьте)... вы догадались. Там все еще есть.
Я в значительной степени решил сделать то, что я сделал раньше, и использовать TTPhotoViewController из Three20. Я провел несколько часов, проплывая через этот код, и это всегда отличное образование. На данный момент, тем не менее, мне бы очень хотелось узнать, откуда взялась эта вешалка, хотя бы потому, что я могу потратить свои часы без сна, думая о чем-то меньшем, чем кипячение мозга.
Ответ 6
Конечно, было бы неплохо, если бы яблоко построило средство просмотра изображений, такое как приложение для фотографий, в SDK для нас. В настоящее время я использую три20, и он отлично работает. Но много лишних вещей, которые нужно носить, когда все, что вам действительно нужно, - это просмотрщик фотографий.
Ответ 7
Я пишу код для этого и могу быть ссылкой
-
Загрузка текущего вида прокрутки и просмотра изображений.
и для экрана рядом с текущим представлением отображается только изображение
-
удалять все представления при текущей загрузке страницы для сохранения памяти, так что хорошо для многих фотопроектов
-
использовать тег, чтобы различать разные прокрутки
_xxxx
ххх ![zoom]()
ссылка для загрузки нажмите здесь
Ответ 8
Взгляните на https://github.com/facebook/three20/blob/master/src/Three20UI/Headers/TTPhotoViewController.h Не уверен, что то, что вы ищете