2013-07-08 4 views
0

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

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

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

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

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

Я прошу прощения за все «прокручивать» слова в предложениях, но я не знаю, как объяснить это лучший способ

+0

scrollview внутри scrollview не рекомендуется шаблон apple.It может привести непредсказуемые результаты –

+0

здесь http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/UIScrollView_pg/NestedScrollViews/NestedScrollViews.html# // apple_ref/doc/uid/TP40008179-CH7-SW2 говорят, что они поддерживаются. К сожалению, я не вижу другого способа добиться этого. Более того, я работаю над большой базой кода, и маловероятно, что мы собираемся реорганизовать это, если это единственный вариант – Vik

+0

Он также говорит *** Примечание: эта прокрутка в этом направлении поддерживается, и существует четкое поведение определенная для функциональности, однако это поведение может быть изменено в будущих версиях iOS. *** –

ответ

0

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

Вы можете попробовать использовать метод gestureRecognizerToFail: gestureRecognizer, чтобы panGestureRecognizer внешнего вида прокрутки требовал, чтобы panGestureRecognizers внешнего scrollViews завершились с ошибкой. Это может заставить прокрутку чувствовать себя немного лагги, и я не уверен, что это решит вашу проблему, но эй, не помешает попробовать.

+0

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

+0

У меня была аналогичная проблема в одном из моих приложений, но я должен был заставить внешний вид прокрутки реагировать только на прокрутку с двумя пальцами. Поэтому я просто отключил panGestureRecognizer во внутренних scrollViews и добавил UISwipeGestureRecognizers для перемещения влево и вправо, теперь работает гладко. Если вы ограничиваете внешнюю прокрутку на 2-пальцевые жесты и какой-то пейджинг во внутренних видах, вы можете попробовать это. – johnyu

+0

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

Смежные вопросы