Подтвердить что ты не робот

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)? Мне не нравится, когда я использую свой собственный код приближения + отказов + панорамирования + пейджинга.

4b9b3361

Ответ 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

Я пишу код для этого и могу быть ссылкой

  • Загрузка текущего вида прокрутки и просмотра изображений. и для экрана рядом с текущим представлением отображается только изображение

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

  • использовать тег, чтобы различать разные прокрутки

first page _xxxx slide ххх zoom

ссылка для загрузки нажмите здесь