2011-10-09 9 views

Respuesta

166

implementar el UIScrollViewDelegate en su clase, y luego añadir lo siguiente:

-(void)scrollViewDidScroll: (UIScrollView*)scrollView 
{ 
    float scrollViewHeight = scrollView.frame.size.height; 
    float scrollContentSizeHeight = scrollView.contentSize.height; 
    float scrollOffset = scrollView.contentOffset.y; 

    if (scrollOffset == 0) 
    { 
     // then we are at the top 
    } 
    else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight) 
    { 
     // then we are at the end 
    } 
} 

espero que esto es lo que está después! De lo contrario, tenga un tinker agregando más condiciones al código anterior y NSLog el valor de scrollOffset.

+3

Si estás en un 'navigationController', es posible que desee hacer algo más como esto:' scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20) 'and' (scrollOffset + scrollHeight)> = scrollContentSizeHeight' –

+0

Problema con eso es el rebote ... todo se llama dos veces una vez que llega a la parte superior o bot Tom. ¿Hay alguna solución para eso, además de desactivar el rebote de la vista de tabla o colección? – denikov

+0

@denikov ¿encontró alguna solución para eso? – Priyal

59

Bueno, contentInsets también están involucrados, cuando intenta determinar si scrollView está en la parte superior o inferior. También podría estar interesado en casos cuando su scrollView es sobre en la parte superior y debajo de en la parte inferior. Este es el código que utilizo para encontrar superior e inferior posiciones:

Swift:

extension UIScrollView { 

    var isAtTop: Bool { 
     return contentOffset.y <= verticalOffsetForTop 
    } 

    var isAtBottom: Bool { 
     return contentOffset.y >= verticalOffsetForBottom 
    } 

    var verticalOffsetForTop: CGFloat { 
     let topInset = contentInset.top 
     return -topInset 
    } 

    var verticalOffsetForBottom: CGFloat { 
     let scrollViewHeight = bounds.height 
     let scrollContentSizeHeight = contentSize.height 
     let bottomInset = contentInset.bottom 
     let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight 
     return scrollViewBottomOffset 
    } 

} 

Objective-C:

@implementation UIScrollView (Additions) 

- (BOOL)isAtTop { 
    return (self.contentOffset.y <= [self verticalOffsetForTop]); 
} 

- (BOOL)isAtBottom { 
    return (self.contentOffset.y >= [self verticalOffsetForBottom]); 
} 

- (CGFloat)verticalOffsetForTop { 
    CGFloat topInset = self.contentInset.top; 
    return -topInset; 
} 

- (CGFloat)verticalOffsetForBottom { 
    CGFloat scrollViewHeight = self.bounds.size.height; 
    CGFloat scrollContentSizeHeight = self.contentSize.height; 
    CGFloat bottomInset = self.contentInset.bottom; 
    CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight; 
    return scrollViewBottomOffset; 
} 


@end 
+1

bueno. ¡Esto es correcto! la respuesta anterior es incorrecta. –

+0

Esta es la buena respuesta, implementando scrollviewdidscroll es malo para las realizaciones – Vassily

+2

¿Cómo lo llamo si no utilizo scrollViewDidScroll? –

4

me di cuenta exactamente cómo hacerlo:

CGFloat maxPosition = scrollView.contentInset.top + scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.size.height; 
CGFloat currentPosition = scrollView.contentOffset.y + self.topLayoutGuide.length; 

if (currentPosition == maxPosition) { 
    // you're at the bottom! 
} 
14

Si quiere el código en swift:

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 
    } 
} 
3

simple y limpia extensión:

import UIKit 

extension UIScrollView { 

    var scrolledToTop: Bool { 
     let topEdge = 0 - contentInset.top 
     return contentOffset.y <= topEdge 
    } 

    var scrolledToBottom: Bool { 
     let bottomEdge = contentSize.height + contentInset.bottom - bounds.height 
     return contentOffset.y >= bottomEdge 
    } 

} 

en GitHub:

https://github.com/salutis/swift-scroll-view-edges

Cuestiones relacionadas