UIScrollView просмотра изображений/фотографий с поддержкой листания и масштабирования


ОК, я думаю, пришло время сделать официальное место в интернете для этой проблемы: как сделать UIScrollView photoviewer с подкачки и масштабирования. Добро пожаловать, мой друг UIScrollView хакеров.

у меня есть UIScrollView с включенной подкачкой, и я показываю UIImageViews как встроенное приложение "Фотографии". (Звучит ли это уже знакомо?)

я нашел следующий проект github:

http://wiki.github.com/andreyvit/ScrollingMadness

который показывает, как реализовать масштабирование в режиме прокрутки при включении подкачки. Если кто-то еще попробует это, мне действительно пришлось удалить UIScrollView подкласс и использовать собственный класс в противном случае он не работает. Я думаю, что это из-за изменений в 3.0 SDK, связанных с тем, как вид прокрутки перехватывает события касания.

так что идея состоит в том, чтобы удалить все остальные представления когда вы начинаете сигналить, и переместить текущий вид (0, 0) в scrollview обновление contentsize etc. Затем, когда вы приближаетесь к 1.0 f, он добавляет другие виды назад и возвращает все в порядок.

в любом случае, этот проект отлично работает в симуляторе, но на устройстве есть какое-то неприятное движение представления, которое вы изменяете, что похоже на то, что это вызвано тем, что мы меняем contentsize/offset etc. для изменения размера представления. Вы должны сделать этот вид перемещения в противном случае вы можете перемещаться влево через пробелы, оставленные другими представлениями.

я нашел одну интересную заметку в "известных проблемах"3.0 SDK примечания к выпуску:

UIScrollView: после масштабирования вставка содержимого игнорируется, а содержимое остается в неправильном положении.

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

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

просмотрщик фотографий Three20 не может быть и речи: он слишком тяжелый, и слишком много ненужного пользовательского интерфейса и другого поведения.

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

я видел дискуссию о вложении UIScrollViewно я действительно не хочу туда идти.

кто-нибудь справился со стандартным UIScrollView (и работает в 2.2 и 3.0 SDK)? Мне не нравится прокатывать свой собственный zoom + bounce + pan + paging code.

8 55

8 ответов:

обновление

Я удалил свой предыдущий ответ из-за этой новости ниже...

большие новости для тех, кто еще не слышал. Apple выпустила видеоролики сессии WWDC 2010 для всех участников программы разработчика iphone. Одна из обсуждаемых тем-как они создали приложение "Фотографии"!!! Они строят очень похожее приложение шаг за шагом и сделали весь код доступным бесплатно.

Он также не использует частный api. Вот ссылка для загрузки примера кода. Вероятно, вам нужно будет войти в систему, чтобы получить доступ.

Проверить Это

и вот ссылка на страницу iTunes WWDC:

Проверить Это

Я написал простой и легкий в использовании браузер фотографий под названием MWPhotoBrowser. Я решил создать его, поскольку Three20 был слишком тяжелым / раздутым, так как все, что мне было нужно, это просмотрщик фотографий.

MWPhotoBrowser может отображать одно или несколько изображений, предоставляя объекты UIImage или URL-адреса для файлов, веб-изображений или библиотечных ресурсов. Фото браузер обрабатывает загрузку и кэширование фотографий из интернета легко. Фотографии могут быть увеличены и панорамированы, и дополнительно (настраиваемый) подписи могут быть отображены. Браузер также может быть использован, чтобы позволить пользователю выбрать одну или несколько фотографий, используя либо сетку или основной вид изображения.

MWPhotoBrowser Screenshots

вы говорите, что видели обсуждения вложенности UIScrollViews, но не хотите туда идти-но это путь! Он работает легко и хорошо.

Это по существу то, что Apple делает в своем примере Фотоскроллера (и разговор 2010 WWDC, связанный с ответом Ионы). Только в этих примерах они добавили целую кучу сложных листов и другого управления памятью. Если вам не нужна плитка и т. д. и если вы не хотите пробираться через эти примеры и попытаться удалить биты в связи с этим, основной принцип вложенности UIScrollViews на самом деле довольно прост:

  • создайте внешний UIScrollView и установите его pagingEnabled = true. Добавьте его в свой основной вид и установите его ширину и высоту в ширину и высоту вашего основного вида.

  • создайте столько внутренних UIScrollViews, сколько вы хотите изображений. Установите их ширину и высоту на ширину и высоту вашего основного вида. Добавить их в качестве подпанели на ваш внешний UIScrollView, каждый следующий с другой стороны, слева направо.

  • установите размер содержимого внешнего UIScrollView на общую ширину всех внутренних UIScrollViews бок о бок (которая равна [ширине вашего основного вида]*[количество изображений]).

  • добавьте UIImageViews ваших изображений к внутреннему UIScrollViews, один UIImageView к каждому внутреннему UIScrollView. Установите размер содержимого каждого UIScrollView для каждого размера UIImageView.

  • установить минимальный и максимальный зум масштабирует для каждого внутреннего UIScrollView и устанавливает каждый из делегатов внутреннего UIScrollView в контроллер представления. В viewForZoomingInScrollView делегата возвращает соответствующий UIImageView для UIScrollView, который передается. (Для этого просто сохраните каждый из UIImageViews в NSArray и установите соответствующее свойство тега UIScrollView в индекс соответствующего UIImageView. Затем вы можете прочитать тег в UIScrollView, переданный viewForZoomingInScrollView, и вернуть соответствующий UIImageView от NSArray).

Я немного поиграл с приложением native Photos, и я думаю, что могу с уверенностью сказать, что они используют один UIScrollView. Поддавка заключается в следующем: увеличьте изображение и потяните влево или вправо. Вы увидите следующую или предыдущую фотографию. Если вы потянете достаточно сильно,он даже перейдет на следующую фотографию с увеличением 1.0 f. Переверните назад, и ранее увеличенная фотография также вернется к масштабированию 1.0 f.

послушно я не писал фотографий.приложение, но я попробую угадать, как они сделали это:

  • один UIScrollView и один UIScrollViewDelegate
  • заполнить UIScrollView с UIImageView детей
  • слушать scrollViewDidScroll:
  • математике и выяснить, на какой странице вы находитесь в настоящее время
  • слушать viewForZoomingInScrollView:
  • возвращает другой вид в зависимости от индекса страницы
  • слушать scrollViewDidEndZooming:withView:atScale: и при необходимости сделать некоторые сглаживание, и т. д. На основе содержание

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

Я сделал некоторые игры вокруг с родные фотографии приложение, и я думаю, что я могу сказать с уверенностью, что они используют один UIScrollView. Поддавки есть это: увеличьте изображение и потяните на себя слева или справа. Вы увидите следующая или предыдущая фотография. Если вы тянете достаточно трудно, это будет даже страница к следующая фотография на 1.0 f Зуме. Сальто назад и ранее увеличенная фотография будет назад к 1.0 f масштабирования.

Это неправильно. Я использую вложенные прокрутки, и получить точно такой же эффект. Если вы используете какую-то схему управления памятью (которую мне пришлось начать использовать... мой номер страницы довольно высок ('около 50 каждый в 2 scrollViews)), то вы можете использовать механизм, аналогичный тому, что у вас есть, вызывая загрузку / выгрузку страницы, чтобы вызвать сброс масштаба для страниц -1 и +1 с текущей страницы.

Я подозреваю, что apple устанавливает это, как только предыдущий рис исчез.

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

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

Я даже попытался создать супер-низкокачественные версии моих носителей, в случае, если это было проблемой. С каждым изображением весом около 10k (это jpeg, имейте в виду)... вы уже догадались. Повешение все еще там.

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

конечно, было бы неплохо, если бы apple построила просмотрщик изображений, такой как приложение "Фотографии", в SDK для нас. В настоящее время я использую three20 и он отлично работает. Но это много дополнительных вещей, чтобы носить с собой, когда все, что вы действительно хотите, это просмотрщик фотографий.

Я пишу код для этого , и может быть как ссылка

  1. загрузить текущий вид scrollview и imageview .. и для экрана рядом с текущим представлением, только imageview

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

  3. тег использовать, чтобы дифференцировать различные представление ScrollView

first page _xxxxslide xxxzoom

ссылка для скачивания нажать здесь

взгляните на https://github.com/facebook/three20/blob/master/src/Three20UI/Headers/TTPhotoViewController.h Не уверен, что это то, что вы ищете