0

ブロックコードを使用して、データを反映する水平プログレスバーを作成しています。データは何でもかまいません。最小値、最大値、およびアニメーションを設定できる現在の値 (つまり、最小値 0、最大値 100、現在の値 50) を取るだけで、プログレス バーは 50% いっぱいになります。内部にビューを含むプログレスバーコンテナーがあり、アニメーション中にビューが引き伸ばされます。

ブロックコードを使用してアニメーション部分を正常に動作させました。

[UIView animateWithDuration:3.0
                              delay:0.0f
                            options:UIViewAnimationCurveEaseInOut
                         animations:^(void)
         {
             progressView.frame = CGRectMake(progressView.frame.origin.x,progressView.frame.origin.y,iWidth,progressView.frame.size.height);

         }
                         completion:^(BOOL finished)
         {

         }]; 

私がやりたいのは、これがアニメーション化されている間、サブレイヤーを挿入してグラデーションをゆっくりと変更することです。簡単な例

    (This method will be called on a timer, the idea is to slowly change the gradient
    after 0.5 seconds for example)
    CAGradientLayer *testLayer = [BackgroundLayer customGradient:iRedValue :iGreenValue :0];
    testLayer.frame = progressView.bounds;
    [progressView.layer insertSublayer:testLayer atIndex:1];

(背景レイヤーは、ユーザーがRGB値を使用してカスタムグラデーションカラーを作成できるようにする、私が持っているカスタムクラスです)。アイデアは、progressView のアニメーションが終了するにつれて、グラデーションをゆっくりと変更しながらサブレイヤーを挿入し続けることです。アイデアは、ビューが 1 つの色 (たとえば緑) から始まり、バーに沿ってアニメーションが進むにつれて、色が琥珀色に変わり、最大値に達すると赤くなるというものです。

サブレイヤーを追加すると、アニメーションが最後までジャンプします。これは、アニメーションの終了後に testLayer が progressView の幅を取り、それを追加するためです。アニメーションの過程でこれをゆっくりと行いたいと思います。

これを行う方法についてのアイデアはありますか?

前もって感謝します!

4

1 に答える 1

2

colorsのAnimationgの小さな例CAGradientLayer

@interface GradientAnimationView : UIView

@end

@implementation GradientAnimationView {
    NSArray *_colorsFirst;
    NSArray *_colorsSecond;
    NSArray *_currentColor;
}

+ (Class)layerClass {
    return [CAGradientLayer class];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        CAGradientLayer *layer = (CAGradientLayer *)[self layer];
        _colorsFirst = @[(__bridge id)[[UIColor blueColor] CGColor], (__bridge id)[[UIColor greenColor] CGColor]];
        _colorsSecond = @[(__bridge id)[[UIColor redColor] CGColor], (__bridge id)[[UIColor yellowColor] CGColor]];
        _currentColor = _colorsFirst;
        [layer setColors:_colorsFirst];
    }
    return self;
}

- (void)animateColors {
    if (_currentColor == _colorsSecond) {
        _currentColor = _colorsFirst;
    } else {
        _currentColor = _colorsSecond;
    }

    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"colors"];
    anim.fromValue = [[self layer] valueForKey:@"colors"];
    anim.toValue = _currentColor;
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    anim.duration = 0.4;
    anim.delegate = self;

    [self.layer addAnimation:anim forKey:@"colors"];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self animateColors];
}

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    CAGradientLayer *layer = (CAGradientLayer *)[self layer];
    [layer setColors:_currentColor];
}

@end
于 2013-01-23T12:30:39.280 に答える