2011-10-09 12 views
58

に達したかどうかを知ることはUIScrollViewiPhone - UIScrollViewのは、上部または下部

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate 

の内側上部または下部に達しているかどうかを知る方法はありますか?

ありがとうございました。

答えて

166

は、あなたのクラスでUIScrollViewDelegateを実装した後、これを追加します。

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

希望、これはあなたが後にあるものです!それ以外の場合は、上記のコードに条件を追加してscrollOffsetの値をNSLogに追加します。あなたはscrollViewが上部にまたは下部にあるかどうかを判断しようとすると、

+3

あなたは 'navigationController'にしている場合、あなたはより多くのこのような何かをしたい場合があります:' scrollOffset <=(0 - self.navigationController.navigationBar.frame.size.height - 20) 'と'(scrollOffset + scrollHeight)> = scrollContentSizeHeight' –

+0

その通報はバウンスです...すべてが二回に一度、トップやボットに達する呼び出されますトムそこには、テーブルやコレクションビューのバウンスをオフにする以外に、その解決策はありますか? – denikov

+0

@denikovあなたはその解決策を見つけましたか? – Priyal

59

まあ、contentInsetsも、関与しています。あなたのscrollViewが上記上部と下部に以下あるときにも、例に興味があるかもしれません。

スウィフト:ここに は、私は上部と下部の位置を見つけるために使用コードです

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

良いです。これは正しいです!前の答えは間違っています。 scrollviewdidscrollを実装 –

+0

これは良い答えは、performences scrollViewDidScrollを使用していない場合、私はそれを呼び出すにはどうすればよい – Vassily

+2

に悪いのですか? –

4

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

あなたは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

シンプルでクリーンな拡張子:GitHubの上で

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 
    } 

} 

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

関連する問題