UIScrollView: прокрутка только когда разрешено

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

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

Затем я попытался установить для свойства UIScrollView scrollEnabled значение false, пока я не хочу, чтобы UIScrollView начал получать события перетаскивания, но я не могу найти способ, чтобы UIScrollView начал получать события касания во время перетаскивания. Возможно ли это?

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

Я безуспешно играл с hitTest:withEvent:, pointInside:withEvent:, touchesShouldBegin:withEvent:inContentView: и touchesShouldCancelInContentView:.

С тех пор я пробовал еще несколько вещей, но ни один из них не помог. Кроме того, из того, что я нашел, установка delaysContentTouches на false уничтожает отклик прокрутки.

Я хотел бы иметь несколько настоящих переопределенных методов касаний. Методы, которые, если я не назову super, UIScrollView не получит прикосновений.

Мне нужен способ получения UITouches (перетаскивание, начало, отпускание и отмена, а не только нажатие), не влияя на прокрутку UIScrollView, поскольку события UIResponder "касания" исчезают, как только начинается прокрутка. Возможно ли это?


person RileyE    schedule 29.04.2013    source источник


Ответы (2)


Если вы просто хотите обнаружить общие touches, попробуйте прикрепить gesture recognizers как UITapGestureRecognizer к вашему view, они должны работать даже с UIScrollView.

Вы также можете попробовать разместить прозрачный UIView поверх scrollview, который обнаруживает некоторые touches и передает остальное scrollview.

person txulu    schedule 29.04.2013
comment
Передача касаний во время перетаскивания не позволяет прокручивать представление прокрутки. Кроме того, я ищу не тапы, а касания ВСЕХ событий (особенно перетаскивания). - person RileyE; 29.04.2013
comment
Затем попробуйте создать собственный распознаватель жестов, который улавливает нужные вам события. См. Это: developer.apple.com/library/ios/#documentation/uikit/reference/ - person txulu; 29.04.2013
comment
И это может быть полезно: iphonedevsdk. ru / forum / iphone-sdk-tutorials / - person txulu; 29.04.2013
comment
Спасибо, однако, этот второй пост не имеет отношения к делу. Если вы посмотрите здесь, значит, он перестал работать в SDK 3.0. К сожалению, я уже видел большинство из этих вещей. - person RileyE; 30.04.2013
comment
Я понял это с помощью пользовательского UIGestureRecognizer и реализации. Спасибо! - person RileyE; 30.04.2013

При запуске прокрутки сохраняю копию смещения. Затем сверьте с ним, когда закончите прокрутку. Этот код позволяет прокрутку влево, но предотвращает прокрутку вправо.

CGPoint oldOffset;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    oldOffset = scrollView.contentOffset;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.x < oldOffset.x) {
        [scrollView setContentOffset:oldOffset];
    }
}
person zimmryan    schedule 29.04.2013
comment
Я ценю эту мысль, но мне нужны растягивающие штрихи. Это даст мне только расстояние между начальной и конечной точками. - person RileyE; 30.04.2013