0

UIView アニメーションを使用してアルファを変更することで「パルス」する単純な UIButton サブクラスを作成しています。私が抱えている問題は、ユーザーがボタンをタッチしたときにアルファを 1 (100%) に設定することです。アニメーションを一時停止して再開するコードがありますが、pauseAnimations の呼び出しの前後に不透明度を設定しても機能しないようです。

UIView のレイヤーでのアニメーションの一時停止/再開:

-(void)pauseAnimation {
    CFTimeInterval pausedTime = [self convertTime:CACurrentMediaTime()
                                        fromLayer:nil];
    self.speed = 0.0;
    self.timeOffset = pausedTime;
}

-(void)resumeAnimation {
    CFTimeInterval pausedTime = [self timeOffset];
    self.speed = 1.0;
    self.timeOffset = 0.0;
    self.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self convertTime:CACurrentMediaTime() 
                                            fromLayer:nil] - pausedTime;
    self.beginTime = timeSincePause;
}

UIButton サブクラスのコード:

-(id)initWithAnimationInterval:(NSTimeInterval)interval andMinimumAlpha:
(float)minimumAlpha andMaximumAlpha:(float)maximumAlpha {
    if ((self = [super init])) {
        _animationInterval = interval;
        _minimumAlpha = minimumAlpha;
        _maximumAlpha = maximumAlpha;

        self.alpha = self.minimumAlpha;

        [self addTarget:self action:@selector(buttonDown) 
                forControlEvents:UIControlEventTouchDown];
        [self addTarget:self action:@selector(buttonUp) 
                forControlEvents:UIControlEventTouchUpInside];
        [self addTarget:self action:@selector(buttonUp) 
                forControlEvents:UIControlEventTouchUpOutside];

        [self startAnimating];
    }

    return self;
}

-(void)startAnimating {
    [UIView animateWithDuration:self.animationInterval
                          delay:0
                        options:UIViewAnimationOptionAllowAnimatedContent | 
UIViewAnimationOptionAllowUserInteraction | 
UIViewAnimationOptionAutoreverse | 
UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionRepeat
                     animations:^{
                         self.alpha = self.maximumAlpha;
                     }
                     completion:^(BOOL finished) {

                     }];
}

-(void)buttonDown {
    [self.layer pauseAnimation];

    self.oldAlpha = self.alpha;
    self.alpha = self.maximumAlpha;
}

-(void)buttonUp {
    self.alpha = self.oldAlpha;
    [self.layer resumeAnimation];
}
4

2 に答える 2

0

アニメーションオプションからUIViewAnimationOptionRepeatを削除してみてください。そこで使用すると、アニメーションが無期限に繰り返されることを意味します。したがって、アニメーションが繰り返され続けるため、タイマーを停止することはできません。

NSTimerの使用について考えたことはありますか?それはより簡単なアプローチのようです。これが私がしたことです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [button addTarget:self action:@selector(buttonDown) forControlEvents:UIControlEventTouchDown];
    [button addTarget:self action:@selector(buttonUp) forControlEvents:UIControlEventTouchUpInside];
    [button addTarget:self action:@selector(buttonUp) forControlEvents:UIControlEventTouchUpOutside];

    [self startTimer];

}

- (void)startTimer {
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.4 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
}

- (void)stopTimer {
    [timer invalidate];
}

- (void)buttonDown {
    [self stopTimer];
    button.alpha = 1;
}

- (void)buttonUp {
    [self startTimer];
}

- (void)timerFired:(NSTimer *)timer {
    [UIView animateWithDuration:0.4
                          delay:0
                        options:UIViewAnimationOptionAllowAnimatedContent | 
     UIViewAnimationOptionAllowUserInteraction | 
     UIViewAnimationOptionAutoreverse | 
     UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         button.alpha = MIN_ALPHA;
                     }
                     completion:^(BOOL finished) {
                         button.alpha = 1;
                     }];
}

ボタンのサブクラスは使用しませんでしたが、簡単に移動できます。

お役に立てば幸いです。

于 2011-07-15T15:34:53.190 に答える
0

カスタムのコア アニメーション レイヤーを使用していない限り、一時停止と再開のメソッドを次のようにする必要があります ( http://developer.apple.com/library/ios/#qa/qa1673/_index.htmlから)。

-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}

そしてbutton.layer、CALayer として渡します。レイヤーを渡したくない場合は、self.speedとのような参照self.timeOffsetを変更self.layer.speedself.layer.timeOffsetます。これらのプロパティは、ボタン自体ではなく、レイヤーでのみ使用できるためです。

于 2011-07-15T15:36:35.650 に答える