2015-05-22 4 views
3

У меня есть два горизонтальных UIScrollview s. Я хочу синхронизировать их прокрутку, когда пользователь перетаскивает пальцы в любой из них. Вот мой код:iOS: Как синхронизировать два UIScrollview

self.topScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
self.topScrollView.delegate = self; 
self.topScrollView.bounces = YES; 

self.bottomScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
self.bottomScrollView.delegate = self; 
self.bottomScrollView.bounces = YES; 
... 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (scrollView == self.topScrollView) 
    { 
     self.bottomScrollView.delegate = nil; 
    } 
    else 
    { 
     self.topScrollView.delegate = nil; 
    } 
    ... 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    ... 
    self.topScrollView.delegate = self; 
    self.bottomScrollView.delegate = self; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    ... 
    self.topScrollView.delegate = self; 
    self.bottomScrollView.delegate = self; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // Sync the two scroll views 
    if (scrollView == self.topScrollView) 
    { 
     [self.bottomScrollView setContentOffset:scrollView.contentOffset animated:NO]; 
    } 
    else 
    { 
     [self.topScrollView setContentOffset:scrollView.contentOffset animated:NO]; 
    } 
    ... 
} 

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

ответ

4

Вы можете использовать topScrollView.panGestureRecognizer и bottomScrollView.panGestureRecognizer, чтобы взять оба распознавателя жестов и добавить их в общий супервизор, охватывающий оба вида прокрутки. Жесты на этом надзоре будут распознаны обоими детьми.

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

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

Я попытался добавить свой контроллер в качестве делегата, но назначение разбилось на следующее исключение: «У распознавателя распознавания жестких дисков UIScrollView должен быть свой вид прокрутки в качестве его делегата» –

+0

Я думаю, что всегда могу подклассировать прокрутку и переопределить метод. Круто, я думаю, это должно сработать. –

0

Я разработал решение в соответствии с ответом jszumski в. Однако, моя ситуация представляет собой два вертикальных UIScrollViews бок о бок (scrollViewLeft и scrollViewRight). Он должен работать для горизонтальных UIScrollViews без особых изменений.

Сначала создайте пользовательский UIScrollView.

//.h file 

@interface CSScrollView : UIScrollView 

@end 

//.m file 

@implementation CSScrollView 


-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 

    return YES; 

} 

@end 

Во-вторых, в вашем MainView,

- (void)viewDidLoad { 

    [super viewDidLoad]; 


    [self.view addGestureRecognizer:self.scrollViewLeft.panGestureRecognizer]; 

    [self.view addGestureRecognizer:self.scrollViewRight.panGestureRecognizer]; 

} 

Это все, что мне нужно создать два синхронизированных scrollviews. Реальный эффект намного лучше, чем обычный способ отправки/подписки уведомлений в scrollViewDidScroll scrollview и синхронизация contentOffset.

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