尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Normal 和 Fast 的值
UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast的值打印如下:UIScrollViewDecelerationRateNormal(lldb) po import UIKit(lldb) p (UIScrollViewDecelerationRate)UIScrollViewDecelerationRateNormal(UIScrollViewDecelerationRate) 0.998UIScrollViewDecelerationRateFast(lldb) p (UIScrollViewDecelerationRate)UIScrollViewDecelerationRateFast(UIScrollViewDecelerationRate) 0.98999999999999999decelerationRate的数值越小减速越快。UIScrollViewDecelerationRateFast就是浮点数0.99。由于计算机对浮点数表示精度问题显示为0.98999999999999999。2 decelerationRate setter 的实现decelerationRate的设置函数代码比较短直接贴出来:UIKitCore-[UIScrollView setDecelerationRate:]:- 0x1a2a4998c 0: adrp x8, 5091// 1. 读取阈值到 d10x1a2a49990 4: ldr d1, [x8, #0x558]// 2. 将要设置的值与阈值比较0x1a2a49994 8: fcmp d0, d1// 3. 如果要设置的值 阈值w8 置为 1否则w8 置为 00x1a2a49998 12: cset w8, lt0x1a2a4999c 16: adrp x9, 5091// 4. x9 存储 UIScrollViewDecelerationRateNormal 和 UIScrollViewDecelerationRateFast 组成的数组首地址0x1a2a499a0 20: add x9, x9, #0x5a0 ; UIScrollTestParametersLengthAutomatic 128// 5. 将 UIScrollViewDecelerationRateNormal 或者 UIScrollViewDecelerationRateFast 读取到 d00x1a2a499a4 24: ldr d0, [x9, w8, uxtw #3]0x1a2a499a8 28: adrp x8, 4164650x1a2a499ac 32: ldrsw x8, [x8, #0xf9c]0x1a2a499b0 36: add x8, x0, x8// 6. 存储 decelerationRate 到 UIScrollView 对象0x1a2a499b4 40: stp d0, d0, [x8]0x1a2a499b8 44: ret注释1读取阈值到寄存器d1。代码后面会将要设置的值与阈值比较。打印阈值为:(lldb) p $d1(double) 0.99399999999999999可以看到阈值就是0.994。这个阈值正好是UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast的中间值。同样由于计算机浮点数精度问题表示为0.99399999999999999。注释2注释3将要设置的值与阈值进行比较。如果要设置的值比阈值小那么寄存器w8被置为1否则w8被置为0。寄存器w8的值后面会看到成为数组索引。注释4将UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast组成的数组首地址读入寄存器x9。可以打印这个数组的内容:(lldb) x/2fg $x90x1a3e2c5a0: 0.9980x1a3e2c5a8: 0.98999999999999999从打印内容可以看到数组第一项是UIScrollViewDecelerationRateNormal数组第二项是UIScrollViewDecelerationRateFast。注释5根据寄存器w8做索引读入相应的值到寄存器d0。如果要设置的值比阈值大那么就读入UIScrollViewDecelerationRateNormal否则读入UIScrollViewDecelerationRateFast。注释6将最终的值存入到UIScrollView对象中。存储decelerationRate的实例变量相对于UIScrollView首地址偏移量存储在寄存器x8打印为:(lldb) p/x $x8(unsigned long) 0x0000000000000358通过_ivarDescription方法打印UIScrollView的所有实例变量经过尝试可以发现偏移量0x358处的实例变量为_decelerationFactor:(lldb) po class_getInstanceVariable(UIScrollView.class, “_decelerationFactor”)0x000000020a6adbd8(lldb) po ivar_getOffset(0x000000020a6adbd8)0x0000000000000358_decelerationFactor是一个结构体存储这水平和垂直减速比例值:_decelerationFactor (struct CGSize): {0.998, 0.998}总结一下如果设置UIScrollView的decelerationRate属性系统会将设置的值与阈值0.994进行比较:如果设置的值大于阈值那么系统会选择UIScrollViewDecelerationRateNormal;如果设置的值小于阈值那么系统会选择UIScrollViewDecelerationRateFast。也就是说无论外界设置何种值系统只会在UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast中进行选择。3 decelerationRate getter 的实现decelerationRate的getter方法也很短代码如下:UIKitCore-[UIScrollView decelerationRate]:0x1a3ba2354 0: adrp x8, 4120240x1a3ba2358 4: ldrsw x8, [x8, #0xf9c]// 1. 读取 _decelerationFactor 的水平值- 0x1a3ba235c 8: ldr d0, [x0, x8]0x1a3ba2360 12: ret注释1寄存器x8存储这_decelerationFactor结构体相对于UIScrollView首地址的偏移量:(lldb) p/x $x8(unsigned long) 0x0000000000000358这里将_decelerationFactor的水平值读取出来作为结果返回。4 _decelerationFactor 结构体如果我们直接设置UIScrollView的decelerationRate属性系统始终会把设置的值调整为预定义的UIScrollViewDecelerationRateNormal或者UIScrollViewDecelerationRateFast。那么我们能否直接设置_decelerationFactor结构体从而使用不同的减速系数呢通过调用_methodDescription查看UIScrollView的所有方法可以找到如下2个私有方法:(void) setHorizontalScrollDecelerationFactor:(double)arg1; (0x138bd7d00)(void) setVerticalScrollDecelerationFactor:(double)arg1; (0x138bd7d70)这两个方法这是设置_decelerationFactor结构体的水平值和垂直值。我们先看setHorizontalScrollDecelerationFactor:方法的实现垂直方法的实现类似:UIKitCore-[UIScrollView setHorizontalScrollDecelerationFactor:]:- 0x1a3ba2378 0: adrp x8, 4120240x1a3ba237c 4: ldrsw x8, [x8, #0xf9c]// 1. 将设置的值直接存入到 _decelerationFactor 结构体的水平分量0x1a3ba2380 8: str d0, [x0, x8]0x1a3ba2384 12: ret注释1将设置的值直接存入到_decelerationFactor结构体的水平分量。因此通过上面两个私有方法就可以设置decelerationRate的值为[0, 1)直接的值。注意不能通过上面2个私有方法将decelerationRate的值设置为1.0否则滚动时会发生崩溃。比如如果我们调用setVerticalScrollDecelerationFactor:方法将垂直减速系数设置为0.999999那么就会发现拖动UIScrollView之后的减速非常缓慢。
RELATED

相关推荐

mlx-community/gemma-4-e2b-it-mxfp8 vs 原版Gemma-4:mxfp8量化技术如何让Apple芯片性能飙升?

mlx-community/gemma-4-e2b-it-mxfp8 vs 原版Gemma-4:mxfp8量化技术如何让Apple芯片性能飙升?

mlx-community/gemma-4-e2b-it-mxfp8 vs 原版Gemma-4:mxfp8量化技术如何让Apple芯片性能飙升? 【免费下载链接】gemma-4-e2b-it-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-e2b-it-mxfp8 在人工智能快速发展的今…

📅 2026/9/17 17:01:09
对比实验:chartreader-0.8B-OptiQ-4bit vs 基础模型,谁才是图表问答的终极解决方案?

对比实验:chartreader-0.8B-OptiQ-4bit vs 基础模型,谁才是图表问答的终极解决方案?

对比实验:chartreader-0.8B-OptiQ-4bit vs 基础模型,谁才是图表问答的终极解决方案? 【免费下载链接】chartreader-0.8B-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/chartreader-0.8B-OptiQ-4bit chartr…

📅 2026/10/27 22:04:12
为什么ExusData是机器人学习的最佳选择:10个关键优势

为什么ExusData是机器人学习的最佳选择:10个关键优势

为什么ExusData是机器人学习的最佳选择:10个关键优势 【免费下载链接】ExusData 项目地址: https://ai.gitcode.com/psibot-ai/ExusData 在机器人学习和人工智能快速发展的今天,高质量的数据集成为了推动技术进步的关键因素。ExusData作为一个专…

📅 2026/10/7 12:50:18
MORE NEWS

更多资讯

📰

洛阳哪里可以考电工证值不值得考

洛阳哪里可以考电工证值不值得考 你是不是也跟很多人一样, 不知道去哪报名怕被中介坑 ?尤其是在洛阳,电工证作为特种作业操作证的一种,对于从事电力安装、维护、检修等相关工作的人员来说,简直是“饭碗”级别的证件。但现实中,很多人却因为信息不对称…

📰

电工证年审考的什么官方回应来了!洛阳电工人别慌

电工证年审考的什么官方回应来了!洛阳电工人别慌 证书过期了不知道怎么复审延期?这是很多在洛阳干建筑的电工最怕遇到的问题。特别是低压电工证、高压电工证这类特种作业操作证,一旦过期就等于失去了工作的“通行证”。最近官方回应明确表示,…

📰

江西高校电工证事件多少钱能搞定外省证书转移

江西高校电工证事件多少钱能搞定外省证书转移 之前考的证在外省能不能转过来,这是很多在外地打工的电工最关心的问题,尤其是在江西高校电工证事件之后,证书的权威性和迁移问题更是成为了大家关注的焦点。你可能也在问, 多少钱…

📰

江西高校电工证事件怎么转异地 电工证多少钱能办下来

江西高校电工证事件怎么转异地 电工证多少钱能办下来 现在找工作,特种作业证几乎是门槛,尤其是电工证,没有它连工地都进不去。你是不是也遇到过这样的问题: 江西高校电工证事件 闹得沸沸扬扬,证书真假难辨,还牵扯到异地转证的麻烦?更糟的是,…

📰

低压电工证有用么官方回应:怕考不过白交培训费?三门峡班组负责人亲测

低压电工证有用么官方回应:怕考不过白交培训费?三门峡班组负责人亲测 怕考不过白交培训费?低压电工证有用么?官方回应来了,别再当“交钱就完事”的冤种了。最近我们这边有好几位劳务班组负责人,都是因为没搞清楚政策,报名培训后又因为各种原因放弃考试…

📰

哈尔滨怎样考取电工证?2026河南最新政策下如何顺利取证

哈尔滨怎样考取电工证?2026河南最新政策下如何顺利取证 你还在为找不到工作发愁?特种作业证成了门槛,尤其是电工证,成了很多人的“上岗通行证”。2026年河南最新政策下,电工证报考、考试、复审流程都在调整,很多人还不清楚怎么操作,更别提在哈…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬