Блокировка двух прокруток вместе с UISwitch - PullRequest
0 голосов
/ 06 мая 2011

Я ищу небольшую помощь.Я обычно довольно хорошо нахожу то, что мне нужно, но это сложно.

Вот сцена для моего тестового приложения: у меня есть 2 просмотра прокрутки, которые имеют размер 1024x85, и они перемещаются только по горизонтали.У меня также есть UISwitch под ними.Над видами прокрутки у меня есть две метки, которые отображают смещение содержимого каждого вида прокрутки при его перемещении (чтобы я мог видеть, что происходит).

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

Это обновленный код:

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

 CGPoint p = scrollOne.contentOffset;
 CGPoint r = scrollTwo.contentOffset;

 // Print the contentOffset labels
 scrollOneLabel.text = [NSString stringWithFormat:@"%.2f", p.x];
 scrollTwoLabel.text = [NSString stringWithFormat:@"%.2f", r.x];


// If lock is on, the distance between offsets is locked (but limited to max and min)
if (lockSwitch.on) {

    NSInteger offset = scrollOne.contentOffset.x - scrollTwo.contentOffset.x;

    if (scrollView == scrollOne) {

        NSInteger maxOffset = scrollTwo.contentSize.width - scrollTwo.frame.size.width;
        [scrollTwo setContentOffset: CGPointMake(MIN(MAX(0.0,scrollOne.contentOffset.x - offset), maxOffset), 0.0)];

    } else if (scrollView == scrollTwo) {
        NSInteger maxOffset = scrollOne.contentSize.width - scrollOne.frame.size.width;
        [scrollOne setContentOffset: CGPointMake(MIN(MAX(0.0,scrollTwo.contentOffset.x + offset), maxOffset), 0.0)];
    }
}

// If the lock is not on, both move independently
}

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

Заранее благодарен за любую помощь.

1 Ответ

0 голосов
/ 06 мая 2011

Итак, в основном вы хотите сохранить смещение между двумя константами? В этом случае вам нужна переменная, давайте назовем ее offset, которая будет scrollOne.contentOffset.x - scrollTwo.contentOffset.x, и после блокировки их просто среагируем на метод делегата

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // If lock is on, the distance between offsets is locked (but limited to max and min)
    if (lockSwitch.on) {
         if (scrollView == scrollOne) {
             NSInteger maxOffset = scrollTwo.contentSize.width - scrollTwo.frame.size.width;
             [scrollTwo setContentOffset: CGPointMake(MIN(MAX(0.0,scrollOne.contentOffset.x - offset), maxOffset), 0.0)];
         } else if (scrollView == scrollTwo) {
             NSInteger maxOffset = scrollOne.contentSize.width - scrollOne.frame.size.width;
             [scrollOne setContentOffset: CGPointMake(MIN(MAX(0.0,scrollTwo.contentOffset.x + offset), maxOffset), 0.0)];
         }
    }

    // If the lock is not on, both move independently
}

EDIT: Вы должны установить смещение, когда переключатель UIS меняет состояние, а не на каждое событие прокрутки. Привязывайте что-то подобное к вашему UISwitch с помощью метода [addTarget:selector:forControlEvents:]. Помните, что смещение должно быть глобальной переменной в вашем классе.

- (void)lockChanged:(id)sender {
    UISwitch *lock = sender;
    if (lock.on) {
        offset = (int)(scrollOne.contentOffset.x - scrollTwo.contentOffset.x);
    } else {
        offset = 0;
    }
}
...