毛毛蟲滑塊

/**
 根據總體偏移比例和相關固定值計算滑塊起點坐標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);
}

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容