进度条的封装

583 阅读1分钟

屏幕快照 2019-08-24 下午2.41.20

提供的方法

/// 已经高亮的节点view数组 数组
@property (nonatomic,strong,readonly) NSArray <PYBasePointProgressContentView *> *selectedPointArray;

/// 所有的节点view数组
@property (nonatomic,strong,readonly) NSArray <PYBasePointProgressContentView *>* allPointViewArray;

/// 节点view的y值占self的比例
@property (nonatomic,assign) CGFloat  pointViewScaleCenterY;

/// 当前的进度 赋值后 更新进度并 产生动画
@property (nonatomic,assign) CGFloat currentProgress;

/// 设置 当前进度
- (void) setCurrentProgress:(CGFloat)currentProgress andAnimation: (BOOL) isAnimation;

/// 设置当前进度 根据真实的宽度
- (void) setCurrentProgressWithWidth: (CGFloat) width andAnimation: (BOOL) animation;


/**
 /// 当前的进度 赋值后 更新进度并 产生动画
 @param view 进度到view的中心
 @param offsetX 中心偏移多少px
 */
- (void) reloadProgressToViewCenter: (PYBasePointProgressContentView *) view andOffset: (CGFloat) offsetX;

/// 前面的进度条 的样式
@property (nonatomic,assign) PYBasePointProgressLineData frontLineStyle;

/// 背景进度条 的样式
@property (nonatomic,assign) PYBasePointProgressLineData normalLineStyle;

/// 进度动画代理
@property (nonatomic,weak) id <PYBasePointProgressProtocol> frontLineAnimationDelegate;

/// 进度条动画时长
@property (nonatomic,assign) CGFloat animationDuration;

/// 背景进度条动画时长
@property (nonatomic,assign) CGFloat bgAnimationDuration;

@property (nonatomic,strong) PYBasePointProgressContentView *currentProgressView;

/// 默认的节点view的大小
@property (nonatomic,assign) CGSize pointViewSize;

/// 节点选中的策略
@property (nonatomic,assign) PYEBasePointProgressSelectedType selectedType;

/**
 节点view高亮的标准。 到达center.x + selectedCenterOffsetX 高亮
 */
@property (nonatomic,assign) CGFloat selectedCenterOffsetX;

/// 重新布局
- (void) relayoutViews;

/**
 获取 allPointViewArray 点亮 pointView range
 @param maxCount 最多有多少个pointView
 @return 点亮的range
 */
- (NSRange) getPointViewSelectedMaxCount: (NSInteger) maxCount;

注意

layer动画代理需要特殊处理:

#import "PYBaseAnimationProxy.h"
#import <objc/runtime.h>

@implementation PYBaseAnimationProxy

- (PYBaseAnimationProxy *) initWithTarget: (id)target {
    _target = target;
    objc_setAssociatedObject(target, (__bridge const void *)(self), self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    return self;
}

+ (PYBaseAnimationProxy *(^)(id))createWithTarget {
    return ^(id target) {
        return [[self alloc] initWithTarget:target];
    };
}

- (BOOL)respondsToSelector:(SEL)aSelector{
    return [self.target respondsToSelector:aSelector];
}

/**
 根据Invocation 调用方法
 @param invocation 消息发送的核心类
 */
- (void)forwardInvocation:(NSInvocation *)invocation{
    SEL sel = invocation.selector;
    if ([self.target respondsToSelector:sel]) {
        [invocation invokeWithTarget:self.target];
    }else{
        
    }
}


/**
 根据selector 生成方法签名,为创建NSInvocation做准备
 @param sel selector 选择器
 @return 方法签名
 */
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{
    if (self.target && [self.target respondsToSelector:sel]) {
        return [self.target methodSignatureForSelector:sel];
    } else {
        return [NSObject instanceMethodSignatureForSelector:@selector(init)];
    }
}
@end