Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iPhone-知道UIScrollView是到达顶部还是底部_Ios_Objective C_Iphone_Uiscrollview_Uiscrollviewdelegate - Fatal编程技术网

Ios iPhone-知道UIScrollView是到达顶部还是底部

Ios iPhone-知道UIScrollView是到达顶部还是底部,ios,objective-c,iphone,uiscrollview,uiscrollviewdelegate,Ios,Objective C,Iphone,Uiscrollview,Uiscrollviewdelegate,有没有办法知道UIScrollView是否已到达内部的顶部或底部 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate ? 谢谢。在类中实现UIScrollViewDelegate,然后添加以下内容: -(void)scrollViewDidScroll: (UIScrollView*)scrollView { floa

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

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


谢谢。

在类中实现
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的值。

当您试图确定scrollView是在顶部还是在底部时,
内容插入也涉及其中。您可能还对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
    }

}
扩展UIScrollView{ var isAtTop:Bool{ return contentOffset.y=verticalOffsetForBottom } var verticalOffsetForTop:CGFloat{ 让topInset=contentInset.top 返回-顶部插图 } var verticalOffsetForBottom:CGFloat{ 让scrollViewHeight=bounds.height 让scrollContentSizeHeight=contentSize.height 让bottomInset=contentInset.bottom 让scrollViewBottomOffset=scrollContentSizeHeight+bottomInset-scrollViewHeight 返回滚动视图底部偏移量 } }
目标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
@实现UIScrollView(添加)
-(BOOL)isAtTop{
return(self.contentOffset.y=[self verticalOffsetForBottom]);
}
-(CGFloat)垂直偏移量{
CGFloat topInset=self.contentInset.top;
返回-顶部插图;
}
-(CGFloat)底部垂直偏移{
CGFloat scrollViewHeight=self.bounds.size.height;
CGFloat scrollContentSizeHight=self.contentSize.height;
CGFloat bottomInset=self.contentInset.bottom;
CGFloat scrollViewBottomOffset=scrollContentSizeHeight+bottomInset-scrollViewHeight;
返回滚动视图底部偏移量;
}
@结束

我准确地知道了怎么做:

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

如果您需要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
    }
}
覆盖函数scrollViewDidScroll(scrollView:UIScrollView){
if(scrollView.contentOffset.y>=(scrollView.contentSize.height-scrollView.frame.size.height)){
//触底
}
if(scrollView.contentOffset.y0&&scrollView.contentOffset.y<(scrollView.contentSize.height-scrollView.frame.size.height)){
//不上不下
}
}

简单明了的扩展:

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
    }

}
导入UIKit
扩展UIScrollView{
var scrolledToTop:Bool{
设topEdge=0-contentInset.top
return contentOffset.y=bottomEdge
}
}
在GitHub上:

这样做(对于Swift 3):


如果您使用的是
navigationController
,您可能需要执行类似的操作:
scrollOffset=scrollContentSizeHeight
问题在于反弹…一旦到达顶部或底部,所有内容都会被调用两次。除了关闭表或集合视图反弹之外,还有什么解决方案吗?@denikov你找到解决方案了吗?scrollOffset可能是个好答案,实现scrollviewdidscroll对性能有害。如果不使用scrollviewdidscroll,我该如何称呼它?由于浮点数学的变化莫测,我得到了一个“verticalOffsetForBottom”为1879.05xxx,而我的contentOffset.y在Swift 3中位于底部时为1879。因此我将
return scrollViewBottomOffset
更改为
return scrollViewBottomOffset.rounded()
从iOS 11开始
safeAreaInsets
也包括在内。
scrollView.contentOffset.y+scrollView.bounds.height-scrollView.safeAreaInsets.bottom
欢迎使用SO!在答案中发布代码时,解释代码如何解决OP问题很有帮助:)
class MyClass: UIScrollViewDelegate {

   func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
           //scrolled to top, do smth
        }


    }
}