#ios #uiscrollview
#iOS #uiscrollview
Вопрос:
Я использую UIScrollView
в своем приложении и использую scrollviewDidScroll
метод для перемещения некоторых других представлений, которые не находятся внутри scrollview. Такое поведение должно происходить только тогда, когда пользователь фактически перемещает scrollview пальцем, а не когда заканчивается событие касания.
В настоящее время я использую dragging
свойство scrollview, чтобы получить это поведение, но у него есть проблема: когда пользователь проводит пальцем по scrollview и снова касается его, прежде чем он перестал замедляться, dragging
свойство неверно, хотя пользователь перетаскивает scrollview пальцем.
Комментарии:
1. Загляните в
UIGestureRecognizerState
свой TableView, напримерyourTableView.panGestureRecognizer.state
. Это покажет, в каком именно состоянии находится касание пользователя. Сделайте это вscrollViewDidScroll
.2. Выполнено. С помощью примера кода
Ответ №1:
У UIScrollView
есть panGestureRecogniser
свойство, которое отслеживает жесты панорамирования в режиме прокрутки. Вы можете отслеживать state
жест панорамирования в scrollViewDidScroll
, чтобы точно знать, в каком состоянии находится панорамирование.
Swift 4.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.isEqual(yourScrollView) {
switch scrollView.panGestureRecognizer.state {
case .began:
// User began dragging
print("began")
case .changed:
// User is currently dragging the scroll view
print("changed")
case .possible:
// The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
print("possible")
default:
break
}
}
}
Objective-C
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if ([scrollView isEqual:yourScrollView]) {
switch (scrollView.panGestureRecognizer.state) {
case UIGestureRecognizerStateBegan:
// User began dragging
break;
case UIGestureRecognizerStateChanged:
// User is currently dragging the scroll view
break;
case UIGestureRecognizerStatePossible:
// The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
break;
default:
break;
}
}
}
Ответ №2:
IMO лучший ответ — использование UIScrollViewDelegate
, есть следующие уведомления:
// called on start of dragging (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
Комментарии:
1. Вам также нужно будет прослушать
scrollViewDidScrollToTop
.2. @kelin как это связано с пользовательским касанием?
3. Это событие вызывается, когда пользователь дважды касается строки состояния. Это приводит к прокрутке табличного представления вверх. Подробнее читайте в
UIScrollViewDelegate
документации.4. и как это связано с вопросом?
Ответ №3:
var lastVelocityYSign = 0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let currentVelocityY = scrollView.panGestureRecognizer.velocity(in: scrollView.superview).y
let currentVelocityYSign = Int(currentVelocityY).signum()
if currentVelocityYSign != lastVelocityYSign amp;amp;
currentVelocityYSign != 0 {
lastVelocityYSign = currentVelocityYSign
}
if lastVelocityYSign < 0 {
print("SCROLLING DOWN")
} else if lastVelocityYSign > 0 {
print("SCOLLING UP")
}
}
Ответ от Mos6y
https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004