2011-10-09 13 views

risposta

166

Implementare il UIScrollViewDelegate nella classe, e quindi aggiungere questo:

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

Spero che questo è ciò che siete dopo! Altrimenti, aggiungete altre condizioni al codice sopra e NSLog il valore di scrollOffset.

+3

Se sei in un 'navigationController', si potrebbe desiderare di fare qualcosa di più simile a questo:' scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20) 'e' (scrollOffset + scrollHeight)> = scrollContentSizeHeight' –

+0

Problema con questo è il rimbalzo ... tutto viene chiamato due volte una volta raggiunto top o bot tom. C'è una soluzione a questo, oltre a disattivare il rimbalzo della vista tabella o collezione? – denikov

+0

@denikov hai trovato qualche soluzione per questo? – Priyal

59

Bene, contentInsets sono anche coinvolti quando si tenta di determinare se scrollView è in alto o in basso. Potresti anche essere interessato a casi in cui la tua scrollView è sopra la parte superiore e sotto nella parte inferiore. Ecco il codice che uso per trovare superiore e inferiore posizioni:

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

buono. È corretto! la risposta precedente è sbagliata. –

+0

Questa buona risposta, implementando scrollviewdidscroll, è dannosa per le prestazioni – Vassily

+2

Come si chiama se non si utilizza scrollViewDidScroll? –

4

ho capito esattamente come farlo:

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

Se si desidera il codice in rapido:

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

Semplice e pulito estensione:

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 
    } 

} 

su GitHub:

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

Problemi correlati