ios - UIScrollView 求当前页数的算法求解!
大家讲道理
大家讲道理 2017-04-17 11:38:26
[iOS讨论组]

看到网上很多都是这样写的:

CGFloat pageWidth = self.scrollView.frame.size.width;
int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

但是我这样也可以:

self.scrollView.contentOffset.x/pageWidth

请问我这样直接除下来和上面有什么不同的? 第一个算法是什么意思呢?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
大家讲道理

举个例子吧
一页的width为320
用方法1的结果
情况1:
contentoffset小于320+160,即在第二页的左半部分,(self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth的结果是0.xxxx,floor结果为0,计算结果为1,即会回到第一页
情况2:
contentoffset大于320+160,即在第二页的右半部分,(self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth的结果是1.xxxx,floor结果为1,page计算结果为2,即会进入第二页

用方法2的结果
self.scrollView.contentOffset.x/pageWidth计算结果都为1.xxx
而page是int类型,系统根据四舍五入自动强制转型

以上为个人理解。。。

天蓬老师

看你用在什么地方了,如果你只是想计算出当前的位置属于第几页,那当然直接除以pageWidth就可以。但是,如果是用在用户正在拖动scrollView,你需要计算出当用户松开手指以后,应该自动滑动到哪一页的时候,就需要用上面的表达式,因为当滑过scrollView的中线的时候松开手指,实际上应该显示下一页了。

伊谢尔伦

先看表达式:(self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth
由于pageWidth和contentOffset.x都是浮点数,所以做除法精度影响可以忽略,因此对表达式可以将除法拆开.
令self.scrollView.contentOffset.x=x, pageWidth=w则:
(x-w/2)/w => x/w - w/2/w => x/w - 0.5, 所以最终表达式为:
floor(x/w - 0.5)+1
所以最终结果就是 floor(self.scrollView.contentOffset.x/pageWidth - 0.5)+1
+1是为了让下表从1开始
floor是向上取整和-0.5放在一起的目的是为了四舍五入
四舍五入是为了让交互更自然,就是用户如果滑过了pageWidth的一半,那么就滚动到下一页,否则就是当前页.
真想不通写这么复杂干嘛.
推荐一种不需要调函数的常用写法(int)(x/w+0.5)+1

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号