#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 и я действительно даже не знаю, как это будет ощущаться при мгновенном свайпе, поэтому, если мне удастся выяснить, как это реализовать, я смогу сравнить их с большей легкостью.