Ios UIScrollViewDelegate scrollViewDidScroll方法跟不上高速滚动(flick)?

Ios UIScrollViewDelegate scrollViewDidScroll方法跟不上高速滚动(flick)?,ios,uiscrollview,uiscrollviewdelegate,Ios,Uiscrollview,Uiscrollviewdelegate,我有一个uicrollview,带有一个UIView标题,它粘在滚动视图的顶部,随着用户向下滚动,它从全尺寸缩小到小尺寸。当然,这些都是通过滚动视图代理实现的: // scroll view delegate extension SomeViewController { // scroll view did scroll public func scrollViewDidScroll(_ scrollView: UIScrollView) { let cont

我有一个
uicrollview
,带有一个
UIView
标题,它粘在滚动视图的顶部,随着用户向下滚动,它从全尺寸缩小到小尺寸。当然,这些都是通过滚动视图代理实现的:

// scroll view delegate
extension SomeViewController {

    // scroll view did scroll
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let contentOffsetY = scrollView.contentOffset.y

        // make banner sticky
        banner.frame.origin.y = max(0, contentOffsetY)

        // shrink banner
        if contentOffsetY > 0 && contentOffsetY <= bannerHeight! - 64 {
            banner.frame.size.height = bannerHeight! - contentOffsetY
            bannerGraphic.frame = banner.bounds
        }

    }

}
//滚动视图委托
扩展视图控制器{
//滚动视图没有滚动
公共函数scrollViewDidScroll(scrollView:UIScrollView){
让contentOffsetY=scrollView.contentOffset.y
//使横幅粘
banner.frame.origin.y=max(0,contentOffsetY)
//收缩横幅

如果contentOffsetY>0&&contentOffsetY则ScrollView委托不会收到视图滚动的每个点的通知。您真的不希望这样做……这将是太多不必要的处理

因此,当快速滚动时,完全有可能出现较大的间隙。事实上,在一次快速测试中,我刚刚做了
。contentOffsetY
值从0跳到75跳到300

您的代码已关闭。您要做的是在超过最大值时处理该条件

尝试一下(我想它只会出现并取代您的功能):

扩展TestViewController:UIScrollViewDelegate{ //滚动视图没有滚动 公共函数scrollViewDidScroll(scrollView:UIScrollView){ 让contentOffsetY=scrollView.contentOffset.y //使横幅粘 banner.frame.origin.y=max(0,contentOffsetY) //如果scrollView内容一直位于顶部 //(或向下拉,等待“反弹”)
如果contentOffsetYScrollView委托没有收到视图滚动的每一个点的通知。而且您真的不希望这样做……这将是太多不必要的处理

因此,当快速滚动时,完全有可能出现较大的间隙。事实上,在一次快速测试中,我刚刚做了
。contentOffsetY
值从0跳到75跳到300

您的代码已关闭。您要做的是在超过最大值时处理该条件

尝试一下(我想它只会出现并取代您的功能):

扩展TestViewController:UIScrollViewDelegate{ //滚动视图没有滚动 公共函数scrollViewDidScroll(scrollView:UIScrollView){ 让contentOffsetY=scrollView.contentOffset.y //使横幅粘 banner.frame.origin.y=max(0,contentOffsetY) //如果scrollView内容一直位于顶部 //(或向下拉,等待“反弹”)
如果contentOffsetY您希望
banner.frame.size.height
至少为64?还是应该缩小到零?至少为64(状态栏+导航栏)好-并且…如果您在scrollview内容一直位于顶部时向下拉,那么
.contentOffset.y<0
,横幅应该从顶部向下移动?还是保持“固定”到顶部,并保持其原始大小?向下拉动时,横幅不应保持固定状态确定-请参阅我的答案。您希望
横幅.框架.大小.高度
至少为64?还是应该缩小到零?至少为64(状态栏+导航栏)好的-而且…如果您在scrollview内容一直位于顶部时向下拉,那么
.contentOffset.y<0
,横幅是从顶部向下移动?还是保持“固定”到顶部,并保持其原始大小?向下拉时横幅不应保持固定确定-请参阅我的答案。乐于帮助:)乐于帮助:)
extension TestViewController: UIScrollViewDelegate {

    // scroll view did scroll
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let contentOffsetY = scrollView.contentOffset.y

        // make banner sticky
        banner.frame.origin.y = max(0, contentOffsetY)

        // if scrollView content is all the way at the top 
        // (or pulled down, waiting to "bounce back up")

        if contentOffsetY <= 0 {

            // set banner to original height
            banner.frame.size.height = bannerHeight
            bannerGraphic.frame = banner.bounds

        } else {

            // view has scrolled (user has dragged *up*)

            // set banner height to originalHeight - y offset,
            // but keep it a minimum of 64

            banner.frame.size.height = max(bannerHeight! - contentOffsetY, 64)
            bannerGraphic.frame = banner.bounds

        }

    }

}