UIScrollView прокручивать вертикально на ощупь и горизонтально программно - PullRequest
2 голосов
/ 13 июня 2011

Я посмотрел на stackoverflow, но не смог найти ответ, который точно отвечает на мой вопрос. Если я что-то пропустил, пожалуйста, укажите мне правильный вопрос.

Вот мой сценарий -

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

CGRect scrollContainer = CGRectMake(0, 0, 320, 440);
self.baseView = [[UIScrollView alloc] initWithFrame:scrollContainer];
self.baseView.contentSize = CGSizeMake(6400, 440);
self.baseView.bounces = NO;
self.baseView.pagingEnabled = NO;
self.baseView.scrollEnabled = NO;

Основываясь на движении телефона, я смог программно прокрутить -

CGPoint scrollOffset = CGPointMake(x*20, 0);
[self.baseView setContentOffset:scrollOffset];

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

self.baseView.contentSize = CGSizeMake(6400, 4400);

Я все еще хочу программно прокручивать по горизонтали, но дать пользователю возможность прокручивать ТОЛЬКО вертикально по касанию. Итак, я предполагаю, что мне придется сказать scrollEnabled = YES. Но это позволяет пользователю прокручивать в обоих направлениях.

Должен ли я фиксировать события касания и переопределять их? Как бы я узнал, если бы это была горизонтальная или вертикальная прокрутка? Что произойдет, если это действие прокрутки по диагонали?

Я немного невежественен в этом вопросе, поэтому любые отзывы будут с благодарностью.

Ответы [ 4 ]

4 голосов
/ 13 июня 2011

Вы можете использовать UISwipeGestureRecognizer для распознавания серии событий касания как вертикального или горизонтального пролистывания.

// ensure that automatic scrolling is not enabled
scrollView.scrollEnabled = NO;

UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc] 
                                           initWithTarget:self 
                                           action:@selector(handleGesture:)];
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
[scrollView addGestureRecognizer:swipeRecognizer];
[swipeRecognizer release];

В вашем методе handleGesture: теперь вы можете настроить scrollOffset соответствующим образом. Прочтите UIGestureRecognizer для более подробной информации.

4 голосов
/ 13 июня 2011

Вы, вероятно, сможете сделать это, вложив два UIScrollViews.

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

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

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

Это немного сложно, но, по крайней мере, вам не нужно создавать подклассы. : D

(также будет работать только с iOS 3.0+), но это не проблема)

[См. Раздел «Руководство по программированию вида прокрутки для iOS» в разделе «Вложение видов прокрутки»]

3 голосов
/ 13 июня 2011

Я также думаю, что два scrollViews - вот ответ.Если вы не хотите их вкладывать, свяжите их данные в контроллере:

Существует один scrollView, который содержит ваш контент и отключил взаимодействие с пользователем, назовем его contentScrollView, и один невидимый scrollView изтакой же размер сверху interactionScrollView.В контроллере-делегате для обоих устройств реализуйте

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == interactionScrollView)
    {
        CGPoint offset = CGPointMake(yourProgrammaticallySetHorizontalOffset,interactionScrollView.contentOffset.y);
        [contentScrollView setContentOffset:offset];
    }
}

. Вы также можете связать масштабирование таким образом.

1 голос
/ 13 июня 2011

Другая возможность, так как вам, вероятно, не нужна горизонтальная прокрутка , вам просто нужно установить смещение содержимого:

Поместите ваш contentView в scrollView нормально, но установите scrollViewcontentSize как CGPointMake(scrollView.size.width,content.size.height).Это означает, что scrollView никогда не будет прокручиваться по горизонтали.

Теперь из вашего кода вы можете перемещать содержимое по горизонтали: content.frame = CGRectOffset(content.frame, yourPreferredOffset, 0).

Я не проверял это, но яСпасибо, это сработает, и ему нужен только один scrollView.Вы также можете поместить этот изменяющий фрейм материал в анимацию, чтобы он выглядел как прокрутка (что это такое) вместо внезапного изменения содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...