надеюсь, я еще не слишком поздно, но я думаю, что у меня есть решение вашей проблемы.
Здесь вы можете найти проект 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: я не проверял, что происходит с зумом, но я не вижу причин, почему этот метод не должен работать (или быть адаптирован к работе).