мгновенный свайп с помощью UIScrollView

#iphone #uiscrollview

#iPhone #uiscrollview

Вопрос:

Я пишу это приложение, которое представляет собой флеш-карту, я хотел бы создать пользовательский интерфейс, который показывает другую карточку, иначе страницу, когда пользователь проводит горизонтальным свайпом. Мне пришла в голову идея использовать UIScrollView , но проблема в том, что я хочу, чтобы в режиме прокрутки отображалась следующая страница, как только произойдет свайп, и даже если я хочу включить подкачку, для ее запуска необходимо провести по ней пальцем как минимум до половины размера просмотра, вот два разных метода, которые я пробовал:

Сначала я отключаю прокрутку из UIScrollView (используя scrolEnabled ), чтобы она передавала событие swipe в цепочку ответчиков, затем добавила распознаватель жестов правого свайпа в соответствующий вид. Проблема с этим подходом заключается в том, что часто распознавателю жестов не удается сообщить о событии свайпа.

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

 - (void) scrollViewDidScroll:(UIScrollView *)scrollView{
    static CGFloat lastScrollOffset;
    static BOOL hasScrolled;

    if (lastScrollOffset > theScrollView.contentOffset.x amp;amp; !hasScrolled){
        NSLog(@"left Swipe");
        [theScrollView scrollRectToVisible:CGRectMake(0, 0, 320, 480) animated:YES];
        if (theScrollView.contentOffset.x == 320) 
            hasScrolled = NO;
        hasScrolled = YES;
    }
    if (lastScrollOffset < theScrollView.contentOffset.x amp;amp; !hasScrolled){
        NSLog(@"right Swipe");
        [theScrollView scrollRectToVisible:CGRectMake(320, 0, 320, 480) animated:YES];
        if (theScrollView.contentOffset.x == 0) 
            hasScrolled = NO;
        hasScrolled = YES;
    }
    lastScrollOffset = theScrollView.contentOffset.x;
}
  

не работает должным образом.

Я заметил, что scrollRectToVisble отменяется при повторном касании. Насколько точны мои предположения?

Есть ли лучший подход к этой проблеме?

Ответ №1:

Если вы отключаете прокрутку, то, вероятно, вы не хотите использовать UIScrollView 🙂

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

Комментарии:

1. спасибо, приятель:) я использую CGAffineTransformMakeTranslation , и это работает отлично, проголосую за ваш ответ, когда когда-либо смогу. еще раз приветствую

2. Нет проблем — после публикации этого я понял, что еще одним преимуществом этого метода будет отсутствие необходимости создавать все карточки за один раз, создавать их только тогда, когда вам нужно — должно помочь сохранить приложение быстрым и снизить потребление памяти 🙂

3. думаю, нужно опубликовать это в новом вопросе, но я загружаю свой view из nib, следующая карта почти такая же, как первая карта, но с другим вопросом, проблема с CGAffineTransformMakeTranslation в том, что она перемещает view, тогда я должен создать view, похожий на другой view, чтобы он занял свое место к моменту перемещения исходного view. должен быть лучший подход к этому, не так ли?

4. Нет, это звучит примерно так — just может создать класс QuestionView, который расширяет View, чтобы вам было легко создавать view для каждого вопроса, но как бы вы это ни делали, это правильный подход.

5. то, что я придумал, заключалось в том, чтобы сделать снимок текущего вида, затем переместить вид на ширину обзора, затем анимировать фотографию в сторону экрана и анимировать исходный вид с другой стороны в центр. но вот новый вопрос (продвигающий вашу идею), если я переместу исходный вид на другую сторону экрана, то как я собираюсь легко получить доступ к объектам просмотра в новом представлении? одним из способов было бы переназначить ivar для новых объектов просмотра путем их циклического тестирования

Ответ №2:

Я не думаю, что там что-то называется UISwipeView , но это просто примечание.

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

РЕДАКТИРОВАТЬ: Даже если у вас слишком много карточек для реализации такого решения, вы все равно можете использовать UIScrollView с включенной подкачкой. Однако для этого потребуется еще немного поработать.

ПРАВКА 2: Я только что понял, что неправильно прочитал ваш вопрос, прежде чем ответить. Я не понимаю, почему вы не хотели бы использовать подкачку. Я думаю, что подкачка обеспечивает лучшую обратную связь с пользователем, чем просто мгновенное переключение карт.

Комментарии:

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