美文网首页计算机技术一锅炖
如何监听Core animation progress call

如何监听Core animation progress call

作者: 践行者 | 来源:发表于2015-12-23 12:20 被阅读337次

    思想步骤:
    1.首先创建继承CALayer子类TAProgressLayer,包含progress属性

    2.将TAProgressLayer添加到图层🌲上,并且添加动画,设置0<=progress<=1

    3.在drawInContext调用代理函数

    具体实现:
    '''javascript

    @protocol TAProgressLayerProtocol <NSObject>
    
    - (void)progressUpdatedTo:(CGFloat)progress;
    
    @end
    
    @interface TAProgressLayer : CALayer
    
    @property CGFloat progress;
    @property (weak) id<TAProgressLayerProtocol>  delegate;
    @end
    
    @implementation TAProgressLayer
    @implementation TAProgressLayer
    
    // We must copy across our custom properties since Core Animation makes a copy
    // of the layer that it's animating.
    
    - (id)initWithLayer:(id)layer
    {
    self = [super initWithLayer:layer];
    if (self) {
        TAProgressLayer *otherLayer = (TAProgressLayer *)layer;
        self.progress = otherLayer.progress;
        self.delegate = otherLayer.delegate;
    }
    return self;
    }
    
    // Override needsDisplayForKey so that we can define progress as being animatable.
    
    + (BOOL)needsDisplayForKey:(NSString*)key {
    if ([key isEqualToString:@"progress"]) {
        return YES;
    } else {
        return [super needsDisplayForKey:key];
    }
     }
    
    // Call our callback
    
    - (void)drawInContext:(CGContextRef)ctx
    {
        if (self.delegate)
        {
            [self.delegate progressUpdatedTo:self.progress];
        }
    }
    
    @end
    

    // We can then add the layer to our main layer:
    TAProgressLayer *progressLayer = [TAProgressLayer layer];
    progressLayer.frame = CGRectMake(0, -1, 1, 1);
    progressLayer.delegate = self;
    [_sceneView.layer addSublayer:progressLayer];
    And animate it along with the other animations:

    CABasicAnimation *anim = [CABasicAnimation   animationWithKeyPath:@"progress"];
     anim.duration = 4.0;
    anim.beginTime = 0;
    anim.fromValue = @0;
    anim.toValue = @1;
    anim.fillMode = kCAFillModeForwards;
    anim.removedOnCompletion = NO;
    [progressLayer addAnimation:anim forKey:@"progress"];
    
    '''

    相关文章

      网友评论

        本文标题:如何监听Core animation progress call

        本文链接:https://www.haomeiwen.com/subject/vplvhttx.html