tutorial inside doesn ios swift uiscrollview

ios - inside - Desplazar programáticamente un UIScrollView a la parte superior de un UIView secundario(subvista) en Swift



uiscrollview swift programmatically (6)

Tengo unas pocas pantallas de contenido dentro de mi UIScrollView que solo se desplaza verticalmente.

Quiero desplazarme programáticamente a una vista contenida en algún lugar de su jerarquía.

El movimiento UIScrollView para que la vista secundaria se encuentre en la parte superior de UIScrollView (ya sea animado o no)


Aquí está mi respuesta, esto es rápido. Esto desplazará las páginas en scrollview infinitamente.

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() }) }


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

Uso:

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

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

Código:

Solo necesita el método scrollToView , pero también puede utilizar los métodos 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(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) } } }


Para desplazarse hacia arriba o hacia abajo con la finalización de la animación.

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


Para mí, la cosa era la barra de navegación que se superponía a la pequeña parte del contenido de scrollView. Así que he hecho 2 cosas:

  • Inspector de tamaño - Vista de desplazamiento - Inserciones de contenido -> Cambiar de Automático a Nunca.
  • Inspector de tamaño - Restricciones - "Alinear arriba con" (Restricciones de alineación superior) - Segundo elemento -> Cambiar de Superview.Top a Safe Area.Top y el valor (campo constante) establecido en 0


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 animado como este

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


scrollView.setContentOffset(CGPoint, animated: Bool)

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