Тройная вложенная UIScrollView проблема с подкачкой - PullRequest
3 голосов
/ 22 ноября 2011

Предыстория
У меня есть приложение для iPad, которое должно позволять пользователю перемещаться по группам изображений.Каждая группа размещена в своем собственном вертикальном UIScrollView (разбито на страницы), так что пользователь может перемещаться вверх и вниз, чтобы увидеть каждое изображение.Каждая из групп UIScrollViews помещается в один (только один существует в приложении) внешний горизонтальный UIScrollView (также разбитый на страницы).Это прекрасно работает .... Я могу провести вверх и вниз, чтобы просмотреть изображения в группе, и проведите пальцем влево и вправо, чтобы перейти к следующей или предыдущей группе.

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

Есть ли лучший (более правильный) подход, чем тройное вложение UIScrollViews, или я могу каким-то образом перенаправить касания во внешний горизонтальный вид прокрутки?

Буду признателен за любую помощь или предложения.

1 Ответ

8 голосов
/ 10 февраля 2012

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

Здесь вы можете найти проект Xcode, демонстрирующий вашу настройку scrollview, вашу проблему и предлагаемое решение: https://bitbucket.org/reydan/threescrollviews

В основном решение состояло в том, чтобы добавить 1 пиксель к contentSize.width вертикальной прокрутки . Это заставляет вертикальную прокрутку немного прокручиваться при перемещении к краю увеличенного изображения. Он немного прокручивается и затем переходит к следующему вертикальному обзору прокрутки.

Если вы загрузите проект, вы увидите, что я создал несколько скролл-обзоров в методе viewDidLoad. Там я создаю один горизонтальный вид прокрутки, содержащий 3 вертикальных вида прокрутки, каждый из которых содержит 5 изображений. Каждое изображение фактически инкапсулируется в виде прокрутки, чтобы включить масштабирование для каждого изображения. Всего ... тройные вложенные прокрутки.

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

  • пурпурный = горизонтальная прокрутка
  • белый = вертикальная прокрутка
  • синий = вид прокрутки изображения (тот, который содержит изображение и позволяет масштабировать)
  • красный = UIImageView

Вы увидите, что я пометил каждое изображение прокрутки изображения значением 10. Это используется в реализации - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView метода делегата, где я возвращаю nil, если событие не пришло от одного из изображений прокрутки изображения.

Если у вас есть какие-либо вопросы о проекте, который вы можете задать, не стесняйтесь.

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

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

EDIT:

Сегодня я исследовал проблему еще больше. Вот мои выводы:

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

  • отскок для флага scrollview влияет на поведение жеста панорамирования (перетаскивания), когда он достигает границ содержимого. Если bounces=false, то ваш жест панорамирования остановится на краю, не перенаправляя событие перетаскивания вверх по цепочке (и, следовательно, не прокручивая родительские прокрутки, чтобы показать вам другие изображения). Если bounces=true, то, когда вы дойдете до края и продолжите перетаскивать, события будут перенаправлены в родительский вид прокрутки, и этот вид прокрутки также будет перетащен. Тем не менее, я обнаружил, что перетаскивание во время отскока сокращает расстояние, перетаскиваемое приблизительно на 50%. Это также происходит в приложении «Фотографии».

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

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

Мое решение с этим +1 пикселем к размеру контента частично решает проблему.

РЕДАКТИРОВАТЬ 2013

Мальчик, эти прокрутки - что-то из этого мира: (

После более чем года поисков (шутка ... это было на самом деле 2 дня), я думаю, что нашел хорошее элегантное решение для тройных вложенных просмотров прокрутки. Я создал тестовый проект здесь: https://github.com/reydanro/TripleNestedScrollViews

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

Настройки, которые я использую в своем приложении, немного отличаются от этого вопроса. У меня есть 1 вертикальная прокрутка прокрутки. Внутри него у меня есть несколько горизонтальных постраничных прокруток. Внутри некоторых горизонтальных видов прокрутки у меня есть еще один вид вертикальной прокрутки.

Без исправления , как только вы попадаете на страницу с самым внутренним видом прокрутки, вы в значительной степени застряли там, поскольку жесты вертикальной прокрутки не перенаправляются к самой внешней прокрутке.

Исправление - это пользовательский UIGestureRecognizer, который необходимо добавить к самым внутренним представлениям прокрутки. Этот распознаватель отслеживает события касания и, если он обнаруживает перетаскивание за пределы contentArea, он временно отключает остальные распознаватели scrollview. Это единственный метод, который я обнаружил, чтобы прокрутить представление вперед по цепочке событий

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

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

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