/**
根据总体偏移比例和相关固定值计算滑块起点坐标x, 滑块长度.
@param sliderWidth 滑块静止时的长度
@param points 滑块静止的站点数,也就是标题数量
@param overallLength 按滑块从第一静止站点的左端到最后静止站点右端的总长度
@param rate 外部输入滑动的比例
@return poin.x 为滑块起点坐标x, point.y 为滑块的长度
*/
- (CGPoint)sliderLocationAndLengthWithSliderWidth:(CGFloat)sliderWidth points:(NSUInteger)points overallLength:(CGFloat)overallLength offsetRate:(CGFloat)rate {
if (rate < 0) {
return CGPointMake(0.0, sliderWidth);
}
if (rate > 1) {
return CGPointMake(overallLength - sliderWidth, sliderWidth);
}
// space 滑块之间的间隔
CGFloat space = (overallLength - points * sliderWidth) / (points - 1);
// 细分滑动段数量, 每个锚点之间分起始段和抵达段两段
NSInteger section = (points - 1) * 2;
// 计算总体的滑动比例rate在细分后的哪一段
NSInteger index = 0;
for (int i = 0; i < section; i++) {
CGFloat max = (CGFloat)(i + 1) / section;
index = i;
if (rate < max) {
break;
}
}
// 判断是起始段还是抵达段
BOOL isStart = (index % 2 == 0);
// 计算总体的滑动比例rate, 在细分段中占该段的比例
CGFloat sectionRate = 1.0 / section;
CGFloat minRate = index * sectionRate;
CGFloat progress = (rate - minRate) / sectionRate;
// 计算起始坐标和对应起始坐标的偏移长度
CGFloat x = 0.0;
CGFloat lenght = 0.0;
if (isStart) {
x = (index / 2) * (sliderWidth + space);
lenght = sliderWidth + (sliderWidth + space) * progress;
}else{
x = (index / 2) * (sliderWidth + space) + (sliderWidth + space) * progress;
lenght = sliderWidth + (sliderWidth + space) * (1 - progress);
}
return CGPointMake(x, lenght);
}
毛毛虫滑块
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 一只蝴蝶即使没有了漂亮翅膀也还是蝴蝶,可是一只毛毛虫,即使插上几对翅膀也还是一只不折不扣的毛毛虫,缺少了蜕变的过程...