UIScrollView просмотрщик изображений / фотографий с включенной подкачкой и масштабированием - PullRequest
55 голосов
/ 10 июня 2009

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

У меня есть UIScrollView с включенной подкачкой, и я отображаю UIImageViews как встроенное приложение для фотографий. (Это звучит знакомо?)

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

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

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

Таким образом, идея состоит в том, чтобы удалить все другие виды, когда вы начинаете масштабирование, и переместить текущий вид на (0, 0) в scrollview, обновив contentsize и т. Д. Затем, когда вы вернетесь к 1,0 Если он добавляет другие виды назад и возвращает все в порядок.

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

Я нашел одну интересную заметку в «Известных проблемах» заметок о выпуске 3.0 SDK :

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

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

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

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

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

Я видел обсуждение о вложении UIScrollView, но я действительно не хочу туда идти.

Кто-нибудь справился с этим со стандартным UIScrollView (и работает в 2.2 и 3.0 SDK)? Мне не нравится, когда я использую свой собственный зум + отскок + панорамирование + код подкачки.

Ответы [ 8 ]

43 голосов
/ 18 июня 2010

UPDATE

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

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

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

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

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

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

32 голосов
/ 03 марта 2011

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

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

MWPhotoBrowser Screenshots

19 голосов
/ 28 апреля 2012

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

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

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

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

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

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

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

Вот и все. Работает так же, как фото приложение.

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

6 голосов
/ 08 февраля 2010

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

Я, конечно, не писал Photos.app, но сделаю дикую догадку, как они это сделали:

  • Один UIScrollView и один UIScrollViewDelegate
  • Заполнение UIScrollView дочерними элементами UIImageView
  • Слушайте scrollViewDidScroll:
  • Сделайте математику и выясните, на какой странице вы сейчас находитесь
  • Слушайте viewForZoomingInScrollView:
  • Возвращает другое представление в зависимости от индекса страницы
  • Прослушивание scrollViewDidEndZooming:withView:atScale: и, при желании, сглаживание и т. Д. В зависимости от содержимого

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

1 голос
/ 14 февраля 2010

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

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

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

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

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

Я даже пытался создать супернизкие версии своих медиафайлов на случай, если это будет проблемой. С каждым изображением весом около 10 КБ (это JPEG, заметьте) ... вы догадались. Зависание все еще там.

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

0 голосов
/ 24 января 2012

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

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

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

  3. использовать тег для различения различных видов прокрутки

first page _xxxx slide ххх zoom

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

0 голосов
/ 12 июня 2010

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

0 голосов
/ 29 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...