iPhone - 知道UIScrollView是否达到顶部或底部

Spa*_*Dog 79 iphone objective-c uiscrollview uiscrollviewdelegate ios

有没有办法知道一个UIScrollView是否到达顶部或底部内部

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                  willDecelerate:(BOOL)decelerate
Run Code Online (Sandbox Code Playgroud)

谢谢.

Luk*_*uke 194

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
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这就是你所追求的!否则,通过向上面的代码添加更多条件并使用NSLog scrollOffset的值来修改.

  • 如果你在`navigationController`中,你可能想要做更像这样的事情:`scrollOffset <=(0 - self.navigationController.navigationBar.frame.size.height - 20)`和`(scrollOffset + scrollHeight)> = scrollContentSizeHeight` (3认同)

Ale*_*kov 75

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
    }

}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 如果不使用scrollViewDidScroll,我该如何调用它? (3认同)
  • 由于浮点运算的变幻莫测的,我得到一个的1879.05xxx"verticalOffsetForBottom"我contentOffset.y是1879年时在斯威夫特3.底部,所以我改变了`返回scrollViewBottomOffset`为`返回scrollViewBottomOffset.rounded()` (2认同)
  • 在 iOS 11 及更高版本中,您可能需要使用 ` adjustmentContentInset` 而不是 `contentInset`。 (2认同)

ytb*_*yan 31

如果你想要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
    }
}
Run Code Online (Sandbox Code Playgroud)


Rud*_*vič 9

简单而干净的扩展:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

在GitHub上:

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


JPN*_*JPN 5

我想出了确切的方法:

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!
}
Run Code Online (Sandbox Code Playgroud)