/**
根据总体偏移比例和相关固定值计算滑块起点坐标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);
}
毛毛虫滑块
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一只蝴蝶即使没有了漂亮翅膀也还是蝴蝶,可是一只毛毛虫,即使插上几对翅膀也还是一只不折不扣的毛毛虫,缺少了蜕变的过程...