web-dev-qa-db-fra.com

Faites défiler par programme un UIScrollView vers le haut d'un enfant UIView (sous-vue) dans Swift

Mon écran UIScrollView contient quelques écrans qui ne font que défiler verticalement.

Je souhaite faire défiler par programme une vue contenue quelque part dans sa hiérarchie.

Le mouvement UIScrollView de sorte que la vue enfant se trouve en haut de la vue UIScrollView (animée ou non)

23
dyson returns

Voici une extension que j'ai fini par écrire.

Utilisation:  

Appelé à partir de mon viewController, self.scrollView est une sortie de UIScrollView et self.commentsHeader est une vue à l'intérieur, située vers le bas:

self.scrollView.scrollToView(self.commentsHeader, animated: true)

Code:

Vous avez uniquement besoin de la méthode scrollToView , mais en laissant également dans les méthodes scrollToBottom / scrollToTop -, vous en aurez probablement besoin également, mais n'hésitez pas à les supprimer.

extension UIScrollView {

    // Scroll to a specific view so that it's top is at the top our scrollview
    func scrollToView(view:UIView, animated: Bool) {
        if let Origin = view.superview {
            // Get the Y position of your child view
            let childStartPoint = Origin.convertPoint(view.frame.Origin, toView: self)
            // Scroll to a rectangle starting at the Y of your subview, with a height of the scrollview
            self.scrollRectToVisible(CGRect(x:0, y:childStartPoint.y,width: 1,height: self.frame.height), animated: animated)
        }
    }

    // Bonus: Scroll to top
    func scrollToTop(animated: Bool) {
        let topOffset = CGPoint(x: 0, y: -contentInset.top)
        setContentOffset(topOffset, animated: animated)
    }

    // Bonus: Scroll to bottom
    func scrollToBottom() {
        let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
        if(bottomOffset.y > 0) {
            setContentOffset(bottomOffset, animated: true)
        }
    }

}
65
dyson returns
 scrollView.scrollRectToVisible(CGRect(x: x, y: y, width: 1, height:
1), animated: true)

ou

scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true)

Une autre façon est

scrollView.contentOffset = CGPointMake(x,y);

et je le fais avec animé comme ça 

[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
scrollView.contentOffset = CGPointMake(x, y); }
completion:NULL];
5
Amr Angry
scrollView.setContentOffset(CGPoint, animated: Bool)

Où la coordonnée y du point est la coordonnée y du cadre de la vue que vous voulez montrer par rapport à la vue contenu de scrollView  

3
Max Pevsner

Voici ma réponse, c'est à Swift. Cela fera défiler les pages dans scrollview infiniment.

private func startBannerSlideShow()
{
UIView.animate(withDuration: 6, delay: 0.1, options: .allowUserInteraction, animations: {
    scrollviewOutlt.contentOffset.x = (scrollviewOutlt.contentOffset.x == scrollviewOutlt.bounds.width*2) ? 0 : scrollviewOutlt.contentOffset.x+scrollviewOutlt.bounds.width
}, completion: { (status) in
    self.startBannerSlideShow()
})
}
1
Rahul K Rajan

Pour faire défiler vers le haut ou le bas avec la fin de l'animation

// MARK: - UIScrollView extensions

extension UIScrollView {
    /// Animate scroll to bottom with completion
    ///
    /// - Parameters:
    ///   - duration:   TimeInterval
    ///   - completion: Completion block
    func animateScrollToBottom(withDuration duration:  TimeInterval,
                            completion:             (()->())? = nil) {

        UIView.animate(withDuration: duration, animations: { [weak self] in
            self?.setContentOffset(CGPoint.zero, animated: false)
            }, completion: { finish in
                if finish { completion?() }
        })
    }

    /// Animate scroll to top with completion
    ///
    /// - Parameters:
    ///   - duration:   TimeInterval
    ///   - completion: Completion block
    func animateScrollToBottomTop(withDuration duration:  TimeInterval,
                                  completion:             (()->())? = nil) {
        UIView.animate(withDuration: duration, animations: { [weak self] in
            guard let `self` = self else {
                return
            }
            let desiredOffset = CGPoint(x: 0, y: -self.contentInset.top)
            self.setContentOffset(desiredOffset, animated: false)

            }, completion: { finish in
                if finish { completion?() }
        })
    }
}
0
YannickSteph