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)
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)
}
}
}
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];
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
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()
})
}
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?() }
})
}
}