“scrollViewDidScroll”无法连续捕获移动

2024-03-24

我正在编写程序来在滚动 UITableView 时移动名为“myView”的 UIView,请看下面的图片:

“myView”会随着tableview的contentoffset的变化而改变它的'y坐标',我编写的主要代码是:

func scrollViewDidScroll(scrollView: UIScrollView) {

        let off_y = scrollView.contentOffset.y
        let new_y = originalMyViewY - off_y

        if new_y <= 0 {
            print("bad new_y : \(new_y)")
            return
        }
        else {
            print("right new_y: \(new_y)")
        }

        var frame = self.myView.frame
        frame.origin.y = new_y
        self.myView.frame = frame                                    
}

当我以正常速度滚动桌面视图时,这非常有效。但是,如果我非常快地滚动表格视图,“myview”将在到达顶部边缘之前停止。这是日志显示的内容:

right new_y: 56.0
bad new_y : -92.5
bad new_y : -153.5
bad new_y : -206.0

似乎是委托方法scrollViewDidScroll没有捕捉到导致值跳跃的每一个滚动运动。

我想知道原因以及如何解决,谢谢!


发生这种情况的可能原因是应用程序接收到的触摸发生的速度快于屏幕的刷新率。因此,某些中间滚动点将会被错过。

刷新率

iOS 设备通常以 60hz 或每秒 60 帧的速度运行。这意味着每 1/60 秒或 0.016666 秒屏幕和数字化仪将尝试刷新触摸的当前状态。

如果您的手指在该时间段内的移动速度比下一个时间段快于 0.5 个显示点scrollViewDidScroll委托方法将报告较新的位置,并且从不报告中间位置。

Solution

我建议将结果“限制”在您的预期范围内,而不是直接使用委托方法中的值。在这种情况下,您似乎不想收到负数。这意味着如果您希望原点 y 值至少为 0,那么您应该从委托中获取该值,如果它小于 0,请将视图的原点设置为 0,否则使用您的计算结果。

Example:

func scrollViewDidScroll(scrollView: UIScrollView) {

    let off_y = scrollView.contentOffset.y
    var new_y = originalMyViewY - off_y // make this mutable so we can change it in the <= 0 block

    if new_y <= 0 {
        print("y is less than 0, clamp y origin to 0")
        new_y = 0
    }
    else {
        print("right new_y: \(new_y)")
    }

    var frame = self.myView.frame
    frame.origin.y = new_y
    self.myView.frame = frame                                    
}

Note:这不应该导致视图大小的跳跃调整,因为scrollView应该已经在接近屏幕刷新率的情况下报告了这个scrollViewDidScroll。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“scrollViewDidScroll”无法连续捕获移动 的相关文章

随机推荐

  • 使用 ui 路由器实例化作用域和控制器

    我对控制器何时实例化感到困惑 另外 在嵌套状态时控制器如何实例化 我可能会感到困惑范围如何附加到视图和控制器 也就是说 如果每个视图都有自己的控制器和范围 或者它们共享相同的范围 有人可以解释一下控制器何时被实例化吗 在嵌套路由下 所有视图
  • 获取 Gallery Intent 选择的图像路径时出错(Android 6 - 某些设备)

    当用户从图库中选择时 有意 我试图获取图像的路径 它一直工作正常 因为一些用户注意到 Android 6 0 无法做到这一点 我尝试过不同的方法 有些解决方案可以在 Android 6 0 的模拟器中运行 但不能在我的 Android 6
  • 如何退出 Android 应用程序?

    我刚刚读到 您只需调用以下命令即可退出 Android 应用程序 finish 然而 这种情况并非如此 当我这样做时 我收到以下错误 PackageInstallationReciever Remove data local tmp com
  • 为 SSL 配置 MAMP

    好吧 各位编码员 我正在尝试在我的 mac 上使用 SSL 配置 MAMP 以用于开发目的 我已阅读并尝试了以下说明 http www emersonlackey com article mamp with ssl https http w
  • Groovy 执行“cp *”shell 命令

    我想复制文本文件并且仅复制来自src to dst groovy 000 gt cp src txt dst execute text gt groovy 000 gt 您可以看到命令执行时没有错误 但文件src test txt不会被复制
  • 隐藏 webBrowser 控件中的滚动条

    我正在研究 Windows 窗体的 HTML 显示控件 我使用 webBrowser 控件作为控件的基础 我需要隐藏 webBrowser 滚动条 因为它看起来很糟糕 永远不会被使用 并且使控件看起来像网页 从而破坏了布局 目前 滚动条在控
  • .Net core 3:手动添加框架依赖项

    自从3 0版本发布以来 现在可以在 net core中编写WPF应用程序 这真是太棒了 另一方面 在 net core 上 依赖系统现在依赖于完整的框架 不再有多个 nuget 依赖项 除非您想要在同一个应用程序中混合使用 WPF 和 AS
  • Java,BorderLayout.CENTER,获取JPanel的宽度和高度

    我正在使用 Swing 和 AWT 针对听众 制作一个小程序 我在获取 JPanel 名为 Chess 的类 的大小时遇到 问题 我的布局 public class Main extends JFrame implements MouseL
  • 在 Typo3 中实现 HTML 模板,内容不起作用或者是我的错误

    我尝试在typo3中实现html模板 通过本教程 http wiki typo3 org Templated Tutorial Basics http wiki typo3 org Templating Tutorial Basics 所有
  • 使用 xsi:nil="true" C# 序列化删除 xml 元素

    我有一个 XML 其中包含一些值 有时可能存在空值 如下所示 我根本不希望在 XML 中列出带有 null 的节点 元素已设置IsNullable true在课堂里 任何建议 因为我在谷歌中尝试了很多东西 没有任何帮助
  • 更改 pandas 中的默认选项

    我想知道是否有任何方法可以更改 pandas 的默认显示选项 我想在每次运行 python 时更改显示格式和显示宽度 例如 pandas options display width 150 我看到默认值是硬编码的pandas core co
  • 部署.NET Web应用程序时如何获取预编译的razor文件?

    我的任务是改进服务器上应用程序的 IIS 预加载和初始化 我已经在IIS上实现了应用程序初始化和应用程序预加载 但回收 重新启动应用程序池时仍然有很长的等待时间 我找到了一些有用的链接 我认为这些链接对我有帮助 但我仍然没有获得预编译的 R
  • 通过引用切片为不可变字符串,而不是复制

    如果你使用string split http docs python org library stdtypes html str split对于 Python 字符串 它返回字符串列表 这些已拆分的子字符串是其父字符串部分的副本 是否有可能
  • Spring Boot 中的代理设置

    我的应用程序需要从 Web 获取 XML 文件 如下所示 Bean public HTTPMetadataProvider metadataProvider throws MetadataProviderException String m
  • 未排序数组中的前 5 个元素

    给定一个未排序的数组 我们需要以有效的方式找到前 5 个元素 但我们无法对列表进行排序 我的解决方案 找到数组中的最大元素 在 处理 使用此最大元素后删除它 重复步骤 1 和 2 k 次 本例中为 5 次 时间复杂度 O kn O n 空间
  • WooCommerce - 发送有关自定义订单状态更改的自定义电子邮件

    我添加了自定义状态wc order confirmed Register new status function register order confirmed order status register post status wc o
  • OS X Lion 中的 easy_install pip 需要 sudo 吗?

    我从工作中的 Snow Leopard 转到家里的 Lion 安装 我不记得必须 sudo easy install pip 狮子需要这个吗 在我这样做之前我遇到了错误 pip 最终出现在这里 some computer which pip
  • 大规模分布式系统中的日志文件

    我在网格和 HPC 领域做了很多工作 对于分布在数百 或在某些情况下数千 服务器上的系统 我们面临的最大挑战之一是分析日志文件 当前日志文件本地写入每个刀片上的磁盘 但我们也可以考虑使用 UDP Appender 等发布日志信息并集中收集
  • PyDSTool 与 anaconda 未正确安装

    我正在尝试使用 anaconda2 安装 PyDSTool conda install PyDSTool 这似乎进展顺利 但是当我打开spyder并导入PyDSTool时 它给了我错误 import PyDSTool Traceback m
  • “scrollViewDidScroll”无法连续捕获移动

    我正在编写程序来在滚动 UITableView 时移动名为 myView 的 UIView 请看下面的图片 myView 会随着tableview的contentoffset的变化而改变它的 y坐标 我编写的主要代码是 func scrol