Programáticamente, desplácese a UIScrollView a la parte superior de una UIView hijo (subview) en Swift

Tengo un valor de algunas pantallas de contenido dentro de mi UIScrollView que solo se desplaza verticalmente.

Quiero desplazarme mediante progtwigción a una vista contenida en algún lugar de su jerarquía.

El UIScrollView se mueve para que la vista secundaria esté en la parte superior de UIScrollView (ya sea animada o no)

Aquí hay una extensión que terminé escribiendo.

Uso:

Llamado desde mi viewController, self.scrollView es una salida al UIScrollView y self.commentsHeader es una vista dentro de él, cerca de la parte inferior:

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

Código:

Solo necesita el método scrollToView , pero también debe ir en los methods scrollToBottom / scrollToTop , ya que probablemente también los necesite, pero siéntase libre de eliminarlos.

 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(CGRectMake(0, childStartPoint.y, 1, 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) 

o

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

Otra forma es

 scrollView.contentOffset = CGPointMake(x,y); 

y lo hago con animation como esta

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

Donde la coorderada y del punto es la coorderada y del marco de la vista que desea mostrar en relación con la vista de contenido de la vista de desplazamiento .

Para desplazarse a la parte superior o inferior con la finalización de la 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 desinetworkingOffset = CGPoint(x: 0, y: -self.contentInset.top) self.setContentOffset(desinetworkingOffset, animated: false) }, completion: { finish in if finish { completion?() } }) } }