Как прокрутить набор UIScrollViews вместе? - PullRequest
3 голосов
/ 03 марта 2010

Настройка: у меня есть UITableView, у каждого UITableViewCell есть UIScrollView. Я пытаюсь заставить все UIScrollViews прокручивать вместе, чтобы при прокрутке одного из них все UIScrollViews одновременно прокручивались.

То, что я сделал, это подкласс UITableView, чтобы он содержал массив всех UIScrollViews в своих ячейках таблицы. Затем я перенаправил TouchesBegan, TouchesMoved, TouchesCancelled и TouchesEnded из UITableView на все UIScrollViews в массиве.

Это не похоже на работу. UIScrollViews не прокручивать! Единственный способ заставить это работать - вызвать метод setContentOffset: на scrollviews. Тем не менее, это довольно плохое решение, так как оно не дает вам возможности смахивания и замедления UIScrollView.

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

Ответы [ 3 ]

6 голосов
/ 03 марта 2010

Хорошо, все заработало. Спасибо за подсказки Рики!

2 вещи, которые нужно добавить к решению Рики: если вы хотите избежать бесконечного цикла, вы должны проверить, установлены ли свойства отслеживания или перетаскивания scrollView. Это гарантирует, что только ScrollView, который фактически перетаскивается, вызывает делегат.

- (void)scrollViewDidScroll:(UIScrollView *) theScrollView { 
         if (theScrollView.dragging || theScrollView.tracking) 
              [self.delegate scrolling:[theScrollView contentOffSet]]; 
}

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

2 голосов
/ 03 марта 2010

Я сделал что-то «похожее», когда у меня было 4 scrollView, включенных в родительское представление. Я поместил scrollView внутри UIView, этот UIView был передан делегату из его parentView, который был видом, который отслеживал все scrollViews. UIView, содержащий scrollVIew, реализовал UIScrollViewDelegate и этот метод;

- (void)scrollViewDidScroll:(UIScrollView *) theScrollView {

    [self.delegate scrolling:[self.scrollView contentOffSet]];

}

Теперь родительский вид делал это на всех scrollViews:

- (void) scrolling:(CGFloat) offset {

    for(UIScrollView *s in self) {
        [s setContentOffset:offset animated:YES];
    }
}

Конечно, это немного напрягает процессор, но прокрутка нескольких представлений будет при любых обстоятельствах: /

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

Добавлено:

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

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

Последующая идея для облегчения использования процессора. добавьте каждое представление прокрутки в ячейку, установите его тег = 14, теперь, когда прокрутка запрашивается только для всех видимых ячеек, запрашивается viewWithTag = 14, установите для этого contentOffset. Сохраните смещение содержимого глобально, чтобы вы могли назначить его ячейкам, которые прокручиваются на экране в cellForRowAtIndexPath.

Так что установите offSet в глобальное свойство, в cellForRowAtIndexPath найдите представление с тегом = 14, установите его смещение. Таким образом, вам даже не нужна ссылка на scrollViews только для делегата.

0 голосов
/ 27 июля 2011

Если у вас UIScrollView другого размера и вы используете подкачку, это прекрасно работает:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView {
    #pragma unused(_scrollView)
    categoryPageControlIsChangingPage = NO;
    for (UIImageView *iv in [categoryScrollView subviews]) {
        iv.alpha = (iv.tag != categoryPageControl.currentPage+1)?0.5f:1.0f;
        ILogPlus(@"%i %i", iv.tag, categoryPageControl.currentPage+1);
    }
    [self scrolling:_scrollView];
}

- (void)scrolling:(UIScrollView *)sv {
    CGFloat offsetX = sv.contentOffset.x;
    CGFloat ratio = offsetX/sv.contentSize.width;

    if ([sv isEqual:categoryScrollView]) {
        [categoryScrollViewLarge setContentOffset:CGPointMake(ratio*categoryScrollViewLarge.contentSize.width, 0) animated:YES];
    }else {
        [categoryScrollView setContentOffset:CGPointMake(ratio*categoryScrollView.contentSize.width, 0) animated:YES];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...