2010-10-12 2 views
6

У меня есть два вложенных UIScrollViews: родительский объект ограничен горизонтальным поисковым вызовом, а ребенок ограничен вертикальной прокруткой. Содержимое представляет собой одно большое представление, которое можно свободно перемещать, но привязывается к одной из трех горизонтальных секций. Поведение типов вложенных прокруток по умолчанию позволяет выполнять только прокрутку в одном направлении за раз, но я хотел разрешить одновременное перетаскивание в обоих направлениях, чтобы сохранить ощущение манипулирования одним большим видом.Вложенная прокрутка UIScrollViews одновременно

Мое настоящее решение участвует изолируя жест вертикальный вид скроллинга и установив его делегатом на мой контроллер зрения:

for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers) 
    if ([gesture isKindOfClass:[UIPanGestureRecognizer class]]) 
     gesture.delegate = self; 

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if (gestureRecognizer.view == scrollView && otherGestureRecognizer.view == pageView) 
     return YES; // allow simultaneous scrolling of pageView and scrollView 

    return NO; 
} 

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

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

+0

Я сделал что-то подобное, я думаю вам, и он работает идеально. Вы пытаетесь в основном иметь большую область для прокрутки вокруг, где постоянно находится верхняя и левая области, говорящие пользователю, где они находятся? – Rudiger

+0

Не совсем; то, что я показываю, это три дерева талантов для класса в MMO-игре. Вместо того, чтобы рассматривать каждое дерево как независимую страницу, я хотел разрешить свободное перемещение вида, но привязать его к одному из деревьев при отпускании перетаскивания.Я видел другие приложения, которые используют подобное поведение, в частности приложение WoW Armory, которое отображает деревья талантов для этой игры. – trevorsm

+0

Ах, пропустите понимание, я немного оглянусь назад, если я что-то придумаю – Rudiger

ответ

3

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

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

2

Просто борется с этим и ударился о стену с помощью «NSInvalidArgumentException», причина: «У распознавателя распознавания жесткого диска UIScrollView должен быть свой вид прокрутки в качестве его делегата». как указано выше Rythmic Fistman.

Найден способ вокруг него ... первый подкласс внутренний UIScrollView и сделать его как

Тогда все, что вам нужно сделать в реализации является:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
return YES; 
} 

Кажется, работает отлично.

+0

сделать это как ... что? –

+0

Я понятия не имею: D –

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