inside example doesn create iphone uiscrollviewdelegate

iphone - example - uiscrollview programmatically swift



UIScrollView, llegando al final de la vista de desplazamiento (7)

Sé que la documentación de Apple tiene el siguiente método delegado:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt

Sin embargo, no necesariamente significa que estás en la parte inferior. Porque si usa su dedo, se desplaza un poco, luego se desacelera, pero en realidad no se encuentra en la parte inferior de la vista de desplazamiento, aún así se llama. Básicamente quiero una flecha para mostrar que hay más datos en mi vista de desplazamiento, y luego desaparecer cuando esté en la parte inferior (como cuando rebota). Gracias.


Creo que la respuesta de @bensnider es correcta, pero no exótica. Por estas dos razones

1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{}

Este método llamará continuamente si comprobamos if (bottomEdge >= scrollView.contentSize.height)

2. En esto, si buscamos == , también esta condición será válida por dos veces.

  • (i) cuando nos desplazaremos hacia arriba cuando el final de la vista de desplazamiento toque el borde inferior
  • (ii) Cuando el scrollview rebota para retener su propia posición

Siento que esto es más preciso.

Muy pocos casos esta codificación es válida también dos veces. Pero el usuario no se encontrará con esto.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.y == roundf(scrollView.contentSize.height-scrollView.frame.size.height)) { NSLog(@"we are at the endddd"); //Call your function here... } }


Creo que lo que podrías hacer es verificar que tu punto contentOffset esté en la parte inferior de contentSize . Entonces, probablemente puedas hacer algo como:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height; if (bottomEdge >= scrollView.contentSize.height) { // we are at the end } }

Es probable que también necesite un caso negativo allí para mostrar su indicador cuando el usuario se desplaza hacia atrás. También es posible que desee agregar algo de relleno para eso, por ejemplo, puede ocultar el indicador cuando el usuario está cerca de la parte inferior, pero no exactamente en la parte inferior.


En realidad, en lugar de simplemente poner el código de @ bensnider en scrollViewDidScroll, este código (escrito en Swift 3) sería mejor para el rendimiento:

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if !decelerate { checkHasScrolledToBottom() } } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { checkHasScrolledToBottom() } func checkHasScrolledToBottom() { let bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height if bottomEdge >= scrollView.contentSize.height { // we are at the end } }


Entonces, si lo quieres rápido, aquí tienes:

override func scrollViewDidScroll(scrollView: UIScrollView) { if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) { //reach bottom } if (scrollView.contentOffset.y < 0){ //reach top } if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){ //not top and not bottom } }


Funciona en Swift 3 :

override func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) { loadMore() } }


La respuesta aceptada solo funciona si el valor del contenido de contentInset inferior no es negativo. Una ligera evolución consideraría la parte inferior del contentInset independientemente de su signo:

CGFloat bottomInset = scrollView.contentInset.bottom; CGFloat bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height - bottomInset; if (bottomEdge == scrollView.contentSize.height) { // Scroll view is scrolled to bottom }


Vea qué elementos se muestran actualmente en UIView, usando algo como indexPathsForVisibleRows y si su modelo tiene más elementos de los que se muestran, coloque una flecha en la parte inferior.