Как использовать scrollViewWillEndDragging: withVelocity: targetContentOffset, чтобы обеспечить остановку прокрутки только в двух возможных положениях? - PullRequest
0 голосов
/ 11 января 2019

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

Я использую следующие две функции

func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint,
                         withScrollingVelocity velocity: CGPoint) -> CGPoint {
    return CGPoint(x:0,y:self.scrollView.contentSize.height - self.scrollView.bounds.height)
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        if velocity.y > 0 {
            targetContentOffset.pointee.y = scrollView.contentSize.height - scrollView.bounds.height
        } else { 
            targetContentOffset.pointee.y = CGFloat(0)
        }
}

Первая функция никогда не вызывается. Второй вызывается правильно, когда я прокручиваю вверх или вниз, но установка значения pointee.y, кажется, не меняет contentOffset - я все еще могу, например, прокручиваться и останавливаться в середине. Как я могу это сделать?

1 Ответ

0 голосов
/ 11 января 2019

Может быть, добавить представление поверх прокрутки и добавить жест смахивания, например:

 var swipeGesture  = UISwipeGestureRecognizer()
    let directions: [UISwipeGestureRecognizer.Direction] = [.up, .down]
    for direction in directions {
        swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeView(_:)))
        view.addGestureRecognizer(swipeGesture)
        swipeGesture.direction = direction
        view.isUserInteractionEnabled = true
        view.isMultipleTouchEnabled = true
    }


    self.view = view
    scrollView.delegate = self


@objc func swipeView(_ sender : UISwipeGestureRecognizer){
    if sender.direction == .up {
        scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height), animated: true)
    } else if sender.direction == .down {
         scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...